Intel Фортран в GNU Фортран Преобразование

Я работаю над пользовательским CFD Solver, написанным на Fortran 90 и MPI. Код содержит более 15 модулей и изначально был разработан для работы с компилятором Intel Fortran. Теперь, поскольку у меня нет доступа к компилятору Intel, мне нужно заставить его работать с помощью компилятора GNU Fortran.

Я внес изменения в Makefile, в котором изначально были флаги, подходящие для ifort. Я использую его в Ubuntu с GNU Fortran и Openmpi

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

Так что теперь, когда я компилирую код, у меня возникают странные проблемы.

  1. GNU Fortran не умеет читать слишком длинные строки, и я получаю ошибки во время компиляции. В результате я должен разбить его на несколько строк, используя символ '&'

  2. Модуль D.f90 содержит все объявленные глобальные переменные. Тем не менее, теперь я во время компиляции я получаю ошибку в модуле B.F90. Я получаю ошибку "Ошибка несекретного оператора", я смог исправить ее в некоторых подпрограммах и функциях, снова локально объявив переменные.

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

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

Я надеялся, что кто-нибудь сможет поделиться мнениями по этому вопросу и дать рекомендации о том, как его решить.

2 ответа

Вы должны начать читать три документа:

  • Стандарт Fortran 90 (альтернативно, другие версии), который говорит вам, что законно, стандарт Fortran, а что нет. Всякий раз, когда вы обнаружите какую-либо ошибку, посмотрите на свой код и проверьте, является ли то, что вы делаете, законным, стандартным Fortran. Скорее всего, рассматриваемый код будет либо совершенно нестандартным (например, REAL*8хотя это расширение довольно хорошо понято) или полагаться на неопределенное поведение, которое Intel Fortran и GFortran интерпретируют по-разному.
  • Руководство GFortran для вашей версии, в котором рассказывается, как GFortran решает такие неопределенные случаи, какие встроенные функции доступны, как изменить некоторые опции / флаги и т. Д. Это скажет вам, что ваша проблема с длинами строк будет решена путем добавления -ffree-line-length-none,
  • Руководство Intel Fortran для вашей версии, которое в случаях нестандартного или неопределенного поведения позволит вам узнать, для чего написан код, который вы читаете, например, поведение, которое вы ожидаете. В частности, это позволит вам расшифровать, что означают используемые в данный момент флаги компилятора. Они могут или не могут нуждаться в переводе на GFortran, например /Qsave нужно будет стать -f-no-automatic,

Конкретным примером интерпретативных различий в пределах допустимого диапазона является стандарт: до Fortran 2003 единицы измерения "длины записи" в файлах записей произвольного доступа оставались неуказанными. Intel Fortran использовал "одно машинное слово" (4 байта в x86), а GFortran использовал 1 байт. Оба были совместимы со стандартным письмом, но несовместимы.

Более того, даже при кодировании "по стандарту", ​​вы можете ударить в стену, если компилятор не реализует часть стандарта Fnn, или он содержит ошибки. Пример: Intel Fortran 12.0 (старый, но это то, с чем я работаю) не ALLOCATE(y, SOURCE=x) конструкция для полиморфного х ("распределение клонов"). С другой стороны, GFortran не полностью реализована FINAL связанные с типом процедуры (деструкторы).

В обоих случаях вам нужно будет найти обходные пути. Например, для первого выпуска вы можете использовать специальную форму оператора INQUIRE (слава @haraldkl). В других случаях обходной путь может даже включать использование какого-либо вида обнаружения функций (см. Autoconf, CMake и т. Д.) И сохранение результатов в виде PARAMETER переменные в config.f90 файл, который включен в ваш код. Ваш код будет принимать решения на его основе, как в:

! config.f90.in (things in @x@ would get subtituted by automake, for example)
INTEGER, PARAMETER :: RECORD_LEN_BYTES = @RECORD_LEN_BYTES@

! Some other file which opens a file
INCLUDE "config.f90"
!...
OPEN(u, FILE='DE430.BIN', ACCESS='direct', FORM='unformatted', RECL=56 / RECORD_LEN_BYTES)

Люди жалуются на следование стандарту, по крайней мере, с 60-х годов. Но эти функции cDEC$ были введены по веским причинам...

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

Для вас вопрос № 1 " GNU Fortran не умеет читать слишком длинные строки, и я получаю ошибки во время компиляции. В результате я должен разбить его на несколько строк, используя символ " & " "

В былые времена было:

options/extended_source
SUBROUTINE...

В форте это -132, но я не нашел гфортран, эквивалентный -132 . Это может быть -ffixed-line-length-n -ffixed-line-length-none -ffree-line-length-n -free-line-length-none по ссылке: http://www.math.uni-leipzig.de/~hellmund/Vorlesung/gfortran.html

Кроме того, стандартом ifort для.f90 и.f95 является ключ-компилятора, '-free' '-fixed' - это стандарт <.f90... Однако можно использовать -fixed с.f90 и использовать столбец 6 и 'D' в столбец № 1... Что удобно при использовании '-D_lines' или '-DD'. По ссылке: https://software.intel.com/sites/default/files/m/f/8/5/8/0/6366-ifort.txt

Для вас вопрос № 2: " Модуль D.f90 содержит все объявленные глобальные переменные. Однако теперь я во время компиляции получаю сообщение об ошибке в модуле B.F90. Я получаю ошибку" Несекретная ошибка оператора ", я смог исправьте это в некоторых подпрограммах и функциях, снова объявив переменные локально. "Возможно, вам придется вставить строку, которая нарушает правила, если вы можете получить отказ от IP.

Создание локальных переменных, если ожидается, что они будут совместно использоваться в / common / или совместно в модуле, не будет работать. Если они были в / common / или PUBLIC, то они являются общими. Если они местные, то они ЧАСТНЫЕ.

было бы легко получить эту ошибку, если оператор PRIVATE был в неправильном месте, или оператор USE был опущен.

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