Programme FORTRAN en C

FortranNoobs -  
cchristian Messages postés 928 Statut Membre -
Bonjour,

j'ai un petit problème, je connais absolument pas le FORTRAN et je voulais savoir si quelqu'un pouvait m'aider à traduire ce code en C ou C++ ou au moins m'expliquer les grandes lignes. Ce code est censé résoudre un système d'équations différentielles.

Merci pour vos réponses.

=====================================================

NN=250000

c

time=140.0d0

dt=time/dble(float(NN))

c

c

c starting values for active en0, nonactive en1 and daughter endd

c

c

eN0=1.0d0

eN1=0.000002d0

endd=3.0d0/100.0d0*eN0

do k=1,NN

t=dble(float(k))*dt

c

w=0.885d0

ff=p*(1.0d0+1.0d0*cos(w*t))

c

dn0=-(p_ec+p_loss+p_bp+ff)*eN0+p_01*eN1

dn0=dn0*dt

c

dn1=ff*eN0-(p_01+p_bp+p_loss)*eN1

dn1=dn1*dt

c

dnd=p_ec*eN0-p_loss*endd

dnd=dnd*dt

c

eN0=en0+dn0

eN1=eN1+dn1

endd=endd+dnd

enddo

==================================================
Configuration: Windows XP
Firefox 3.0.10

3 réponses

  1. cchristian Messages postés 928 Statut Membre 131
     
    Bonjour,

    Voici quelques remarques sur cette portion de code Fortran :

    C      Dans un programme Fortran, si l'option IMPLICIT NONE n'est pas
    C         active, toutes les variables dont la première lettre est I,J,
    C         K,L,M, ou N sont considérées de type INTEGER*4 (représentation 
    C         interne sur 4 octets). 
    C         Les autres variables sont considérées REAL*4 (représentation
    C         intene sur 4 octets). Ici NN=25000 aurait très bien pu être  
    C         défini de la manière suivante : INTEGER NN    /250000/
    C         Dans cet extrait de programme Fortran l'option IMPLICIT NONE 
    C         n'est vraisemblablement pas activée. 
            NN=250000 
    
    	print *, time
    	pause
    
    C      Ici les variables time et dt sont des variable de type REAL*8 car 
    C       le paramètre d ou (D) = double précision est codé dans la partie
    C       fractionnaire. Il induit le type REAL*8 (représentation interne
    C       sur 8 octets).
            time=140.0d0 
    C       Pour la compatibilité du calcul NN est converti en REAL*4 grâce
    C       à la fonction intrinsèque FLOAT.
            dt=time/dble(float(NN)) 
    
    c 
    c 
    c starting values for active en0, nonactive en1 and daughter endd 
    c 
    c 
              eN0=1.0d0 
    
              eN1=0.000002d0 
    
              endd=3.0d0/100.0d0*eN0 
    
    C      Boucle équivalente à une boucle FOR (k = 1, k < NN; k++) { .....
              do k=1,NN    
    
              t=dble(float(k))*dt 
    
              w=0.885d0 
    
    C      Fonction intrinsèque COSinus. 
              ff=p*(1.0d0+1.0d0*cos(w*t)) 
    
    C     Opérations classiques :
              dn0=-(p_ec+p_loss+p_bp+ff)*eN0+p_01*eN1 
    
              dn0=dn0*dt 
    
              dn1=ff*eN0-(p_01+p_bp+p_loss)*eN1 
    
              dn1=dn1*dt 
    
              dnd=p_ec*eN0-p_loss*endd 
    
              dnd=dnd*dt 
    
              eN0=en0+dn0 
    
              eN1=eN1+dn1 
    
              endd=endd+dnd 
    
    C         équivalent: "}" d'une boucle FOR.
              enddo 

    Cordialement.

    Cchristian.
    0
  2. FortranNoobs
     
    Merci pour votre réponse. Cela m aide beaucoup.
    0
  3. cchristian Messages postés 928 Statut Membre 131
     
    Bonsoir,

    Merci pour le retour. Si dans la limite de mes connaissances en Fortran je peux vous aider davantage, ça sera avec plaisir. Mais pour les équations, qu'elles soient différentielles ou non, ne comptez pas sur moi.
    Bon courage !
    0