Fortran副プログラム(サブルーチン、モジュール関数)の扱い方

副プログラム

計算過程の複雑化したプログラムをメインのみで実行するのはミスが生じる原因となります。

副プログラムを利用することで、アルゴリズムごとの機能を明確化しましょう。

module subprog     !モジュールの宣言
implicit none
contains
subroutine A     !メインから分離させたプログラムAを書く
・・・
end subroutine A

subroutine B     !メインから分離させたプログラムBを書く
・・・
end subroutine B

end module subprog     !モジュール終了の宣言

main program C     !副プログラムを使ってメインを実行する
・・・
end program C

モジュール関数

副プログラムで関数を定義する方法。

function f(x) result(y)
real(8),intent(in)::x     !メインプログラムから引用する関数
real(8)::y
y=x**2.0d0    !xの2乗を計算する
end function f

半径1~5について球の体積を求めるプログラム

module subprog
implicit none
contains

function f(x) result(y)
real(8),intent(in)::x
real(8)::y,pi
pi=3.1415d0
y=(4.0d0*pi*x**3.0d0)/3.0d0
end function f

end module subprog

program main
use subprog
implicit none
real(8) :: h,y,x
integer :: k

do k=1,5
 h = 1.0d0
 x = dble(k) * h
 y = f(x)

 write(*, *) x, y
end do
end program main

1.0000000000000000  4.1886666666666672
2.0000000000000000  33.509333333333338
3.0000000000000000  113.09400000000001
4.0000000000000000  268.07466666666670
5.0000000000000000  523.58333333333337

ファイルの作成を行うプログラム

平方根を計算するプログラム。

副プログラムで平方根を計算してファイルに保存、メインプログラムでファイルを開いて出力する。

module subprog
implicit none
contains

function fort(x) result(y)
real(8),intent(in)::x
real(8)::y
open(10, file = 'model.txt')
y=sqrt(x)     !sqrtで平方根を計算する
write(10,*) y
close(10)

end function fort

end module subprog

program main
use subprog
implicit none
real(8) :: a,y
a=5.0d0
y=fort(a)
open(10, file = 'model.txt')
read(10,*) a
write(*,*) 'sq root=',a
close(10)

end program main

sq root= 2.2360679774997898

コメント