Pregunta

En un archivo .f hay un código que hace esto:

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

Bob parece ser una función, pero se declara al principio del archivo como real.

Luego hay un archivo .d que tiene una referencia a Bob. También sé que avar tiene un valor que parece estar interpolado. El problema es que la interpolación no siempre es correcta.

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 

Todo esto es código heredado. Yo no lo escribi. Estoy tratando de arreglarlo. Mi pregunta consiste en lo siguiente:

  

¿Qué está haciendo esto y cómo? ¿Qué es un archivo .d?

Creo que está tratando de interpolar, pero no pensé que pudieras hacer esto (de esta manera) con FORTRAN 77.

¿Fue útil?

Solución 3

Perdón por la confusión. La respuesta es que el sistema está utilizando una macro propietaria c para el programa FORTRAN que hace interpolación. Esto sucede en el archivo make. Encontré mirando alguna documentación oscura. Gracias a todos por su entrada. Perdón por la brevedad de la misma. No estaba tratando de ser difícil. También me confundió con lo que vi. A veces es difícil trabajar con código heredado de 30 años comprado en una compañía diferente. Soy nuevo en FORTRAN, así que pensé que no estaba viendo algo que debería haber visto como una característica del idioma con la que no estaba familiarizado. Me siento tonto Me llevó a cavar más profundo. Lección aprendida.

Otros consejos

Parece que Bob es una función, que le está pasando el valor real 8.3, y le devuelve un real almacenado en avar. Pero eso es todo lo que se puede deducir del código que ha publicado.

Parece que el archivo .d contiene algunos datos que son casi lineales. Parece datos experimentales. 35 es el número de puntos que tienes, luego tienes la x, y luego la y.

Bob y John parecen ser algún tipo de marcadores de cadena o identificadores. Probablemente se usan en algún lugar del código para decidir qué hacer con los datos, o qué tipo de datos representan.

Bob parece una función. Tenga en cuenta que tiene dos formas de declarar una función.

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

Uno es el caso explícito (foo), donde devuelve el valor al asignar a la variable nombrada como la función misma. El otro caso es "implícito" (no sé el nombre formal), ver barra. Lo declaras como una "matriz" y luego expresar cómo debe comportarse. Lo vi muy raramente, pero es una escritura muy compacta.

Un archivo .d es probablemente una forma de droga de abrir .dat. Era demasiado vago para escribir los dos caracteres adicionales. Los programadores de antaño eran así.

Parece que tiene una función de interpolación simple en un gráfico donde '' Bob '' es el eje X que abarca de -17 a +17 y "John" es un conjunto de valores en la dirección Y correspondiente a los puntos Bob. (No sé para qué sirve el 35, ya que solo se muestran 32 puntos).

El código pregunta: para un valor en el eje X, 8.3, cuál sería el valor interpolado en la dirección Y. En la forma lineal, devolvería 0,3 veces la diferencia entre 1,413 y 1,479. Podría ser un interpolador de orden superior, pero no muestra el código, por lo que supongo que es el más simple.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top