Заголовок PETSC#include'd в модуле
У меня есть модуль, который содержит глобальные переменные. Чтобы объявить некоторые глобальные переменные, мне нужно использовать HDF5. Я также использую библиотеку, поэтому мне также нужно включить заголовочный файл. Таким образом, преамбула global_variable.F90 выглядит следующим образом.
module global_variables
use HDF5
#include "finclude/petscsys.h"
#include "finclude/petscvec.h"
integer(HID_T) id_file
integer(HID_T) id_plist
Vec M, C, K
...
end module
Vec - это тип данных, определенный в заголовочном файле, а HID_T - это тип данных, определенный в модуле HDF5.
Теперь у меня есть файл, который содержит подпрограммы для ввода-вывода. Этот файл также использует HDF5 и ту же библиотеку, что и в global_variables.F90. Итак, IO.F90 выглядит так.
module io
use global_varibles
contains
subroutine read_input_file( vector )
Vec vector
integer HDF5err
call H5open_f( HDF5err )
...
end subroutine
end module
Вопрос 1: компилятор возвращает ошибку при компиляции IO.F90, говоря, что Vec имеет неопределенный тип данных. Но он не жалуется на HID_T. Я думал, что модуль global_variables уже содержит как модули HDF5, так и заголовочные файлы, используя модуль global_variables в IO.F90 будет обрабатывать все объявления типов данных, но, похоже, нет. Не могли бы вы помочь мне понять, что я неправильно понимаю?
Вопрос 2: Есть ли способ ограничить действие #include для модуля, где он объявлен?
PS. Если я включу #include "finclude/petscvec.h"
в IO.F90, который объявляет Vec, он хорошо компилируется.
1 ответ
Синтаксис
Vec vector
совершенно чужд Фортрану. Он работает только потому, что Vec - это макрос препроцессора C (CPP), определенный в заголовочном файле "finclude / petscvec.h" как
#define Vec PetscFortranAddr
Это означает, что вы должны включить заголовочный файл в каждый файл Fortran, в котором вы используете вышеуказанный синтаксис с Vec
, Макрос не может быть унаследован с использованием Fortran use
потому что это не часть Фортрана.
PetscFortranAddr
в конце определяется в "finclude / petscdef.h" как целое число с 4 или 8 байтами в зависимости от вашей системы.
Вероятно, вы ничего не можете сделать, кроме реверс-инжиниринга того, что в итоге делает препроцессор, но я бы не пошел по этому пути, он может быть не переносимым.