program runoff_model !プログラムの宣言 implicit none real(8) k, p, a, t0, q0, dt, eps, t, qq, p !倍精度実数型変数の宣言 real(8) c, xi, xi1, fx, fdx !倍精度実数型変数の宣言 real(8) r(50), q(50) !倍精度実数型配列の宣言 integer n, j !整数型変数の宣言 read(*,*) k, p, a !標準入力からの読み込み read(*,*) t0, q0 !標準入力からの読み込み read(*,*) dt, eps !標準入力からの読み込み read(*,*) n !標準入力からの読み込み read(*,*) (r(j), j = 1, n) !標準入力からの読み込み t = t0 !初期時刻の設定 r(0) = 0.0d0 !初期降雨強度の設定 write(*,*) 'time r q qq' ! q0 = q0 * a / 3.6d0 !初期流出高の流量へ変換 write(*,*) t, r(0), q0, qq ! !計算開始 do j = 1, n !doループによりデータ数だけ計算する t = t + dt !時刻dtだけ進める c = k * q0 ** p / dt -q0 / 2.0d0 + r(j) !定数項Cの計算 xi1 = 0.001 !初期解を0.001に設定する 10 xi = xi1 !f(x)を求めるための準備 fx = k * xi ** p / dt + xi / 2.0d0 - c !f(x)を求める if ( abs(fx) < eps ) then !収束判定のためのif文 q(j) = xi !収束したならば、配列qに格納 qq = xi * a / 3.6d0 !流量に変換 write(*,*) t, r(j), q(j), qq !結果の出力 else !収束していない場合 fdx = k * p * xi ** (p - 1.0d0) / dt + 0.5 !fdxを計算 xi1 = xi - fx / fdx !新たにxi1を計算 goto 10 !文番号10へ飛び、反復計算を繰り返す end if !if文の終了 q0 = q(j) !求められたq(j)を次のステップの初期値とする end do !doループ終了 end program runoff_model !プログラム終了文