IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

Problème en Fotran


Sujet :

Fortran

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut Problème en Fotran
    Bonjour,
    Je travaille sur un code en fortran qui permet de calculer les concentrations de NO, NO2 et HNO2. Il calcule l'évolution de ces concentrations en fonction
    de l'épaisseur du lit catalytique que j'utilise et également la consommation de la fraction de sites catalytiques. La boucle est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    dowhile (i<=n)
            i=i+1  
    dXNO(i)=dz*(-G*k1*XNO(i)*XNO2(i)*XH2O+G*k1*XHNO2(i)**2)      
    dXNO2(i)=dz*(-G*k1*XNO(i)*XNO2(i)*XH2O+G*k1*XHNO2(i)**2)
    dXHNO2(i)=dz*G*(k1*XNO(i)*XNO2(i)*XH2O
         .          +k4*XH2O**2*(1-frac(i)))/(k2+k3*frac(i))     
    dfrac(i)=dt*(-k4*(1-frac(i))*XH2O**2+k3*frac(i)*XHNO2(i)**2)
    frac(i)=DMAX1(frac(i)-dt*dfrac(i),0.0D+00)
           XNO2(i+1)=XNO2(i)+dXNO2(i)
           XNO(i+1)=XNO(i)+dXNO(i)
           XHNO2(i+1)=XHNO2(i)+dXHNO2(i)
    enddo
    Le problème est qu'il ne tourne pas, il m'affiche le message suivant :
    parse error, unexpected end of statement, expecting EQV, or NEQv or ')'
    sur l'équation de dfrac(i).
    J'ai vérifié s'il manque une parenthèse ou autre, il y a rien qui manque et je ne sais pas pourquoi il me sort ce message d'erreur.

    Pourriez vous m'aider?

    Merci d'avance pour votre aide.

  2. #2
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Bonjour

    Petite remarque n'oublis pas les balise code (le # en haut) ça rend ton code plus lisible.

    Tu est en fortran 90 ou 77 ? La ligne juste avant celle de dfrac(i), ligne 5 et 6 semble coupée avec un . pour la commencer. Si tu es en Fortran 90 il faut enlever ce point et metre un & à la fin de la ligne précédente si tu veux la couper. Si tu est en F77, je ne suis pas sur que le . en colonne 6 pour annoncer une suite de ligne soit autorisé essaye avec un 1 ou une *.

    Bon courage

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut
    Merci pour votre réponse, mais j'ai vérifié, ça ne vient pas de ce point .

  4. #4
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Bonjour

    Le code suivant compile et s'éxécute sans erreur ... voilà ce que j'ai fait par rapport au tiens (mis à part la déclaration des variables).

    1) dowhile -> do while (je pense qu'il faut un espace)

    2) Tu gères mal la condition d'arret de ta boucle. Si tu fais while( i <= n ) il faut que tes tableaux soient de dimension n+2. En effet, pour i = n tu fais une nouvelle itération dans ta boucle qui commence par i=i+1 donc tu fais la dernière itération avec i = n+1. Donc si tes tableaux sont de dimensions n ça va coincer. Ensuite dans ta boucle tu utilises l'éléments i+1, donc encore une fois si tes tableaux sont de dimensions n il faut que tu t'arretes à i = n-1 ! Ceci dis je ne sais pas exactement ce que tu fais. Visiblement tu intégère un schéma cinétique mais j'en sais pas plus ...

    3) La ligne qui est coupée, comme ce que je t'ai donné est en fortran 90 j'ai mis un & à la fin de la ligne précédente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    program tt
     
      implicit none
      integer, parameter             :: n = 100
      integer                        :: i
      double precision               :: k1, k2, k3, K4
      double precision               :: dt, dz, G
      double precision               :: XH2O
      double precision, dimension(n) :: XNO, XNO2, XHNO2
      double precision, dimension(n) :: dXNO, dXNO2, dXHNO2
      double precision, dimension(n) :: dfrac, frac
     
      i = 0
      dz = 0.1d0
     
      XNO(:)   = 0.5d0
      XNO2(:)  = 0.3d0
      XHNO2(:) = 0.1d0
      XH2O     = 0.2d0
     
      k1 = 1.d0
      k2 = 1.d0
      k3 = 1.d0
      k4 = 1.d0
     
      G = 1.d0
     
      dt = 0.001d0
     
      do while (i<n-1)
        i=i+1  
        dXNO(i)=dz*(-G*k1*XNO(i)*XNO2(i)*XH2O+G*k1*XHNO2(i)**2)      
        dXNO2(i)=dz*(-G*k1*XNO(i)*XNO2(i)*XH2O+G*k1*XHNO2(i)**2)
        dXHNO2(i)=dz*G*(k1*XNO(i)*XNO2(i)*XH2O &
                +k4*XH2O**2*(1-frac(i)))/(k2+k3*frac(i))     
        dfrac(i)=dt*(-k4*(1-frac(i))*XH2O**2+k3*frac(i)*XHNO2(i)**2)
        frac(i)=DMAX1(frac(i)-dt*dfrac(i),0.0D+00)
        XNO2(i+1)=XNO2(i)+dXNO2(i)
        XNO(i+1)=XNO(i)+dXNO(i)
        XHNO2(i+1)=XHNO2(i)+dXHNO2(i)
      enddo
     
    end program tt

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut
    Bonjour,

    merci pour votre réponse.
    Je viens d'appliquer ce que m'avez dit et j'ai toujours le même problème.

  6. #6
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Là c'est étonnant ... peux tu mettre la ligne complete de compilation que tu utilises et le message d'erreur ?

    Essaye aussi en compilant uniquement ce que je t'ai donné pour voir.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut
    Voilà la partie que j'utilise après ce que vous m'avez dit :

    Program HPW

    Implicit none
    Integer*4 i,ii,n
    DOUBLE Precision dt,Vm,MNO2,MNO,XH2O,XO2,debit,mcat,rho,S,L,dz
    & ,cst1,tmax,MHNO2,yinfi,XNO0,kdes,t,time, nH,XNO20,K,XHNO20
    & ,k1,k2,k3,k4,Dv,G,F
    DOUBLE Precision frac, dfrac

    Dimension XNO(1000),dXNO(1000),XNO2(1000),dXNO2(1000),XHNO2(1000)
    & ,dXHNO2(1000),frac(1000),dfrac(1000)

    !--------------- Constantes --------------------

    ! nb d'intervalles
    n=100
    !intervalle de temps entre chaque mesures en s
    dt=3.0D+00
    Vm=24.0e-3
    MNO2=46e-3
    MNO=30e-3
    MHNO2=47.0e-3
    XH2O=0.03
    XO2=0.05D+00
    debit=2.5e-6
    !F=debit/Vm=2.5e-6/24e-3
    F=0.104e-3
    G=61.1538e-2
    mcat=400e-6
    !masse volumique apparente
    rho=2260 !330 1676
    S=3.14*(9e-3 / 2.0)**2

    L=mcat/(rho*S)
    dz=L/n
    Dv=debit
    !T=250øC

    ! nH=4.016e-4
    nH=4.016e-4*2260
    nH=0.907616D+00

    cst1=Vm*rho*S/Dv/(MNO2+MNO2)
    cst1=(24.0e-3*2260*0.000063617)/2.5e-6/92e-3
    cst1=15002.548
    tmax=11200
    XNO20=500e-6
    XNO0=500e-6
    !XHNO20=1000e-6

    K=k1/k2!frac(i)=1.0
    k1=9.9D+07 !!0.001 10 1 200(rapide rapide) 100(rapide)
    !k2=10 !!0.00001
    k2=1.0D+01 !!0.000001 0.0000001
    k3=12.6D+03
    k4=4.0D+00


    i=0
    Do while (i<n-1)
    i=i+1

    XNO2(i)=0
    XNO(i)=0
    XHNO2(i)=0
    dXNO2(i)=0
    dXNO(i)=0
    dXHNO2(i)=0
    frac(i)=1.0

    enddo
    XNO(1)=XNO0
    XNO2(1)=XNO20

    do while (i<n-1)
    i=i+1

    dXNO(i)=dz*(-G*k1*XNO(i)*XNO2(i)*XH2O+G*k1*XHNO2(i)**2)

    dXNO2(i)=dz*(-G*k1*XNO(i)*XNO2(i)*XH2O+G*k1*XHNO2(i)**2)

    dXHNO2(i)=SQRT(dz*G*((k1*XNO(i)*XNO2(i)*XH2O
    & +k4*XH2O**2*(1-frac(i))))/(k2+k3*frac(i))

    dfrac(i)=dt*(-k4*(1-frac(i))*XH2O**2+k3*frac(i)*XHNO2(i)**2)
    frac(i)=DMAX1(frac(i)-dt*dfrac(i),0.0D+00)
    XNO2(i+1)=XNO2(i)+dXNO2(i)
    XNO(i+1)=XNO(i)+dXNO(i)
    XHNO2(i+1)=XHNO2(i)+dXHNO2(i)

    enddo

    END program

    Le message d'erreur est le suivant : parse error, unexpected end of statement, expecting ')'

  8. #8
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Pour la ligne avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dXHNO2(i)=SQRT(dz*G*((k1*XNO(i)*XNO2(i)*XH2O &
     +k4*XH2O**2*(1-frac(i))))/(k2+k3*frac(i)))
    Il manquait une parenthèse pour fermer la parenthèse de sqrt. Sous des éditeurs comme vi ou emacs tu as des moyen assez pratiques pour controler si tu as trop ou pas assez de paires de parenthèse. Sous vi il faut mettre ceci dans un fichier .vimrc (que tu crées s'il n'existe pas) dans ton home.

    Pour ce qui est des coupures de lignes, il ne faut pas placer le & devant la ligne suivante mais à la fin de la ligne précédente. Regardes ici :

    http://fortran.developpez.com/faq/?p...ignetroplongue

    Une fois ces deux choses corrigés, les erreurs qui restent sont dues à des variables que tu n'as pas déclarées.

    Pour déboguer ton programme tu peux utiliser ce genre de commande qui sont assez utiles :

    ifort -o exe -g -traceback -check bounds -check uninit -warn unused test2.f90

    attention cependant ça ralentit sévèrement l'exécution.

    Voilà un programme qui compile chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    Program HPW
     
    Implicit none
    Integer*4 i,ii,n
    DOUBLE Precision dt,Vm,MNO2,MNO,XH2O,XO2,debit,mcat,rho,S,L,dz &
     ,cst1,tmax,MHNO2,yinfi,XNO0,kdes,t,time, nH,XNO20,K,XHNO20 &
     ,k1,k2,k3,k4,Dv,G,F, XNO2, XNO, XHNO2, dXNO2, dXNO, dXHNO2
    DOUBLE Precision frac, dfrac
     
    Dimension XNO(1000),dXNO(1000),XNO2(1000),dXNO2(1000),XHNO2(1000), &
     dXHNO2(1000),frac(1000),dfrac(1000)
     
    !--------------- Constantes --------------------
     
    ! nb d'intervalles
    n=100
    !intervalle de temps entre chaque mesures en s
    dt=3.0D+00
    Vm=24.0e-3
    MNO2=46e-3
    MNO=30e-3
    MHNO2=47.0e-3
    XH2O=0.03
    XO2=0.05D+00
    debit=2.5e-6
    !F=debit/Vm=2.5e-6/24e-3
    F=0.104e-3
    G=61.1538e-2
    mcat=400e-6
    !masse volumique apparente
    rho=2260 !330 1676
    S=3.14*(9e-3 / 2.0)**2
     
    L=mcat/(rho*S)
    dz=L/n
    Dv=debit
    !T=250øC
     
    ! nH=4.016e-4
    nH=4.016e-4*2260
    nH=0.907616D+00
     
    cst1=Vm*rho*S/Dv/(MNO2+MNO2)
    cst1=(24.0e-3*2260*0.000063617)/2.5e-6/92e-3
    cst1=15002.548
    tmax=11200
    XNO20=500e-6
    XNO0=500e-6
    !XHNO20=1000e-6
     
    K=k1/k2!frac(i)=1.0
    k1=9.9D+07 !!0.001 10 1 200(rapide rapide) 100(rapide)
    !k2=10 !!0.00001
    k2=1.0D+01 !!0.000001 0.0000001
    k3=12.6D+03
    k4=4.0D+00
     
     
    i=0
    Do while (i<n-1)
    i=i+1
     
    XNO2(i)=0
    XNO(i)=0
    XHNO2(i)=0
    dXNO2(i)=0
    dXNO(i)=0
    dXHNO2(i)=0
    frac(i)=1.0
     
    enddo
    XNO(1)=XNO0
    XNO2(1)=XNO20
     
    do while (i<n-1)
    i=i+1
     
    dXNO(i)=dz*(-G*k1*XNO(i)*XNO2(i)*XH2O+G*k1*XHNO2(i)**2)
     
    dXNO2(i)=dz*(-G*k1*XNO(i)*XNO2(i)*XH2O+G*k1*XHNO2(i)**2)
     
    dXHNO2(i)=SQRT(dz*G*((k1*XNO(i)*XNO2(i)*XH2O &
     +k4*XH2O**2*(1-frac(i))))/(k2+k3*frac(i)))
     
    dfrac(i)=dt*(-k4*(1-frac(i))*XH2O**2+k3*frac(i)*XHNO2(i)**2)
    frac(i)=DMAX1(frac(i)-dt*dfrac(i),0.0D+00)
    XNO2(i+1)=XNO2(i)+dXNO2(i)
    XNO(i+1)=XNO(i)+dXNO(i)
    XHNO2(i+1)=XHNO2(i)+dXHNO2(i)
     
    enddo
     
    END program
    Fait attention, je me suis apperçu que tu utilses k1 avant de la définir !! Et n'oublie pas que réussir à compiler un programme ne signifie pas qu'il fonctionne !

  9. #9
    Membre émérite Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Par défaut
    il manque une parenthèse à cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dXHNO2(i)=SQRT(dz*G*((k1*XNO(i)*XNO2(i)*XH2O
         &          +k4*XH2O**2*(1-frac(i))))/(k2+k3*frac(i))
    de plus le . en 6ième colonne, cela fonctionne parfaitement en F77 même sur SGI (vu que je l'utilise)

    deux solution... soit tu vire l'une des deux parenthèse entre G* et k1 (prem ligne) soit tu rajoute ) avant /

    p.s. 'parse error' signifie erreur stupide c'est bien souvent un oubli de syntaxe...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut
    Merci beaucoup pour vos réponses et votre aide.

    Bonne journée.

  11. #11
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Par curiosité, je suppose que les XNO2 ect ... sont les concentrations de tes molécules, que les dXNO2 ect ... les variations pendant dt et que l'indice i de tes tableaux est le temps. Dans tes équations il intervient XH2O qui n'est pas un tableau.

    La concentration de l'eau est donc constente dans le temps ?

    Dans ce cas est ce que tu étudies cette réaction en phase aqueuse ? Si oui généralement la concentration de l'eau n'intervient pas dans la cinétique (activité égale à 1).

    Quel est le problème que tu résout numériquement ? C'est qu'elle réaction chimique et sous qu'elle condition ?

    Si tu en as la possibilité j'aimerais bien récuperer ton code une fois qu'il marchera ça pourrait m'être utile.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut
    J'étudie l'évolution de concentrations de NO, NO2, et HNO2 en fonction du temps. La concentration de H2O est constante car c'est en large excès.
    C'est en phase gaz ce que j'étudie, l'adsoprtion et désoprtion de NOx (piège à NOx) en présence d'un catalyseur solide.
    Pour l'instant mon code ne fonctionne pas, je vous tiens au courant.

Discussions similaires

  1. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  2. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. Réponses: 6
    Dernier message: 25/03/2002, 21h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo