Fortranでオブジェクト指向(11)
本日のポイント FortranとFORTRANの共存
FortranとFORTRAN
FORTRAN77までのFORTRANでは固定形式大文字表記が基本でした。
言語名も大文字でFORTRAN66とかFORTRAN77のように大文字で記述され、
ファイル名の拡張子も.Fが付くのが通例でした。
尤もHDDが一般化してきてパンチカードなどというものが知られなくなるころから
このルールは曖昧になってきていたのも事実です。
このようなタイミングで登場したFortran90はこれらのルールを大幅に更新して
言語名はFortranのように大文字で始まり小文字で記載、
プログラム本体は基本小文字で記述する自由形式となりました。
またファイル名の拡張子は.f90が付けることとなりました。
二つの共存
FortranとFORTRANを共存させる場合は基本的には下位互換性を
保っているFortranプログラムの中に古いFORTRANのルーチンを含める
ことになります。当然逆はできません。
共存させる場合のポイントは
・共存するルーチンを極力少なくする
・もし書換が必要なら新しい方に合わせる(FORTRANプログラムを新規にしない)
・メモリリソースの使い惜しみをしない
などです。特に3つ目のポイントはミッションクリティカルなプログラムで
リソース管理(または限界を気にする)が必要なプログラムでない限りは
メモリリソースを惜しまず、2重にデータを持つことも厭うべきではありません。
こうすることでプログラムを書きやすくなりますし、そこまでリソースを要求される
プログラムであれば過去のプログラムを使いまわすよりも、アルゴリズムは
そのままで新しいFortranプログラムに更新するべきです。
コメントについて
もし何かの都合で.f90に.Fのプログラムを記載する場合コメントは!に置換する
必要があります。自由形式のプログラムなので行先頭のCはコメントとは
認識されずエラーになります。
可能ならば.f90に.Fのプログラムを書き込むのは避ける方が無難です。
サンプルプログラム
module point_3d
type point
double precision x, y, z
end type
type(point), allocatable :: pt(:,:,:)
end module
program main
use point_3d
implicit none
integer i, j, k, ni, nj, nk
! ここで古いFORTRANのサブルーチンを呼び出す(mainには一切古い形式のFORTRANを書かない)
call matrix
! データをFORTRANからFortranに受け渡すサブルーチンbridgeを呼び出す
call bridge(ni, nj, nk)
! 保存されたpoint_3d構造体のデータを使って処理
! call proc(ni, nj, nk)
stop
end program main
subroutine bridge(nii,njj,nkk)
use point_3d
implicit none
! 古いFORTRANサブルーチンのcommon文に関するパラメータ設定
! FORTRANとFortranが同居するのはこのサブルーチンのみに限定する
integer, parameter :: ni = 50, nj = 50, nk = 50
double precision x, y, z
common/points/x(ni,nj,nk), y(ni,nj,nk), z(ni,nj,nk)
integer i, j, k,nii, njj, nkk
nii = ni
njj = nj
nkk = nk
if(allocated(pt)) deallocate(pt)
allocate(pt(ni,nj,nk))
! 古いFORTRANサブルーチンのcommonデータをpoint_3d構造体のpt配列に代入して受け渡し
pt(:,:,:)%x = x(:,:,:)
pt(:,:,:)%y = y(:,:,:)
pt(:,:,:)%z = z(:,:,:)
return
end subroutine bridge
! 以下、今となっては非推奨満載※のFORTRANサブルーチン
SUBROUTINE MATRIX
IMPLICIT REAL*8(A-H,O-Z)
PARAMETER(NI=50, NJ=50, NK=50)
COMMON/POINTS/X(NI,NJ,NK), Y(NI,NJ,NK), Z(NI,NJ,NK)
c 何らかの過去の遺産がここに含まれる
RETURN
END
今日はここまでにします。