2014-12-19 64 views
1

我正在閱讀一些Fortran 90代碼,並遇到一些我不熟悉的概念。 代碼的一部分,定義爲計算兩個向量的點積,dmf_dotp爲實數,zmf_dotp爲複數。Fortran接口,過程和函數關係

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 

在另一文件有類似功能:

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) 

那麼可以調用這些函數(或多個接口?)和zmf_dotpdmf_dotp。那麼這裏究竟發生了什麼?


編輯感謝Vladimir F。原來有別的定義了一些預處理宏:

#define X(x)  z ## x 
#define R_TYPE  CMPLX 
+0

您應該多顯示一下,'R_TYPE'和'X'可能是預處理器宏。他們如何定義?這兩個文件如何連接?是否有'include'聲明? – 2014-12-19 12:12:04

+0

@VladimirF謝謝!仔細閱讀代碼並找到包含文件。同樣在你對另一個問題的評論中,我瞭解到'##'用於字符串連接。 – dofine 2014-12-19 12:39:33

+0

示例:http://stackoverflow.com/questions/2257248/how-to-write-wrapper-for-allocate – 2014-12-19 18:24:52

回答

6

這是一個可以在Fortran語言做泛型編程沒有複製和粘貼的一切的一種方式。

我認爲它實際上看起來類似於:

#define X(x)  z ## x 
#define R_TYPE  CMPLX 
#include mesh_inc.F90 

#define X(x)  d ## x 
#define R_TYPE  FLOAT 
#include mesh_inc.F90 

或類似的,似乎CMPLX是另一個宏導致某種complex,因此我預計浮到是某種real,可能是double precision

這實際上會導致對經預處理的源代碼作爲

double precision function dmf_dotp_1(...) 

double complex function zmf_dotp_1(...) 

與具有類似或甚至相同的身體功能。

這使您只能編寫一次相關的代碼,並使用不同類型的不同名稱創建重用。

當心!非常流行的gfortran編譯器以「傳統模式」運行C預處理器,該預處理器不支持##運算符。

+0

非常感謝。 – dofine 2014-12-21 10:18:27

+0

那麼你是否有與gfortran一起使用類似方法的工作? – zbeekman 2015-03-06 17:55:33

+0

是的,在gfortran之前運行cpp。 – 2015-03-06 18:43:59