2014-12-22 4 views
1

저는 fortran으로 작성된 코드의 일부를 이해하려고합니다. 코드는 다음과 같은 부분이 포함되어Fortran에서 _real_ 전 처리기를 사용하는 것은 무엇입니까?

this page에서
REAL(KIND=8), DIMENSION(x,y), INTENT(INOUT) :: AR 
     _REAL_, DIMENSION(x,y), INTENT(INOUT) :: BR 

, 난 _REAL_ 정밀 제어를위한 전처리 것을 알게되었습니다.

  1. _REAL_은 실제로이 코드에서 무엇을합니까?
  2. AR 값을 BR에 할당 할 수 있습니까? 그들 사이에 타입 비 호환성 문제가 있습니까?
  3. 나는 C 기능 extern "C" void assign_(double *AR, double *BR , int *x, int*y)를 사용하여 BRAR의 값을 할당하려고했지만, 난이 문제가 있습니다, 그리고 문제가 ARBR 사이의 호환성 문제로 인한 것 같다 내가 위의 코드를 변경하는 경우 때문에 :
    REAL(KIND=8), DIMENSION(x,y), INTENT(INOUT) :: AR REAL(KIND=8), DIMENSION(x,y), INTENT(INOUT) :: BR, 문제가 해결되었습니다. 이런 식으로 코드를 변경하면 문제가 있습니까?
+0

'_REAL_'이 전역 적으로 사용 가능한지 확실하지 않습니다. 당신이 준 링크에서, 그것은 컴파일시에 정의됩니다. 매크로를 피하고,'ISO_Fortran_env'와 같은 표준을 따르는 것을 사용하십시오. –

+0

더 많은 코드 또는 Makefile을 보여줘야합니다. 즉, 당신의'_REAL_'은 어디에서 왔습니까? –

+0

'_real_'의 의미는 정의 된 작업 정밀도 (아마도'DPREC'에 의해 설정 됨)에 따라 그 링크를 읽는 것만으로 변합니다. – agentp

답변

1

참조한 페이지가 Molecular Dynamics 소프트웨어 패키지를 빌드하는 버그 보고서 인 것 같습니다. Amber. 내가 링크에서이 추론 (.../GCC-버그/...), 어떤 상태 페이지의 두 번째 줄에서 :의 정밀도를 변경하는 방법에 대해 설명합니다 설명에서 마지막으로

!+ Specification and control of Amber's working precision 

과 앰버 빌드 (단일 또는 배정도 버전의 소프트웨어 설치).

작성한 코드가 앰버의 일부인 경우 참조한 페이지에 _REAL_이 코드에서 수행하는 내용이 설명되어 있습니다. 즉, 작업 정밀도를 기준으로 컴파일 할 때 real(kind=4) 또는 real(kind=8)으로 바뀌는 일반적인 유형 정의입니다. Amber에 대한 설명에 따르면 기본 빌드는 배정 밀도이므로 컴파일시 _REAL_real(kind=8)으로 바뀝니다. 질문 1에 대답해야합니다.

AR의 값은 항상 BR으로 지정할 수 있지만 해당 유형으로 변환해야합니다. 나는. BR이 정수 배열 인 경우 AR의 값을 정수로 형변환해야합니다. 작성한 코드가 다시 앰버 용이고 기본 배정 밀도가 오버라이드되지 않는다고 가정하면 BRAR과 마찬가지로 배정 밀도 배열이므로 값을 자유롭게 할당 할 수 있습니다.

질문 3과 같이 _REAL_이 실제로 배정도를 의미하도록 매크로를 정의해야 할 수도 있습니다. 자주 논의되지는 않지만, 많은 포트란 컴파일러는 행복하게 전 처리기를 적용 할 것입니다. 자동 전처리 (컴파일러가 플래그를 결정할 수있게 함)의 경우 첫 번째 단락 on this documentation page for gfortran에 설명 된대로 .F90, .F, .fpp 또는 .FPP과 같은 올바른 확장명이 포트란 소스 파일에 있는지 확인하면됩니다. 인텔 컴파일러에서도 이해할 수 있습니다). Fortran 90 이후 버전에서 코드를 작성하기 때문에 확장자 .F90은 저에게 이상합니다.내가 거기에 공간이 있어야한다는 것을 강조하기 위해 지난 밑줄과 같은 실제 사이에 하나 개 이상의 공간을 추가

#define _REAL_  real(kind=8) 

참고 : 다음, 아마 소스 파일의 헤더에, 바로 다음 줄을 추가합니다. 이렇게하면 Fortran 컴파일러가 _REAL_의 모든 항목을 real(kind=8)으로 바꾸고 컴파일러 플래그를 호출하지 않고 한 줄을 수정하여 실제 정밀도를 전역 적으로 수정할 수 있습니다.

이렇게하면 외부 C 참조가 작동하는 것으로 생각됩니다.