Fortranでオブジェクト指向(9)
本日のポイント 構造体の継承
2次元や3次元空間データを扱う場合に2次元で座標値2つ、3次元では3つになります。
この時、プログラム上の考え方は
1. 2次元の場合も3次元として扱って座標を保存する構造体を1つ定義する
2. 2次元と3次元では別のデータと考え、2つの構造体を定義する
のいずれかに加えて
3. 2次元データ構造体を継承した3次元データ構造体を定義する
があります。3.はオブジェクト指向ならではの考え方です。
サンプルプログラム
TYPE pt
double precision x
double precision y
END TYPE
TYPE, EXTENTDS(pt) :: pt_3d
double precision z
END TYPE
継承はEXTENTDS属性を指定する
構造体の継承はEXTENTDS属性で継承する元の構造体名を指定します。
但し、流体解析などの場合は継承する方が良いか、構造体を入れ子に
するほうが良いか好みが分かれる場合もあります。
例えば各点の座標と物理量を保存する構造体を考えるとき
構造体の入れ子を使ったサンプル1と継承を使ったサンプル2が考えられます。
サンプル1の場合値へのアクセスはpt_val構造体型の配列をVALUE(:)とすると
VALUE(:)%point%x
VALUE(:)%value%u
のようにアクセスすることになります。サンプル2の場合
VALUE(:)%x
VALUE(:)%u
となります。プログラムは短い方が良いという大原則から言えばサンプル2が
よいと考えるケースもありますが、性質の異なる値がグルーピングされている
という論理的整合性を重視するならサンプル1を選ぶことになります。
いずれにしてもプログラムは書けますので好みで選ぶことになります。
(但し実行速度のシビアなチューニングが必要な場合では開発環境で
決まる場合もあります。)
サンプル1
TYPE pt
double precision x,y,z
END TYPE
TYPE val
double precision u, v, w
END TYPE
TYPE pt_val
TYPE(pt) point
TYPE(val) value
END TYPE
サンプル2
TYPE pt
double precision x,y,z
END TYPE
TYPE, EXTENDS(pt) pt_val
double precision u, v, w
END TYPE
今日はこれまでにします。