Fortranでオブジェクト指向
Fortranでオブジェクト指向
Fortranというと一般的には「古い」、「枯れた」、「化石のような」プログラミング言語と考えられていますが
数値解析の分野では間違いなく現役バリバリの言語です。
スーパーコンピュータをはじめとする大規模計算機では第一選択肢ですし、
数値解析を行う上では過去の資産が豊富なFortranは有力です。
FORTRAN77と現在のFortran
とはいえ流石にFORTRAN77で改めてプログラムを書くのは得策ではありません。
過去の資産は引き継ぎつつ、新規にプログラムを各部分はオブジェクト指向プログラミングが
可能な新しいFortranを使うのが得策というものです。
数値解析という意味ではオブジェクト指向でプログラムを書くことそのものは重要では
ありませんが、
・プログラムの可読性
・シンプルな変数名の使用
・変数/サブルーチン/関数アクセスのカプセル化
など様々なメリットを享受できます。
TYPEとClassの使用
Fortranでオブジェクト指向プログラミングを進める場合TYPE定義とClass使用が基本になります。
以下にサンプルプログラムを示します。
MODULE facetMod
TYPE POINT
double precision x, y, z
END TYPE POINT
TYPE FACET
TYPE(POINT) pt(3)
CONTAINS
procedure :: print => print_facet
END TYPE FACET
CONTAINS
subroutine print_facet(this)
implicit none
CLASS(FACET), INTENT(INOUT) :: this
integer i
character(10), parameter :: header(3) = (/"1st point","2nd point","3rd point"/)
do i = 1, 3
write(6,'((a),3(f6.2,1x))') header(i), this%pt(i)%x, this%pt(i)%y, this%pt(i)%z
end do
return
end subroutine print_facet
END MODULE facetMod
program main
USE facetMod
implicit none
TYPE(FACET) afacet
afacet%pt(1)%x = 0.0d0
afacet%pt(1)%y = 0.0d0
afacet%pt(1)%z = 0.0d0
afacet%pt(2)%x = 1.0d0
afacet%pt(2)%y = 0.0d0
afacet%pt(2)%z = 0.0d0
afacet%pt(3)%x = 1.0d0
afacet%pt(3)%y = 1.0d0
afacet%pt(3)%z = 0.0d0
call afacet%print
read(5,*)
stop
end
次回以降の予告
私のようにFORTRAN77ネイティブの方には?が多いプログラムですが
構造体(Type)を使った3つの点をもつ三角形の面(=facet)を扱う
プログラムです。次回以降このプログラムを通して
Fortranでオブジェクト指向のプログラミングをするポイントを紹介します。