2012-05-25 2 views
5

PDE 시스템을 해결하기위한 Fortran 코드를 설계하고 있습니다.현대 Fortran을 사용하는 솔버를위한 좋은 OOP 설계

현재 설계된 방식은 여러 가지 특성을 갖는 유형이 Variable인데 그 중 가장 중요한 것은 값을 저장하는 배열 val입니다.

이제는 solver 클래스를 사용하여 variable에서 계산을 수행합니다. 나는 해결사로 전체 variable을 전달하고 variable%val 내가 (AN exectution 동안 시간의 수천)를 실행 할 때마다 작업하는 것은 비효율적 일 것이라고 생각, 그래서에 결합하는 solver 클래스 포인터 필드를 정의하기로 결정 적절한 변수를 구하십시오. 예를

program example 
    use variable 
    use solvers 

    type(Variable) T 
    type(Solver) solver_temperature 

    !Contructors 
    call T%create() 
    call solver_temperature%create(T) 

    call solver_temperature%solve() 
end program example 

그리고 해결사 모듈 내 프로그램에서

module solvers 
type Solver 
    real*8, pointer :: T(:,:) 

contains 
    procedure :: create 
    procedure :: solve 
end type 

contains 
    subroutine create(this,T) 
     type(Solver) :: this 
     type(Variable) :: T 

     this%T => T%val 
    end subroutine 
end module 

동안 나는 내가 위에서 보여 방식이 변수와 관련된 다른 물리적 특성과 다른 해법에 대해 서로 다른 변수를 정의합니다.

나는 OOP에 일반적으로 익숙하다. 그렇다면 나의 질문은 괜찮은 디자인인가? 특히 성능 관점에서. 이 방법을 T 배열과 비교하여 속도면에서 서브 루틴 solve에 전달하는 것과 비교하면 어떨까요? 몇 가지 일반적인 방법이 있나요?

+2

가변 포인터에 많은 포인트가 표시되지 않습니다. 가짜 인수로 전달하는 것이 나에게 자연스러운 것처럼 보입니다. 하나의 배열 기술자 일 뿐이며, 성능에 나쁜 영향을주지는 않습니다. –

답변

5

저는 Fortran의 OO 기능을 1 년 동안 사용해 왔습니다. 여기에 대답으로 가장 한 확장 된 주석이 있습니다.

당신이 다음 생 실행 속도 만 생각하면됩니다 아마에서 더 나은이 OO 기능 놀지 일반적인 (그리고 인수에 따라 오히려 데이터보다 내 경험); 그러나 많은 경우 FORTRAN77 이후에 언어에 추가 된 것을 제거하는 것이 더 좋다는 동일한 주장을 할 수 있습니다. 코드 디자인, 이해도, 확장 성, 그런 종류의 문제를 설립 할 때 OO 찬성

인수 강하다. 이 점이 중요하다면 OO 기능 사용에 대해 생각해야합니다.

블라디미르 (Vladimir)가 이미 주석을 달았으므로 가변 포인터를 사용하는 데는 많은 포인트가없는 것 같습니다. 대부분의 포트란 구현은 대용량의 데이터를 복사하는 노력을 피하기 위해 특별히 참조별로 호출한다는 것을 잊지 마십시오.

개인적으로, 나는 당신이 당신의 타입 바인딩 절차 create을 정의하는 방식을 좋아하지 않는다. 나는 많은 나는이 같은 라인을 쓸 수 있도록, 함수로 작업의 종류를 구현하는 것을 선호 :

t = solver%new() 

오히려

call T%create() 

주 이상이 광산의 선호, 그리고 그것이 더 효율성이나 정확성보다는 스타일에 대한 질문. 나는 당신이 서브 루틴에 대한 인수의 의도를 선언하지 않았 음을 알아 차렸다. create; 코드의 스 니펫 (snippet)을 게시했기 때문일 수 있습니다.

OO는 Fortran에 비교적 새롭기 때문에 (그리고 아마도 Fortran이 널리 사용되는 도메인에서 일하는 대부분의 사람들에게는 상대적으로 익숙하지 않기 때문에) 채택하는 데 많은 도움이되는 자료는 없습니다.Scientific Software Design을 권하고 싶습니다. 그것은 주제에 알맞은 주제를 제공하고 왜 과학 및 공학 프로그래머가 OO를 채택해야하는지에 대한 논의를 만듭니다.

+0

+1 나는 메모리 할당이 다른 곳에서 행해지더라도 생성자로 접근하는 다른 함수처럼 초기화를 좋아한다. 때때로 표준 파생 형 초기화가 충분하지 않은 경우에도 'solver %'를 solver라는 이름으로 인터페이스를 만들고 't = solver()'를 사용하는 것이 편리합니다. –

+0

책 링크를위한 탱크가 많습니다. 그 점을 파악하려고 노력할 것입니다. – tiam

+0

의'solver % new()'예에서'solver'는 무엇입니까? 해 찾기 개체? 아니면 이런 식으로 타입 함수에 접근 할 수 있습니까? – weymouth

관련 문제