如何获得不同类型的模块以进行代码重用?
How to get a module with different type for code reuse?
现在我有两个模块。两个模块的功能完全一样,只是一个是处理实型,另一个是处理复型。所有这些模块都将在一个程序中使用,因此根据不同的参数输入,我们需要选择不同的模块。
根据"code reuse"的主要精神,如何把这些模块做成一份代码。这些模块需要高性能(因此需要避免使用 "if"、"select" 之类的东西)。请问有什么解决办法吗?
这是下一个(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_real
和 mod_complex
。您可以像示例一样执行此操作,也可以使用宏链接来生成模块名称。参见 C preprocessor macro: concatenation (example for Fortan90) and
现在我有两个模块。两个模块的功能完全一样,只是一个是处理实型,另一个是处理复型。所有这些模块都将在一个程序中使用,因此根据不同的参数输入,我们需要选择不同的模块。
根据"code reuse"的主要精神,如何把这些模块做成一份代码。这些模块需要高性能(因此需要避免使用 "if"、"select" 之类的东西)。请问有什么解决办法吗?
这是下一个(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_real
和 mod_complex
。您可以像示例一样执行此操作,也可以使用宏链接来生成模块名称。参见 C preprocessor macro: concatenation (example for Fortan90) and