Mercurial > op > rk_sakamoti
changeset 2:206e90e91191
make rkmod.f90
author | "uncorrelated zombie" <uncorrelated@yahoo.co.jp> |
---|---|
date | Sun, 21 Jul 2024 03:56:49 +0900 |
parents | 954faa9f6837 |
children | 2347cff808b0 |
files | rkmain.f90 rkmod.f90 |
diffstat | 2 files changed, 46 insertions(+), 43 deletions(-) [+] |
line wrap: on
line diff
--- a/rkmain.f90 Sun Jul 21 02:08:58 2024 +0900 +++ b/rkmain.f90 Sun Jul 21 03:56:49 2024 +0900 @@ -1,49 +1,13 @@ program rkmain - use rungekutta !ルンゲクッタ解法をまとめたモジュール + use rkmod implicit none - real(kind=dpkind),dimension(3) :: x !状態変数 - type(rk) :: rktype !ルンゲクッタ法ソルバに関連する型 - real(kind=dpkind),allocatable,dimension(:,:) :: r + real(kind=dpkind),dimension(3) :: x real(kind=dpkind) :: max_t - - !初期値の指定 - x = [0.5e0,0.5e0,0.5e0] - max_t = 5e1 - call calc(x, max_t, r) - print *, r; + real(kind=dpkind),allocatable,dimension(:,:) :: r - !======================================== - contains - !微分方程式の右辺を定義 - function rhside(self,time,wk) - class(rk),intent(inout) :: self !parameter - real(kind=dpkind) :: time - real(kind=dpkind),dimension(:) :: wk - real(kind=dpkind),dimension(size(wk)) :: rhside - real(kind=dpkind),parameter :: a=10e0,b=28e0,c=8e0/3e0 - rhside(1)=a*(wk(2)-wk(1)) - 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 + x = [0.5d0,0.5d0,0.5d0] + max_t = 5d1 + call calc(x, max_t, r) + print *, r end program
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rkmod.f90 Sun Jul 21 03:56:49 2024 +0900 @@ -0,0 +1,39 @@ +module rkmod + use rungekutta !繝ォ繝ウ繧イ繧ッ繝繧ソ隗」豕輔r縺セ縺ィ繧√◆繝「繧ク繝・繝シ繝ォ + implicit none + type(rk) :: rktype !繝ォ繝ウ繧イ繧ッ繝繧ソ豕輔た繝ォ繝舌↓髢「騾」縺吶k蝙 + !======================================== + contains + !蠕ョ蛻譁ケ遞句シ上ョ蜿ウ霎コ繧貞ョ夂セゥ + function rhside(self,time,wk) + class(rk),intent(inout) :: self !parameter + real(kind=dpkind) :: time + real(kind=dpkind),dimension(:) :: wk + real(kind=dpkind),dimension(size(wk)) :: rhside + real(kind=dpkind),parameter :: a=10e0,b=28e0,c=8e0/3e0 + rhside(1)=a*(wk(2)-wk(1)) + rhside(2)=b*wk(1)-wk(2)-wk(1)*wk(3) + rhside(3)=wk(1)*wk(2)-c*wk(3) + end function + !R縺九i蜻シ縺ウ蜃コ縺吶し繝悶Ν繝シ繝√Φ + 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 module +