dof*_*ine 1 fortran generic-programming fortran90
我正在阅读一些Fortran 90代码并遇到一些我不熟悉的概念.部分代码,用于计算两个向量的点积,dmf_dotp用于实数值,zmf_dotp用于复数值.
mesh.F90:
#include mesh_inc.F90
interface dmf_dotp
module procedure dmf_dotp_1, dmf_dotp_2
end interface dmf_dotp
interface zmf_dotp
module procedure zmf_dotp_1, zmf_dotp_2
end interface zmf_dotp
Run Code Online (Sandbox Code Playgroud)
在另一个文件中有以下功能:
R_TYPE function X(mf_dotp_1)(mesh, f1, f2, reduce, dotu) result(dotp)
R_TYPE function X(mf_dotp_2)(mesh, dim, f1, f2, reduce, dotu) result(dotp)
Run Code Online (Sandbox Code Playgroud)
然后可以用zmf_dotp或调用这些函数(或接口?)dmf_dotp.那么这里到底发生了什么?
编辑感谢弗拉基米尔˚F.事实证明,还有一些预处理器宏定义:
#define X(x) z ## x
#define R_TYPE CMPLX
Run Code Online (Sandbox Code Playgroud)
这是可以在Fortran中进行泛型编程而无需复制和粘贴所有内容的方法之一.
我认为它实际上看起来类似于:
#define X(x) z ## x
#define R_TYPE CMPLX
#include mesh_inc.F90
Run Code Online (Sandbox Code Playgroud)
和
#define X(x) d ## x
#define R_TYPE FLOAT
#include mesh_inc.F90
Run Code Online (Sandbox Code Playgroud)
或类似的,似乎CMPLX是另一个宏导致某种形式的complex,所以我希望FLOAT是某种real可能double precision.
这实际上会导致预处理的源代码为
double precision function dmf_dotp_1(...)
Run Code Online (Sandbox Code Playgroud)
和
double complex function zmf_dotp_1(...)
Run Code Online (Sandbox Code Playgroud)
具有相似或甚至相同的身体的功能.
这使您只能编写一次相关代码,并使用不同类型的不同名称创建重用.
谨防!非常流行的gfortran编译器在"传统模式"下运行C预处理器,它不支持##运算符.