Смешивание целочисленных типов в Фортране - PullRequest
0 голосов
/ 07 июня 2018

У меня есть код, который я запускаю в нескольких разных кластерах, каждый из которых имеет разные комбинации MPI и LAPACK.

Это может вызвать проблемы.Например, в настоящее время я использую опцию ifort «-i8», которая отлично работает с LAPACK, но теперь все вызовы MPI прерываются, потому что ожидает integer(4), а не integer(8).

Есть ли элегантный &гибкий способ адаптации целочисленного типа на основе локальной установки MPI & LAPACK?

Жесткое кодирование типов для каждого конкретного вызова кажется просто очень громоздким и негибким.

1 Ответ

0 голосов
/ 07 июня 2018

вызовов MPI не ожидают INTEGER(4) и INTEGER(8), они ожидают только INTEGER.И, как всегда, помните, что на самом деле означают эти (4) и (8) Фортран: целое число * 4 против целого числа (4) против целого числа (род = 4)

С -i8вы меняете то, что означает INTEGER, какому типу оно соответствует.Вы можете сделать это, но вы должны скомпилировать библиотеку MPI с теми же настройками.Библиотека может или не может быть подготовлена ​​для такой компиляции, но теоретически это должно быть возможно.

Вы также можете попробовать передать integer(int32) вместо integer в MPI.Если это правильный тип, который соответствует виду библиотеки MPI по умолчанию, проверки TKR и все другие проверки должны пройти ОК.Но это не рекомендуется.

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

Чтобы оставаться переносимым, используйте целые числакоторые соответствуют API библиотеки, которую вы используете, и убедитесь, что библиотека предназначена для использования с этим конкретным компилятором и с этой конкретной конфигурацией компилятора.

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

...