Я хотел бы знать, что делает следующий код FORTRAN 77 - PullRequest
1 голос
/ 25 июня 2009

В .f файле есть код, который делает это:

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

Боб представляется функцией, но в начале файла она объявлена ​​как действительная.

Тогда есть .d файл, который имеет ссылку на Боба. Также я знаю, что авар содержит значение, которое, по-видимому, интерполируется, проблема в том, что интерполяция не всегда верна.

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 

Это весь устаревший код. Я не писал это. Я пытаюсь это исправить. Мой вопрос состоит из следующего:

Что это делает и как? Что такое файл .d?

Я думаю, что он пытается интерполировать, но я не думал, что вы могли бы сделать это (таким образом) с FORTRAN 77.

Ответы [ 4 ]

1 голос
/ 25 июня 2009

Похоже, что файл .d содержит некоторые данные, которые почти линейны. Похоже на экспериментальные данные. 35 - это количество очков, которое у вас есть, затем у вас есть х, а затем у.

Боб и Джон кажутся чем-то вроде строковых маркеров или идентификаторов. Они, вероятно, используются где-то в коде, чтобы решить, что делать с данными или какие данные они представляют.

Боб выглядит как функция. Обратите внимание, что у вас есть два способа объявления функции.

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

Одним из них является явный случай (foo), в котором вы возвращаете значение путем присвоения переменной, названной самой функцией. Другой случай "неявный" (не знаю формального имени), см. Бар. Вы объявляете его как «массив», а затем выражаете его поведение. Видел это очень редко, но это очень компактный текст.

1 голос
/ 25 июня 2009

Похоже, что Боб - это функция, которая получает действительное значение, переданное 8.3, и возвращает реальное значение, которое хранится в avar. Но это все, что можно почерпнуть из кода, который вы опубликовали.

0 голосов
/ 30 июня 2009

.d-файл - это, вероятно, какой-то допинг-способ аббревиатуры .dat. Он был слишком ленив, чтобы набрать два лишних символа. Старые программисты были такими.

Похоже, у вас есть простая интерполяционная функция на графике, где "Bob" - это ось X, охватывающая от -17 до +17, а "John" - набор значений в направлении Y, соответствующих точкам Боба. , (Не знаю, для чего 35, так как показаны только 32 балла.)

Код запрашивает: для значения по оси X, 8,3, какое будет интерполированное значение в направлении Y. В линейной форме он вернул бы .3 раза разницу между 1.413 и 1.479. Это может быть интерполятор более высокого порядка, но вы не показываете код, поэтому я предполагаю самый простой.

0 голосов
/ 25 июня 2009

Извините за путаницу. Ответ заключается в том, что система использует проприетарную макрос c для программы FORTRAN, которая выполняет интерполяцию. Это происходит в файле make. Я нашел, посмотрев некоторые неясные документы. Спасибо всем за их вклад. Извините снова за краткость этого. Я не пытался быть трудным. Меня смущало то, что я видел. Иногда бывает трудно работать с 30-летним устаревшим кодом, купленным у другой компании. Я новичок в Фортране, поэтому я подумал, что не вижу то, что мне следовало бы видеть, как языковую функцию, с которой я не был знаком. Я чувствую себя глупо Это заставило меня копать глубже. Урок выучен.

...