Programme FORTRAN en C
FortranNoobs
-
cchristian Messages postés 928 Statut Membre -
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
==================================================
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
-
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. -
-
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 !