2010-03-18 3 views
1

포트란 90에 문제가 있습니다.포트란 90 사용자 정의 유형, 값으로 전달 하시겠습니까?

사용자 정의 유형이 있는데, MPI 서브 루틴 중 하나를 호출하면 데이터가 값으로 전달되는 것처럼 보입니다. 출력 인수는 수정되지 않습니다. 그것은 MPI 호출에 특정한 것으로 보인다. 나는 간단한 테스트에서 똑같은 것을 시도했고 호출 된 범위에서 전달 된 값을 변경할 수 있습니다. Fortran이 항상 주소로 전달한다고 생각했기 때문에 이것이 이유가 확실하지 않습니다. 무슨 일이 벌어 질지 상상해?

댓글이 달린 스 니펫은 통화가 이루어지는 방식을 보여줍니다. 첫 번째 호출에서 c%NSubDomains은 출력 인수이며 호출 범위에서 수정해야하지만 그렇지 않습니다. 사용자 정의 유형의 멤버가 아닌 배열을 호출하면 비 주석 스 니펫에서 작동합니다.

! ! This doesn't work output values aren't modified ?? 
! call MPI_Dims_create(c%NProcs,c%NDims,c%NSubDomains,iErr) 

nsubs(:)=0 
call MPI_Dims_create(c%NProcs,c%NDims,nsubs,iErr) 
c%NSubDomains=nsubs 

답변

1

Fortran 언어 표준은 인수 전달 방법을 설명하지 않습니다. 다른 컴파일러는 인수의 유형과 인수의 "의도"(in/out/inout)에 따라 다양한 방식으로 인수 전달을 구현할 수 있습니다.

nsubs 대 C % NSubDomains는 어떻게 선언됩니까? 컴파일러에게 MPI_Dims_create를 호출하는 방법을 알려주는 인터페이스 선언 (아마 Fortran 90에서 MPI 로의 바인딩에서)을 가지고 있습니까?

1

@MSB는 Fortran 표준이 인수 전달이 구현되는 방법을 요구하지 않음을 준수합니다. 하지만 인자 전달의 의미가 인수가 참조로 전달되는 것처럼 프로그래머를 바라 보도록 지시한다는 것은 분명하다고 생각합니다. 그래서 저는 INTENT(OUT) 인수가 MPI_DIMS_CREATE 인 경우에 해당하지 않는 것으로 OP의 흥분을 이해합니다.

컴파일러는이 같은 선언의 구문 지원하는 경우 :

!DEC$ ATTRIBUTE 

또는 구현 포트란 2003 C-상호 운용성 기능을 갖춘 컴파일러를 사용하는 경우, 당신은 통과에 컴파일러를 강요 할 수있을 것를 컴퍼넌트는 참조로서 사용됩니다. 그러나 그렇게하면 컴파일러가 주석 처리되지 않은 코드에서 수행중인 작업을 수행하는 코드를 생성 할 가능성이 높습니다. 참조로 전달할 수있는 변수를 만들고이를 서브 루틴으로 전달할 수 있습니다.

이 상황에서 나는 흐름과 함께 가서 코드를 직접 작성했습니다.