Intel Фортран в GNU Фортран Преобразование
Я работаю над пользовательским CFD Solver, написанным на Fortran 90 и MPI. Код содержит более 15 модулей и изначально был разработан для работы с компилятором Intel Fortran. Теперь, поскольку у меня нет доступа к компилятору Intel, мне нужно заставить его работать с помощью компилятора GNU Fortran.
Я внес изменения в Makefile, в котором изначально были флаги, подходящие для ifort. Я использую его в Ubuntu с GNU Fortran и Openmpi
Я сожалею, что не могу вставить что-либо из структуры кода или вывода терминала из-за ограничений IP моего университета. Тем не менее, я постараюсь наилучшим образом описать проблемы
Так что теперь, когда я компилирую код, у меня возникают странные проблемы.
GNU Fortran не умеет читать слишком длинные строки, и я получаю ошибки во время компиляции. В результате я должен разбить его на несколько строк, используя символ '&'
Модуль 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 был опущен.