Question

Dans un fichier .f, il y a du code qui fait ceci:

real Bob, avar
...
avar = Bob( 8.3 )
...

Bob semble être une fonction mais elle est déclarée au début du fichier comme une vraie.

Ensuite, il existe un fichier .d qui fait référence à Bob. Aussi, je sais que avar contient une valeur qui apparaît interpolée. Le problème est que l’interpolation n’est pas toujours correcte.

Bob    John      35
-17.     -16.     -15.     -14.     -13.     -12.     -11.     -10.     -9.      -8.  
-7.      -6.      -5.      -4.      -3.      -2.      -1.       0.       1.       2.5  
 3.       4.       5.       6.5      7.       8.       9.       10.      11.      12.  
 13.      14.      15.      16.      17.  
 0.001    0.001    0.041    0.098    0.155    0.213    0.27     0.327    0.384    0.441   
 0.499    0.556    0.613    0.670    0.728    0.785    0.844    0.904    0.965    1.058   
 1.089    1.152    1.216    1.314    1.347    1.413    1.479    1.543    1.609    1.670   
 1.733    1.799    1.860    1.925    1.937 

Ceci est tout le code hérité. Je ne l'ai pas écrit. J'essaye de le réparer. Ma question comprend les éléments suivants:

  

Qu'est-ce que cela fait et comment? Qu'est-ce qu'un fichier .d?

Je pense que vous essayez d’interpoler, mais je ne pensais pas que vous pouviez le faire (de cette façon) avec FORTRAN 77.

Était-ce utile?

La solution 3

Désolé pour la confusion. La réponse est que le système utilise une macro propriétaire c au programme FORTRAN qui effectue une interpolation. Cela se produit dans le fichier make. J'ai trouvé en regardant une documentation obscure. Merci à tous pour leur contribution. Désolé encore pour la petitesse de celui-ci. Je n'essayais pas d'être difficile. C'était déroutant pour moi avec ce que j'ai vu aussi. Il est parfois difficile de travailler avec des codes hérités de 30 ans achetés auprès d'une autre société. Comme je suis nouveau sur FORTRAN, j’ai pensé que je ne voyais pas quelque chose que j’aurais dû voir comme une fonction linguistique que je ne connaissais pas bien. Je me sens idiot. Cela m'a amené à creuser plus profondément. Leçon apprise.

Autres conseils

On dirait que Bob est une fonction, qui reçoit la valeur réelle 8.3 qui lui est transmise et qui retourne un réel qui est stocké dans avar. Mais c’est tout ce qui peut être tiré du code que vous avez posté.

On dirait que le fichier .d contient des données presque linéaires. Ressemble à des données expérimentales. 35 est le nombre de points que vous avez, alors vous avez le x, puis le y.

Bob et John semblent être comme une sorte de marqueur de chaîne, ou d’identifiant. Elles sont probablement utilisées quelque part dans le code pour décider quoi faire des données ou du type de données qu’elles représentent.

Bob semble être une fonction. Veuillez noter que vous avez deux façons de déclarer une fonction.

real function foo(a)
    implicit none
    real, intent(in) :: a
    foo = 3.0+a
end function

program test
   implicit none
   real foo, bar, a, b
   bar(b) = b+5.0

   a=foo(5.3)
   print *, a, bar(2.3)
end program

Le premier est le cas explicite (foo), dans lequel vous renvoyez la valeur en affectant la variable nommée en tant que fonction. L'autre cas est "implicite". (Je ne connais pas le nom officiel), voir barre. Vous le déclarez comme un "tableau". et ensuite exprimer comment il devrait se comporter. Vu très rarement, mais c'est une écriture très compacte.

Un fichier .d est probablement un moyen pour une dope d’abriter .dat. Il était trop paresseux pour taper les deux caractères supplémentaires. Les vieux programmeurs étaient comme ça.

Il semble que vous ayez une fonction d'interpolation simple sur un graphique où "Bob". est l’axe des X compris entre -17 et +17 et le mot "John" est un ensemble de valeurs dans la direction Y correspondant aux points de Bob. (Je ne sais pas à quoi sert le 35, car seuls 32 points sont affichés.)

Le code demande: pour une valeur sur l’axe X, 8.3, quelle serait la valeur interpolée dans la direction Y. Sous forme linéaire, il renverrait 0,3 fois la différence entre 1,413 et 1,479. Ce pourrait être un interpolateur d’ordre supérieur, mais vous n’affichez pas le code, je suppose donc le plus simple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top