如何获得具有不同类型的模块以进行代码重用?

时间:2017-07-01 11:16:11

标签: fortran reusability

现在我有两个模块。两个模块中的功能完全相同,但一个是关于应对真实类型,而另一个是关于复杂类型。所有这些模块都将在一个程序中使用,因此根据不同的参数输入,我们需要选择不同的模块。

根据"代码重用"的主要精神,如何将这些模块组成一个代码副本。并且这些模块需要高性能(因此需要避免使用类似"如果"," select")。我想知道我们是否有任何解决方案?

1 个答案:

答案 0 :(得分:0)

这是下一个(2020?)Fortran标准的争论话题。在当前版本中无法对Fortran模块进行参数化。它被许多人视为大缺陷(参见comp.lang.fortran的讨论)。

您可以做的是使用预处理器(通常是C预处理器)并包含文件。您可以在包含文件

中将类型定义为宏名称
  MYTYPE :: x

然后包含具有适当定义的文件

#define MYTYPE real
#include "module-template.F90"
#undef MYTYPE

#define MYTYPE complex
#include "module-template.F90"
#undef MYTYPE

您可以通过

启用预处理器
 gfortran -cpp
 ifort -fpp

和类似的(参见编译器手册)。

在包含文件

中可以看到一个例子(由我编写)

https://github.com/LadaF/PoisFFT/blob/master/src/fft-inc.f90

包含在

https://github.com/LadaF/PoisFFT/blob/master/src/fft.f90

正如您在示例中所看到的,其中有一些细节。您需要两个模块具有不同的名称,例如mod_realmod_complex。您可以与示例类似地执行此操作,也可以使用宏连接来生成模块名称。请参阅C preprocessor macro: concatenation (example for Fortan90)Concatenate strings in a macro using gfortran