Ошибка выполнения M6201 (ДОМЕН)

Я новичок в этом форуме, но думаю, что у меня проблема, которая актуальна.

У меня есть довольно большая программа F77, которую я тщательно преобразовал в F90. Чтобы в дальнейшем переместить его в F90, я утомительно удаляю каждый из нескольких ОБЩИХ блоков. Я успешно разобрал 4 из них и работаю над 5-м. На каждом этапе я проверяю вывод в сравнении с исходным контрольным примером, чтобы убедиться в достоверности чисел.

В общем, когда я удаляю блок COMMON, я добавляю его переменные в раздел объявлений в модуле программы, а затем для каждой подпрограммы, которая использовала этот блок COMMON, я добавляю "use ModuleName". Это сработало нормально.

Кстати, я использую компилятор CVF v6.6C с Windows XP Pro.

В последнем случае я удалил 5-й ОБЩИЙ блок, и он скомпилирован нормально. Однако во время выполнения программа захлебнулась определенной строкой в ​​одной из своих многочисленных подпрограмм - строке, включающей SQRT. Ниже приведены 3 ключевые строки (реальное U передается в качестве аргумента; реальный массив Y из 8 элементов задается в другой подпрограмме и также передается в качестве аргумента):

W = Y(2)/Y(1)
sum = (w**2 + u**2)
V = SQRT(W**2+U**2)

Я проследил проблему до этой точки и добавил несколько диагностических записей чуть ниже этой точки дросселирования. Как ни странно, (1) реальный массив Y отсутствует даже в ОБЩЕМ блоке, который я удалил. (2) подпрограмма выполняется 128, 646 раз, прежде чем возникнет какая-либо проблема, при этом значения будут следующими:

Y(2) =  Infinity      Y(1) =  Infinity      w =  NaN    u =  3.5    Sum =  NaN

Когда Y(2) и Y(1) уходят в бесконечность, их частное равно NaN, а SQRT(NaN) равно BUST!

Имейте в виду, в версии, прежде чем я удалил 5-й ОБЩИЙ блок, этот саб. выполнено 473351 раз. Таким образом, программа завершилась примерно на 27% до сбоя.

FWIW: Y используется в паре сабов. и всегда проходил через ARG (никогда через COMMON).

Я понимаю, что большинству из вас будет трудно расшифровать этот код без кода, который я не могу предоставить, потому что он длинный и проприетарный. Но я ищу общие принципы Фортрана. Почему переменная (массив Y), которая работала нормально, прежде чем вдруг начала принимать значения, достигающие бесконечности, тем самым приводила к сбою функции SQRT? Могу ли я попробовать какие-либо трюки с декларациями, чтобы "стабилизировать" Y? Любые мысли или предложения приветствуются.

0 ответов

Другие вопросы по тегам