2014-12-19 1 views
1

일부 포트란 90 코드를 읽었으며 익숙하지 않은 개념을 접하게됩니다. 두 벡터의 내적을 계산하기 위해 정의 된 코드의 일부로 실제 값이 dmf_dotp이고 복소수 값이 zmf_dotp입니다.포트란 인터페이스, 프로 시저 및 함수 관계

mesh.F90 : 그런 일이 함수를 호출 할 수 있습니다

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_dotp 또는 dmf_dotp와 :

#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 

다른 파일에서 같은 기능이 있습니다. 그럼 여기서 정말로 무슨 일이 일어나고있는 걸까요?


덕분에 Vladimir F에게 감사드립니다.

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

'R_TYPE'과'X'는 아마 전처리 기 매크로입니다. 어떻게 정의됩니까? 이 두 파일은 어떻게 연결되어 있습니까? 'include' 문이 있습니까? –

+0

@VladimirF 고마워! 조심스럽게 코드를 읽고 포함 파일을 찾았습니다. 또한 다른 질문에 귀하의 의견에, 나는 '##'문자열 연결에 사용되는 배웠습니다. – dofine

+0

예 : http://stackoverflow.com/questions/2257248/how-to-write-wrapper-for-allocate –

답변

6

이것은 모두 복사 및 붙여 넣기를하지 않고 포트란에서 일반적인 프로그래밍을 할 수있는 방법 중 하나입니다.

#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 

또는 유사한

, CMPLXcomplex 어떤 종류의 리드 다른 매크로 것 같다 따라서 I가 FLOAT 기대 :

나는 그것이 실제로 유사합니다 가정 real 일 수 있으며, 아마도 double precision 일 수 있습니다.

실제로 유사하거나 동일한 바디를 갖는 기능

double precision function dmf_dotp_1(...) 

double complex function zmf_dotp_1(...) 

로 전처리 된 소스 코드를 리드한다.

이렇게하면 관련 코드를 한 번만 작성하고 다른 유형의 다른 이름으로 재사용 할 수 있습니다.

주의! 매우 인기있는 gfortran 컴파일러는 ## 연산자를 지원하지 않는 "전통적인 모드"로 C 전 처리기를 실행합니다.

+0

고마워요. – dofine

+0

비슷한 접근법을 gfortran과 함께 사용하기위한 해결책이 있습니까? – zbeekman

+0

예, gfortran 앞에 cpp를 실행하십시오. –