Запись массивов устраняет проблему по неизвестной мне причине. - PullRequest
2 голосов
/ 20 июня 2019

Когда я запускаю определенные программы, используя FORTRAN 77 с компилятором GNU gfortran, я сталкивался с одной и той же проблемой несколько раз и надеюсь, что у кого-то есть понимание. Значение, которое я хочу, должно быть ~ 1, но в конце программы оно записывается как нечто более 10 ^ 100. Это вообще проблема, ограниченная массивами для меня. Неправильное значение часто исчезает, когда я записываю это значение на каком-то этапе в программе раньше (что неизбежно случается при попытке устранить проблему).

Я пытался явно инициализировать массивы и пробовал некоторые проверки границ массивов, а также некоторые внутренние логические проверки в моей программе. Проблема, для меня и моего научного руководителя, кажется патологической.

      WRITE(*,*)"OK9999", INV,INVV

против

      WRITE(*,*)"OK9999", INV,INVV,NP,I1STOR(NP),I2STOR(NP)

Первый дает неверные результаты для того, что я ожидал бы для переменных INV и INVV, последний правильный. Это «новейший» пример этой проблемы, которая меня окружала около года.

Большой контекст этих строк:

  WRITE(*,*)"AFTER ENERGY",I1STOR(1),I2STOR(1)
  DO 167 NP=1!,NV

    IF(I1STOR(NP).NE.0) THEN
      INV = I1STOR(NP)
      INVV = I2STOR(NP)
      WRITE(*,*)"OK9999", INV,INVV,NP,I1STOR(NP),I2STOR(NP)
      PAUSE
    ENDIF

I1STOR (1) и I2STOR (1) написаны правильно в первом случае «ПОСЛЕ ЭНЕРГИИ» выше. Если я запишу значение NP после строки DO 167, это также исправит ситуацию.

Я ожидаю, что запись переменной не повлияет на ее значение. Часто я делаю большие, трудоемкие вычисления, когда конечное значение далеко, а во многих случаях оно восходит к ситуации, когда запись значения (на экран или в файл) волшебным образом облегчает проблему. Любая помощь будет искренне признательна.

...