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 :

Je vous demande un service


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Je vous demande un service
    Bonjour à toutes et à tous,

    Je souhaiterais faire un programme de calcul de déclinaison magnétique en pascal et en java. Pour cela, je dispose d'un source en Fortran.

    Je n'arrive pas à charger de compilateur Fortran sur mon PC.

    Le service que je vous demande est de compiler le programme donné par le lien ci-dessus et de vérifier, au final, que lorsqu'on entre une position (latitude et longitude) et une date, le programme donne bien la déclinaison magnétique du lieu indiqué ainsi que sa variation annuelle.

    Exemple : pour une longitude de 53° ouest et une latitude de 3.5 ° nord, à la date d'aujourd'hui, la déclinaison de ce lieu est de l'ordre de -18.13° avec une variation annuelle de 0.02°.

    Je vous remercie par avance pour ce service que vous me rendrez.

    Cordialement.

    Pierre

  2. #2
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Bon, j'ai réussi à installer le compilateur g95. C'était d'une simplmicité biblique. Ca ne prend qu'une poignée de Mo et mon programme s'est compilé en moins de deux.

    Pour autant, j'ai un problème de syntaxe pour traduire mon programme dans un autre langage. Voici le morceau de code qui me chagrine :

    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
          if (date.lt.1995.0) then
           nmx   = 10
           nc    = nmx*(nmx+2)
           ll    = nc*ll
           kmx   = (nmx+1)*(nmx+2)/2
          else
           nmx   = 13
           nc    = nmx*(nmx+2)
           ll    = 0.2*(date - 1995.0)
     
    c     19 is the number of SH models that extend to degree 10
     
           ll    = 120*19 + nc*ll
           kmx   = (nmx+1)*(nmx+2)/2
          endif
          tc    = 1.0 - t
          if (isv.eq.1) then
           tc = -0.2
           t = 0.2
          end if
          go to 2
     
        1 t     = date - 2010.0
          tc    = 1.0
          if (isv.eq.1) then
           t = 1.0
           tc = 0.0
          end if
     
    c     pointer for last coefficient in pen-ultimate set of MF coefficients...
     
          ll    = 2865
          nmx   = 13
          nc    = nmx*(nmx+2)
          kmx   = (nmx+1)*(nmx+2)/2
        2 r     = alt
          one   = colat*0.017453292
          ct    = cos(one)
          st    = sin(one)
          one   = elong*0.017453292
          cl(1) = cos(one)
          sl(1) = sin(one)
    On voit en ligne 15 un "endif", en un seul mot qui termine un "if" situé à la première ligne.

    Plus loin, à la ligne 20, on trouve un "end if" en deux mots cette fois. Y a-t-il une différence dans les fonctionnalités qui en découlent ?

    Puis en ligne 21 on touve un "go to 2" qui envoie un peu plus loin dans le code (à la ligne 36). Ce que je ne comprends pas est que si ce "go to" n'est pas lié au "end if" qui le précède, alors tout le code qui est situé entre ce "go to" et le point où il envoie n'est jamais utilisé ???

    Pouvez-vous éclairer ma lanterne à ce sujet ?

    Merci de votre aide.

    Pierre

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Bonjour,

    Non, il n'y a pas de différences entre "endif" et "end if".

    Pour ce qui est du "goto 2", oui il ferra "sauter" la partie de code entre le "goto 2" et la ligne 36.
    Mais attention, il y a peut-être un "goto 1" (ou un "go to 1") quelque part ailleurs dans le code qui renverrai alors à la ligne 23 , faisant exécuter ce bloc d'instructions (et celles qui suivent, bien évidement).

    Bonne continuation.

  4. #4
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Merci Ehouarn pour cette précision.

    J'aurais plusieurs questions sur ce code.

    Vers la fin, il y a ce qui suit :

    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
    c     computation of Schmidt quasi-normal coefficients p and x(=q)
    c
          p(1)  = 1.0
          p(3)  = st
          q(1)  = 0.0
          q(3)  =  ct
          do 10 k=2,kmx                                                       
           if (n.ge.m) go to 4
           m     = 0
           n     = n + 1
           rr    = rr*ratio
           fn    = n
           gn    = n - 1
        4  fm    = m
           if (m.ne.n) go to 5
           if (k.eq.3) go to 6
           one   = sqrt(1.0 - 0.5/fm)
           j     = k - n - 1
           p(k)  = one*st*p(j)
           q(k)  = one*(st*q(j) + ct*p(j))
           cl(m) = cl(m-1)*cl(1) - sl(m-1)*sl(1)
           sl(m) = sl(m-1)*cl(1) + cl(m-1)*sl(1)
           go to 6                                                           
        5  gmm    = m*m
           one   = sqrt(fn*fn - gmm)
           two   = sqrt(gn*gn - gmm)/one
           three = (fn + gn)/one
           i     = k - n
           j     = i - n + 1
           p(k)  = three*ct*p(i) - two*p(j)
           q(k)  = three*(ct*q(i) - st*p(i)) - two*q(j)
    c
    c     synthesis of x, y and z in geocentric coordinates
    c
        6  lm    = ll + l
           one   = (tc*gh(lm) + t*gh(lm+nc))*rr                                     
           if (m.eq.0) go to 9                                                      
           two   = (tc*gh(lm+1) + t*gh(lm+nc+1))*rr
           three = one*cl(m) + two*sl(m)
           x     = x + three*q(k)
           z     = z - (fn + 1.0)*three*p(k)
           if (st.eq.0.0) go to 7
           y     = y + (one*sl(m) - two*cl(m))*fm*p(k)/st
           go to 8
        7  y     = y + (one*sl(m) - two*cl(m))*q(k)*ct
        8  l     = l + 2
           go to 10
        9  x     = x + one*q(k)
           z     = z - (fn + 1.0)*one*p(k)
           l     = l + 1
       10 m     = m + 1
    c
    c     conversion to coordinate system specified by itype
    c
          one   = x
          x     = x*cd +   z*sd
          z     = z*cd - one*sd
          f     = sqrt(x*x + y*y + z*z)
    c
          return
    c
    en ligne 7, on y voit l'initialisation d'une boucle où k varie de 2 à kmx. Problème : je ne vois pas où est la fin de cette boucle (pas de "enddo"), si ce n'est que l'indentation du code à la ligne 51 revient à ce qu'elle était avant l'initialisation de la boucle. Où est réellement la fin de cette boucle ? La ligne 51 en fait-elle partie ?

    Merci de votre aide.

    Pierre

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Bonjour,

    Citation Envoyé par ChPr Voir le message
    en ligne 7, on y voit l'initialisation d'une boucle où k varie de 2 à kmx. Problème : je ne vois pas où est la fin de cette boucle (pas de "enddo"), si ce n'est que l'indentation du code à la ligne 51 revient à ce qu'elle était avant l'initialisation de la boucle. Où est réellement la fin de cette boucle ? La ligne 51 en fait-elle partie ?
    Oui, cette boucle ce fini bien à la ligne 57; c'est du "vieux" Fortran, où le "enddo" est remplacé par l'étiquette (le nombre) associé au "do".
    Les instructions sur la ligne de l'étiquette font partie de la boucle et sont donc exécutées à chaque itération.

    Bon courage pour la suite (je compatis, ce code est hélas assez archaïque et peu lisible, mais bon, au moins il contient quelques commentaires)

  6. #6
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Ehouarn Voir le message
    Bonjour,
    Oui, cette boucle ce fini bien à la ligne 57; c'est du "vieux" Fortran, où le "enddo" est remplacé par l'étiquette (le nombre) associé au "do".
    Les instructions sur la ligne de l'étiquette font partie de la boucle et sont donc exécutées à chaque itération.
    Si je m'en réfère à ce que tu dis, la boucle se termine en ligne 51 (comprise) car l'étiquette 10 (du "do" de la ligne 7) se retrouve à la ligne 51.

    Citation Envoyé par Ehouarn Voir le message
    Bon courage pour la suite (je compatis, ce code est hélas assez archaïque et peu lisible, mais bon, au moins il contient quelques commentaires)
    Merci , je me suis bien amusé avec les tableaux couverts par le tableau "equivalence" gh. Je ne connaissais pas ce truc ; utile à l'époque où la mémoire était une denrée rare.

    Au final, ce qui m'a le plus ennuyé, c'est la transposition des "go to" en "if the else" car, après la transposition en Pascal, mon but ultime était la transposition en Android (du Java, quoi !), là où le "go to" n'existe plus.

    Cordialement.

    Pierre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Petit service a vous demander
    Par voyageurdumonde dans le forum Langage
    Réponses: 3
    Dernier message: 01/10/2011, 10h44
  2. Réponses: 0
    Dernier message: 19/07/2009, 20h04
  3. Demande de service : compilation Linux
    Par LadyWasky dans le forum Langage
    Réponses: 0
    Dernier message: 16/10/2007, 23h47
  4. Wrappez vous les web services ?
    Par zekey dans le forum Services Web
    Réponses: 2
    Dernier message: 05/03/2007, 21h25
  5. Réponses: 4
    Dernier message: 18/11/2004, 13h26

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