Fortran接口,程序和功能关系

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)

Vla*_*r F 6

这是可以在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预处理器,它不支持##运算符.