2014-11-11 1 views
1

이것은 기술적 인 문제보다는 소프트웨어 설계 문제입니다.Fortran에서 파생 된 유형의 정의되지 않은 구성 요소

원자 구성을 정의하기 위해 파생 형식을 사용할 계획이었습니다. 이것들은 다수의 속성을 가질 수 있지만, 모든 설정 유형이 그것들을 모두 정의하지는 않습니다. (가 계산하는 비용 때문에)

type config 
    double precision       :: potential_energy 
    double precision       :: free_energy 
    double precision, dimension(:), allocatable :: coords 
    integer          :: config_type 
end type config 

그래서,이 예제에서, 우리는 또는 자유 에너지를 정의하지 않을 수 있습니다 :

는 다음 순간에 내 정의입니다. 필자가 생각할 수있는 현명한 사례의 수퍼 세트가 될이 파생 된 유형을 여전히 사용하는 것이 안전할까요? 파이썬 없음 또는 널 포인터와 같은 정의되지 않은 것을 의미하는 일종의 기본값을 설정해야합니까?

확장 F2003 기능에 대해 알고 있지만 모든 컴파일러가 F2003을 준수한다고 보증 할 수 없습니다. 이것을하는 또 다른 좋은 방법이 있습니까?

답변

2

공식적으로 개체 중 하나가 정의되지 않은 개체의 값을 필요로하는 작업은 금지됩니다 (F2008 표준의 16.6.1p4 참조).

실제로 문제가 발생할 수는 없지만 파생 된 형식 개체의 전체 값을 필요로하는 작업을 수행 할 때 적절한 디버깅을 지원하는 컴파일러가 구성 요소의 정의되지 않은 특성에 플래그를 지정할 수 있습니다.

하이퍼 퍼포먼스 마크의 제안은 할당 가능한 구성 요소 중 하나가 할당되지 않은 경우에도 파생 된 유형 스칼라가 여전히 "전체"값을 갖기 때문에 이에 대한 해결 방법입니다 (4.5.8 참조). 이 제안은 메모리 사용과 관련하여 구성 요소가 많은 경우 등에 유용 할 수 있습니다.

단일 배정도 구성 요소는 특별히 무겁지 않습니다. 플랫폼에 따라 할당 가능한 스칼라 구성 요소의 설명자가 비슷한 크기 일 수 있습니다. 더 간단한 해결 방법은 구성 요소에 임의의 값을 지정하는 것입니다. 기본 초기화를 사용하여이를 수행 할 수도 있습니다.

은 (아마도 당신은 그 구성 요소가 유용한 값이 포함되어 있는지 여부를 나타내는 몇 가지 독립적 인 방법이있다.)

+0

나는 임의의 값을 사용할 수 있다고 생각합니다. 필자는 외부 라이브러리에 정의 된 파생 형식을 사용하여 때로는 링크하고 때로는 그렇지 않은 경우도 있습니다.나는 (전 'use'문과 유사한 것을 제거 할 필요가 있기 때문에) 전처리기를 다루는 것을 보아왔다. –

2

요즘 Fortran은 할당 가능한 스칼라의 개념을 이해합니다. 이와 같이 :

type config 
    double precision       :: potential_energy 
    double precision, allocatable    :: free_energy 
    double precision, dimension(:), allocatable :: coords 
    integer          :: config_type 
end type config 

그러나 Fortran 2003 컴파일러를 사용할 수 없다면 작동하지 않을 수 있습니다. 그러나 그러한 컴파일러 (또는 오히려 버전)는 실제로 매우 희귀 해지고 있습니다.

그러나 전체 돼지를 가지고 real(real64) 또는 실제 숫자의 종류를 지정하는 다른 21 세기 방법을 선호하여 double precision을 드롭하십시오. 미리 정의 된 표준 상수 real64을 사용하려면 범위 지정 단위에 use iso_fortran_env을 포함시켜야합니다.

+0

내 이상적인 시나리오는 C/C++/포트란/사이 썬 백엔드와 파이썬 프런트 엔드로 완전히 전환하는 것 우리가 사람들에게 사용하게하는 컴파일러에 대해 까다로워하고 있습니다. 그러나, 나의 감독자는 이전 버전과의 호환성에 매우 열중하고 거기에 오래된 (그리고 쓰레기) 컴파일러가 있습니다. 나는 정확하게 정의 된 정밀도에 대해 설득력있는 주장을 할 수 있는지를 볼 것이다. –