Mercurial > op > rk_sakamoti
diff rkmain.f90 @ 1:954faa9f6837
separate output from calcuration.
author | "uncorrelated zombie" <uncorrelated@yahoo.co.jp> |
---|---|
date | Sun, 21 Jul 2024 02:08:58 +0900 |
parents | 5bd0f2a15d2a |
children | 206e90e91191 |
line wrap: on
line diff
--- a/rkmain.f90 Tue Jul 23 02:30:57 2024 +0900 +++ b/rkmain.f90 Sun Jul 21 02:08:58 2024 +0900 @@ -3,18 +3,15 @@ implicit none real(kind=dpkind),dimension(3) :: x !状態変数 type(rk) :: rktype !ルンゲクッタ法ソルバに関連する型 + real(kind=dpkind),allocatable,dimension(:,:) :: r + real(kind=dpkind) :: max_t - !微分方程式の右辺を計算する関数、解法、時間刻みの指定 - call rktype%setup(rhside,"rk4",1d-5) !初期値の指定 - x=[0.5e0,0.5e0,0.5e0] - !時刻0?50秒まで、0.01秒毎に標準出力へ書き出し。 - !ただし、内部的には刻み幅1e-5秒としている。 - do - if(rktype%time>5e1)exit - call rktype%solver(rktype%time+1e-2,x) !積分実行 - print*,rktype%time,x - enddo + x = [0.5e0,0.5e0,0.5e0] + max_t = 5e1 + call calc(x, max_t, r) + print *, r; + !======================================== contains !微分方程式の右辺を定義 @@ -28,4 +25,25 @@ rhside(2)=b*wk(1)-wk(2)-wk(1)*wk(3) rhside(3)=wk(1)*wk(2)-c*wk(3) end function + !Rから呼び出すサブルーチン + subroutine calc(x, max_t, r) + implicit none + real(kind=dpkind),dimension(3),intent(in) :: x + real(kind=dpkind),intent(in) :: max_t + real(kind=dpkind),allocatable,dimension(:,:),intent(out) :: r + real(kind=dpkind) :: zero = 0 + integer i, max_i + !微分方程式の右辺を計算する関数、解法、時間刻みの指定 + call rktype%setup(rhside,"rk4",1d-5) + max_i = int(max_t / 0.01) + allocate(r(0:max_i, 4)) + !時刻max_t秒まで、0.01秒毎に配列に記録。 + !ただし、内部的には刻み幅1e-5秒としている。 + r(0, :) = [zero, x] ! 開始点 + do i = 1, max_i + call rktype%solver(rktype%time+1e-2,x) !積分実行 + r(i, :) = [rktype%time, x] + end do + end subroutine end program +