1! <<< 注意 >>>
2! gfortran-4.3でコンパイルするためには内部手続きとして定義した関数はbisectionに渡
3! せない. ifortやgfortran-4.6ではちゃんとコンパイルできるが, 可搬性を考慮して関数
4! を別モジュール内で定義して用いることにする.
5module mod_equation
6 implicit none
7contains
8 ! 方程式
9 function f(x) result(ret)
10 implicit none
11 real(8), intent(in) :: x
12 real(8) :: ret
13
14 ret = x - cos(x)
15
16 return
17 endfunction f
18endmodule mod_equation
19
20! 関数やサブルーチンの引数渡し
21program sample
22 use mod_bisection
23 use mod_equation
24 implicit none
25
26 integer :: status
27 real(8) :: x1, x2, err
28
29 ! 二分法で方程式の解を求める(関数fを引数として渡す)
30 x1 = 0.0
31 x2 = 1.0
32 call bisection(f, x1, x2, err, status, maxit=20, tol=1.0e-6_8)
33
34 select case(status)
35 case(0)
36 write(*, fmt='(a)') 'Iteration converged !'
37 case(1)
38 write(*, fmt='(a)') 'Iteration did not converge !'
39 case(-1)
40 write(*, fmt='(a)') 'Error'
41 stop
42 case default
43 write(*, fmt='(a)') 'Unknown error'
44 stop
45 endselect
46
47 write(*, fmt='("Solution = ", e18.12, ", Error = ", e8.2)') x1, err
48
49 stop
50endprogram sample