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でオブジェクト指向のプログラミングをするポイントを紹介します。





