PETSC标题#include在一个模块中

时间:2016-02-20 10:43:19

标签: module include fortran petsc

我有一个包含全局变量的模块。要声明一些全局变量,我需要使用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模块中定义的数据类型。

现在,我有一个包含I / O子程序的文件。此文件还使用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模块和头文件,在IO.F90中使用global_variables模块将处理每个数据类型声明,但似乎没有。你能帮我理解我的理解错误吗?

问题2:有没有办法限制#include对声明它的模块的影响?

PS。如果我在IO.F90中包含#include "finclude/petscvec.h",它声明 Vec ,那么它编译得很好。

1 个答案:

答案 0 :(得分:3)

语法

#define Vec PetscFortranAddr

与Fortran完全不同。它的工作原理只是因为Vec是头文件“finclude / petscvec.h”中定义的C预处理器(CPP)宏

Vec

这意味着您必须在每个Fortran文件中包含头文件,其中您使用上述语法use。使用Fortran PetscFortranAddr无法继承宏,因为它不是Fortran的一部分。

{{1}}最终在“finclude / petscdef.h”中定义为4或8字节的整数,具体取决于您的系统。

除了逆向工程预处理器最终的功能之外,你可能无能为力,但我不会这样做,它可能是不可移植的。