5

PDE 系を解くための Fortran コードを設計しています。

現在設計されている方法は、Variableいくつかの属性を持つ型を持っているということです。その中で最も重要なのはval、値を格納する配列です。

solverこれで、 で計算を実行するクラスも作成されましたvariable。全体variableをソルバーに渡し、variable%valそれを実行するたびに (実行中に数千回) 作業するのは非効率的であると考えたので、solverクラスでポインター フィールドを定義して to ソルバーにバインドすることにしました。適切な変数。例えば

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、速度の点でどうですか? これを行う定期的な方法はありますか?

4

1 に答える 1

5

私は、Fortran の OO 機能を 1 年ほど使用してきました。ここに、回答を装った拡張コメントをいくつか示します。

単純に生の実行速度に関心がある場合は、一般的に (そして、データではなく議論と私の経験に基づいて)、OO 機能を避ける方がよいでしょう。しかし、多くの場合、FORTRAN77 の後に言語に追加されたものはすべて避けたほうがよいという同じ議論を行うことができます。

オブジェクト指向を支持する議論は、コード設計、理解可能性、拡張性などの問題に基づいている場合、より強力になります。これらが重要な場合は、OO 機能の使用を検討する必要があります。

Vladimir が既にコメントしているように、変数ポインターを使用する意味はあまりないようです。Fortran のほとんどの実装では、(大量の) データをコピーする手間を省くために参照渡しを使用していることを忘れないでください。

個人的には、 type-bound procedure を定義した方法が好きではありませんcreate。私は、このような操作を関数として実装することを好みます。これにより、次のような行を記述できます。

t = solver%new()

あなたのではなく

call T%create()

これは私の好みであり、効率や正確さよりもスタイルの問題であることに注意してください。サブルーチンへの引数の意図を宣言していないことに気付きましたcreate。おそらく、コードのスニペットを投稿しただけだからです。

OO は Fortran にとって比較的新しいものであるため (そして、おそらく、Fortran が広く使用されているドメインで作業しているほとんどの人にとっては比較的馴染みがないため)、OO を採用するためのガイドとなる有用な資料はあまりありません。Scientific Software Designをお勧めします。トピックを適切にカバーし、科学および工学のプログラマーが OO を採用すべき理由について議論します。

于 2012-05-28T10:59:41.737 に答える