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
==================================================
A voir également:
- Programme FORTRAN en C
- Programme demarrage windows - Guide
- Mettre en veille un programme - Guide
- Programme word gratuit - Guide
- Message programmé iphone - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
3 réponses
Bonjour,
Voici quelques remarques sur cette portion de code Fortran :
Cordialement.
Cchristian.
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.