Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Résultats erronés Fortran 90



  1. #1
    ESTERMIQUE

    Résultats erronés Fortran 90


    ------

    Bonjour,

    J'essaie de faire tourner un code (méthode ADI) écrit en Fortran 90, en vue de simuler la conduction de la chaleur en régime stationnaire dans une plaque 2D.
    Le code est tel que :

    program main


    implicit none


    ! --- variables
    real :: h,l,Lo,Ha,Dt,rx,ry,zy,zx,wx,wy ,sx,sy
    parameter ( Lo=2e-2,Ha=2e-2,Dt=1e-2)
    integer :: i,j,n,k1,k2,,d,io,f

    real, dimension(100):: a1,b1,c1,a2,b2,c2,F2,F1,Tf1,Tf 2
    real, dimension(100,100) :: Td,T

    n=9
    k1=1
    k2=2
    f=n-1



    h= Lo*1./((n-1)*1.)
    l=Ha/((n-1)*1.)
    rx=Dt/(2.*(h**2))
    ry= Dt/(2.*(l**2))

    zy= (1.-(2.*ry))
    zx= (1.-(2.*rx))
    wx=(1.+(2.*rx))
    wy=(1.+(2.*ry))
    sx=2.*rx
    sy=2.*ry


    !---conditions aux bords & conditions initiales

    do j=1,n
    T(1,j)=1.
    Td(1,j)=1.
    enddo
    do j=1,n
    do i=2,n-1
    T(i,j)=0.
    enddo
    enddo
    do j=1,n
    Td(n,i)=0.
    T(n,i)=0.
    enddo



    !--- matrice de la première partie

    do i=2,f
    a1(i)= wx
    enddo
    do i=3,f
    b1(i)=-rx
    enddo
    do i=2,f-1
    c1(i)=-rx
    enddo


    !--- matrice de la deuxièmee partie
    do j=1,n
    a2(j)= wy
    enddo
    do j=2,n-1
    b2(j)=-ry
    enddo
    b2(n-1)=-sy

    c2(1)=-sy
    do j=2,n-1
    c2(j)=-ry
    enddo





    !---- boucle de temps

    do io=1,30




    !--- calcul de température dans le premier pas



    do j=1,n
    do i=2,f

    if(j.eq.1) then
    F1(i)= zy*T(i,1)+sy*T(i,2)

    else if(j.ne.n) then

    F1(i)= ry*T(i,j-1)+zy*T(i,j)+ry*T(i,j+1)
    else
    F1(i)= sy*T(i,n-1)+zy*T(i,n)
    endif

    enddo




    call thomas (k2,f,a1,b1,c1,F1,Tf1)



    do i=2,f
    Td(i,j)=Tf1(i)
    enddo

    enddo






    !--- calcul de température dans le deuxième pas



    do i1=2,f
    do j =1,n

    F2(j)= rx*Td(i1-1,j)+zx*Td(i1,j)+rx*Td(i1+1,j)

    enddo



    call thomas(k1,n,a2,b2,c2,F2,Tf2)


    do j=1,n
    T(i1,j)=Tf2(j)
    enddo
    enddo


    enddo



    !-- affichage des températures
    do j=1,n
    do i=1,n
    write(*,*) j,i,Td(i,j)
    enddo
    enddo



    ! --subroutine

    contains

    subroutine thomas(k,m,a,b,c,F,V)
    integer m,k
    real, dimension(m):: a,b,c,alpha,beta,y,F,V
    !--- boucle vecteur alpha(i), beta(i)


    alpha(k)=a(k)
    do i=k+1,m
    beta(i)=b(i)/alpha(i-1)
    alpha(i)=a(i)-beta(i)*c(i-1)
    enddo

    !--- boucle y(i)
    y(k)= F(k)
    do i=k+1,m
    y(i)= F(i)- (beta(i)*y(i-1))
    enddo
    !--- boucle T(i)
    V(m)=y(m)/alpha(m)
    do i=m-1,k,-1
    V(i)= ((y(i)-c(i)*V(i+1))/alpha(i))
    enddo

    return
    end subroutine

    end program


    Le programme tourne mais dès qu'il atteint la dernière valeur (ici par exemple n=7 ), il perd conscience
    Nom : unnamed.png
Affichages : 35
Taille : 157,1 Ko

    Quelqu'un pourrait m'expliquer quelle est le problème ?
    Merci d'avance

    -----

  2. #2
    LPFR

    Re : Résultats erronés Fortran 90

    Bonjour.
    Je n’ai pas envie de plonger dans le code, surtout qu’il n’est pas écrit de façon claire.
    Les indentations ne coûtent rien et facilitent la vie.

    Mais, par expérience (longue expérience), quand on cherche ce qui ne va pas, le plus souvent, ce n’est pas dans le code mais dans la physique (mal) utilisée qui se trouve l’erreur.
    Parfois l’erreur se trouve dans les conditions initiales qui sont impossibles physiquement. Cela fait disjoncter toutes les méthodes numériques.
    Au revoir.

  3. #3
    curieuxdenature

    Re : Résultats erronés Fortran 90

    Bonjour

    teste la routine avec 'double precision' à la place de 'real', j'ai vu pire comme embrouille.

    Mais bon,

    integer :: i,j,n,k1,k2, ,d,io,f -->une virgule en trop entre k2 et d
    real, dimension(100):: a1,b1,c1,a2,b2,c2,F2,F1,Tf1,Tf 2 --> un espace entre Tf et 2

    i1 n'est pas déclaré
    enfin, j'aurais placé une PAUSE avant que le programme ne se termine :

    enddo

    pause ---->

    ! --subroutine

    contains

    subroutine thomas(k,m,a,b,c,F,V)
    sinon, corrections faites, ça roule jusque n=9 sans problème.
    L'electronique, c'est fantastique.

Discussions similaires

  1. probleme d'affichage des résultats en fortran
    Par biskrie dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 26/10/2018, 17h27
  2. [Blanc] samsung rsa1ztpe affichages erronés
    Par popaye dans le forum Dépannage
    Réponses: 3
    Dernier message: 27/04/2016, 21h45
  3. comment utiliser les résultats d'un programme fortran dans un autre programme
    Par physicstudent dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 30/09/2010, 19h21
  4. Courbe d'etalonnage et resultats erronés
    Par mayangel dans le forum Chimie
    Réponses: 2
    Dernier message: 18/09/2007, 16h58