Class | x_base_module |
In: |
setup/x_base_module.f90
|
x_base_module は, 1 次元 (x 方向) 等間隔交互格子を用いた有限差分 法に基づく数値モデルのための, 基本的な Fortran90 副プログラムおよび 関数を提供する.
このモジュールは x_module の下位モジュールである. 下請けモジュール として data_type モジュールを用いている.
Function : | |||
AvrX_p : | real(DBKIND)
| ||
p_Var(imin:imax) : | real(DBKIND), intent(in)
|
整数格子上の配列に対し x 方向の平均操作を行う
function AvrX_p(p_Var) ! 整数格子上の配列に対し x 方向の平均操作を行う real(DBKIND), intent(in) :: p_Var(imin:imax) ! 入力 real(DBKIND) :: AvrX_p ! 出力 AvrX_p = IntX_p(p_Var)/sum(p_dx(1:im)) end function AvrX_p
Function : | |||
AvrX_x : | real(DBKIND)
| ||
x_Var(imin:imax) : | real(DBKIND), intent(in)
|
半整数格子上の配列に対し x 方向の平均操作を行う
function AvrX_x(x_Var) ! 半整数格子上の配列に対し x 方向の平均操作を行う real(DBKIND), intent(in) :: x_Var(imin:imax) ! 入力 real(DBKIND) :: AvrX_x ! 出力 AvrX_x = IntX_x(x_Var)/sum(x_dx(1:im)) end function AvrX_x
Function : | |||
IntX_p : | real(DBKIND)
| ||
p_Var(imin:imax) : | real(DBKIND), intent(in)
|
整数格子上の配列に対し x 方向に重み付きの積分を行う
function IntX_p(p_Var) ! 整数格子上の配列に対し x 方向に重み付きの積分を行う real(DBKIND), intent(in) :: p_Var(imin:imax) ! 入力 real(DBKIND) :: IntX_p ! 出力 ! 初期化 IntX_p = 0.0d0 ! 積分 IntX_p = sum(p_Var(1:im)*p_dx(1:im)) end function IntX_p
Function : | |||
IntX_x : | real(DBKIND)
| ||
x_Var(imin:imax) : | real(DBKIND), intent(in)
|
半整数格子上の配列に対し x 方向に重み付きの積分を行う
function IntX_x(x_Var) ! 半整数格子上の配列に対し x 方向に重み付きの積分を行う real(DBKIND), intent(in) :: x_Var(imin:imax) ! 入力 real(DBKIND) :: IntX_x ! 出力 real(DBKIND), allocatable:: work(:) ! 初期化 IntX_x = 0.0d0 allocate(work(imin:imax)) ! 積分 work = x_Var*x_dx IntX_x = sum(work(1:im)) deallocate(work) end function IntX_x
Function : | |||
p_avr_x(imin:imax) : | real(DBKIND)
| ||
x_Var(imin:imax) : | real(DBKIND),intent(in)
|
平均操作を行い半整数格子点の配列値を整数格子点上へ返す
function p_avr_x(x_Var) ! 平均操作を行い半整数格子点の配列値を整数格子点上へ返す real(DBKIND),intent(in) :: x_Var(imin:imax) ! 入力 real(DBKIND) :: p_avr_x(imin:imax) ! 出力 integer :: ix ! ループ添字 ! 初期化 ! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき ! p_avr_x = 0.0d0 ! 平均操作 ! * 平均がとれない imax 格子上の値は計算しない. ! * 不等間隔格子なので重みをつけて平均する. ! 点 P, Q を a:b に内分する点の X の値は, a*X(Q) + b*X(P) ! (a+b=1 を仮定) であることから, ! ! p_Var(ix) = [0.5*x_dx(ix) /p_dx(ix)]*x_Var(ix+1) + ! [0.5*x_dx(ix+1)/p_dx(ix)]*x_Var(ix) ! ! 変形すると ! ! p_Var(ix) = [x_dx(ix)*x_Var(ix+1) + x_dx(ix+1)*x_Var(ix)] ! *0.5/p_dx(ix) ! do ix = imin, imax-1 p_avr_x(ix) = (x_dx(ix)*x_Var(ix+1) + x_dx(ix+1)*x_Var(ix))*0.5d0/p_dx(ix) end do ! imax 格子点上の値 p_avr_x(imax) = p_avr_x(imax-1) end function p_avr_x
Function : | |||
x_avr_p(imin:imax) : | real(DBKIND)
| ||
p_Var(imin:imax) : | real(DBKIND),intent(in)
|
平均操作を行い整数格子点の配列値を半整数格子点上へ返す
function x_avr_p(p_Var) ! 平均操作を行い整数格子点の配列値を半整数格子点上へ返す real(DBKIND),intent(in) :: p_Var(imin:imax) ! 入力 real(DBKIND) :: x_avr_p(imin:imax) ! 出力 integer :: ix ! ループ添字 ! 初期化 ! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき ! x_avr_p = 0.0d0 ! 平均操作 ! * 平均がとれない imin 格子上の値は計算しない. ! do ix = imin+1, imax x_avr_p(ix) = (p_Var(ix) + p_Var(ix-1))*0.5d0 end do ! imin 格子上の値 x_avr_p(imin) = x_avr_p(imin+1) end function x_avr_p
Subroutine : | |||
i : | integer,intent(in)
| ||
xmg : | integer,intent(in)
| ||
xmin : | real(DBKIND),intent(in)
| ||
xmax : | real(DBKIND),intent(in)
|
配列の上下限の値と格子点座標値, 格子点間隔を設定する
subroutine x_axis_init(i, xmg, xmin, xmax) ! 配列の上下限の値と格子点座標値, 格子点間隔を設定する integer,intent(in) :: i ! x 方向格子点数 integer,intent(in) :: xmg ! x 方向糊代格子点数 real(DBKIND),intent(in) :: xmin ! x 座標最小値 real(DBKIND),intent(in) :: xmax ! x 座標最大値 integer :: ix ! do ループ添字 real(DBKIND) :: dx ! 格子間隔 im = i xmargin = xmg imin = 1 - xmargin imax = im + xmargin allocate(x_X(imin:imax)) allocate(p_X(imin:imax)) allocate(x_dx(imin:imax)) allocate(p_dx(imin:imax)) dx = (xmax - xmin)/im do ix = imin, imax ! p_X(ix) = dx * ix + myrank * dx * imax ! x_X(ix) = dx * (ix - 0.5) + myrank * dx * imax p_X(ix) = dx * ix x_X(ix) = dx * (ix - 0.5) x_dx(ix) = dx p_dx(ix) = dx end do end subroutine x_axis_init