Bonjour à tous,
Je travaille actuellement sur un code en fortran permettant de résoudre l'équation de diffusion 1D. Plus particulièrement la température, avec un barreau de taille L.
Le code compile bien mais j'ai apparemment une erreur de segmentation...étant débutant sur fortran j'ai cherché des renseignements sur internet mais je n'arrive pas à trouver mon erreur.
Voici le code avec les différentes subroutines :
Code:PROGRAM temp_barre USE caracteristique MODULE caracteristique IMPLICIT NONE TYPE donnees REAL::a,l,tmax,T0 INTEGER::k END TYPE donnees TYPE vect INTEGER::n REAL, DIMENSION(20)::u END TYPE vect END MODULE caracteristique IMPLICIT NONE TYPE(vect)::w,v TYPE(donnees)::d1 REAL::dt,dx,cl0,cll,R INTEGER::j,i,n CALL prob_physique SUBROUTINE prob_physique(d1) USE caracteristique IMPLICIT NONE TYPE(donnees)::d1 PRINT *, 'Veuillez preciser la diffusivite thermique a' READ *, d1%a PRINT *, 'Veuillez preciser le nombre de point' READ *, d1%k PRINT *, 'Veuillez preciser la longueur du domaine' READ *, d1%l PRINT *, 'Veuillez preciser sur combien de temps le calcul doit se faire' READ *, d1%tmax PRINT *, 'Température initiale dans la barre' READ *, d1%T0 END SUBROUTINE prob_physique !Calcul du pas en temps! dx=(d1%l)/(d1%k) dt=(R)*dx**2/(d1%a) n=ceiling(d1%tmax/dt) !Vérification de la stabilité du problème! dx=(d1%l)/(d1%k) dt=(d1%tmax)/(n) R=(d1%a*dt)/(dx**2) IF (0<R) THEN IF (2*R<1) THEN PRINT *, 'Le probleme est stable' ELSE PRINT *, 'Attention le probleme est instable !' END IF END IF !Initialisation! DO i=1,(d1%k) w%u(i)=d1%T0 END DO !Boucle en temps + appel de la boucle d'espace! DO j=2,n CALL etape SUBROUTINE etape(d1,w,v,R) USE caracteristique IMPLICIT NONE INTEGER::j REAL,INTENT(IN)::R TYPE(vect),INTENT(IN)::w TYPE(vect),INTENT(OUT)::v TYPE(donnees),INTENT(IN)::d1 !Boucle en espace à un temps t données! !Le vecteur v correspond à la température à l'instant t+dt! !Le vecteur w correspond à la température à l'instant t! !Conditions aux limites! w%u(1)=cl0(d1%tmax) w%u(d1%k)=cll(d1%tmax) !Les cl0 et cll sont définies à l'aide d'un sous-programme de type fonction! DO j=2,(d1%k)-1 v%u(j)=w%u(j)+(R)*w%u(j-1)+(R)*w%u(j+1)-2*(R)*w%u(j) END DO END SUBROUTINE etape v%u(j+1)=w%u(j) END DO CALL affichage SUBROUTINE affichage(d1,v) USE caracteristique IMPLICIT NONE TYPE(donnees), INTENT(IN)::d1 TYPE(vect), INTENT(IN)::v PRINT *, v%u(d1%k) END SUBROUTINE affichage END PROGRAM temp_barre
L'erreur semble apparaitre directement après la première question de la subroutine prob_phy...lors de l'exécution du programme, je peux rentrer la valeur de a et l'erreur apparait...
Merci d'avance pour ceux qui ont le courage de regarder mon problème,
Benjamin.
-----