趣味で計算流砂水理

Computational Sediment Hydraulics for Fun

はじめてのf03

全然更新せずにすいません.抜け殻のようになってました.

気分転換にf03で不等流計算を書いてみました.結構苦労しましたというかかなりの力作です.DBの置きましたので,確認し意見をいただけると幸いです.doxygenもあります.

ハマった点や気になる点を列挙しておきます.

ifortでは拡張子f03が使えない.

  • なぜかifortでは拡張子f03は使えません.以下のHPに載ってました.なので拡張子はf90です.
  • gfortranでは,コンパイルオプション-std=f2003が必要です.

ドウジンテイスウ.log — Fortran2003、拡張子問題

module内のPROCEDUREの呼び出し方が独特

  • 例えば,module内で,type(section)内に定義したメソッドが以下のような場合は,
SUBROUTINE Cal_SectionProfile(s, H0)
    CLASS(section),INTENT(INOUT) :: s
    REAL(8),INTENT(IN) :: H0

メイン文から呼び出す場合,

    クラス名%Cal_SectionProfile(H0)

のように,引数の一つ目(クラス名)が省略されます(メソッド名の前に付くため,二重になるからと思います).もし,省略したくない場合は,PROCEDUREの宣言時にNO PASS属性を定義する必要があります.

さらに,今回は使ってないですが,メイン文にINTERFACEを設ける場合は特殊で以下のようにIMPORT文が必要です.当然,INTERFACEの上にUSE文も必要です.

INTERFACE
    SUBROUTINE Cal_SectionProfile(s, H0)
        IMPORT section
        CLASS(section),INTENT(INOUT) :: s
        REAL(8),INTENT(IN) :: H0
    END SUBROUTINE Cal_SectionProfile
END INTERFACE

type内の変数にprotected属性が使えない.

  • 2003からpublic,privateに加えて,protectedという属性が追加されてます.意味はmodule外からはread onlyになるというものです.オブジェクト指向では非常に便利なので使いたいのですが,type内の変数には使えません.

gfortranがとにかく不完全

  • とにかく2003の機能は不安定です.ver5.0台は全然駄目なようなので今回はver4.8でコンパイルしてます.一部駄目な機能もありますが,今のコードでは回るようにしております.
  • 2003の機能をフルで使いたいならintelは必須かも.

その他

  • 先日の打ち合わせ時の話も徐々に進めております.ちょっと離散化がうまくいかないため,また相談します.