私はPDEシステムを解くためのFortranコードを設計しています。最新のFortranを使用したソルバー向けの良いOOPデザイン
今のところ設計されているのは、いくつかの属性を持つタイプVariable
です。最も重要なのは値を格納する配列val
です。
solver
クラスもあり、variable
で計算されます。私はvariable
全体をソルバーに渡してvariable%val
を実行すると(実行中に数千回)、非効率的であると考えたので、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
に速度と比較するとどのように比較されますか?これを行うための定期的な方法はありますか?
私は変数ポインタに多くの点が表示されません。それを仮引数として渡すだけで、私にとってもっと自然なようです。これは1つの配列記述子であり、パフォーマンスに悪影響はありません。 –