| Class | y_base_module |
| In: |
setup/y_base_module.f90
|
y_base_module は, 1 次元 (y 方向) 等間隔交互格子を用いた有限差分 法に基づく数値モデルのための基本的な Fortran90 副プログラムおよび 関数を提供する. このモジュールは y_module の下位モジュールである.
| Function : | |||
| AvrY_q : | real(DBKIND)
| ||
| q_Var(jmin:jmax) : | real(DBKIND), intent(in)
|
整数格子上の配列に対し y 方向の平均操作を行う
function AvrY_q(q_Var)
! 整数格子上の配列に対し y 方向の平均操作を行う
real(DBKIND), intent(in) :: q_Var(jmin:jmax) ! 入力
real(DBKIND) :: AvrY_q ! 出力
AvrY_q = IntY_q(q_Var)/sum(q_dy(1:jm))
end function AvrY_q
| Function : | |||
| AvrY_y : | real(DBKIND)
| ||
| y_Var(jmin:jmax) : | real(DBKIND), intent(in)
|
半整数格子上の配列に対し y 方向の平均操作を行う
function AvrY_y(y_Var)
! 半整数格子上の配列に対し y 方向の平均操作を行う
real(DBKIND), intent(in) :: y_Var(jmin:jmax) ! 入力
real(DBKIND) :: AvrY_y ! 出力
AvrY_y = IntY_y(y_Var)/sum(y_dy(1:jm))
end function AvrY_y
| Function : | |||
| IntY_q : | real(DBKIND)
| ||
| q_Var(jmin:jmax) : | real(DBKIND), intent(in)
|
整数格子上の配列に対し y 方向に重み付きの積分を行う
function IntY_q(q_Var)
! 整数格子上の配列に対し y 方向に重み付きの積分を行う
real(DBKIND), intent(in) :: q_Var(jmin:jmax) ! 入力
real(DBKIND) :: IntY_q ! 出力
! 初期化
IntY_q = 0.0d0
! 積分
IntY_q = sum(q_Var(1:jm)*q_dy(1:jm))
end function IntY_q
| Function : | |||
| IntY_y : | real(DBKIND)
| ||
| y_Var(jmin:jmax) : | real(DBKIND), intent(in)
|
半整数格子上の配列に対し y 方向に重み付きの積分を行う
function IntY_y(y_Var)
! 半整数格子上の配列に対し y 方向に重み付きの積分を行う
real(DBKIND), intent(in) :: y_Var(jmin:jmax) ! 入力
real(DBKIND) :: IntY_y ! 出力
! 初期化
IntY_y = 0.0d0
! 積分
IntY_y = sum(y_Var(1:jm)*y_dy(1:jm))
end function IntY_y
| Function : | |||
| q_avr_y(jmin:jmax) : | real(DBKIND)
| ||
| y_Var(jmin:jmax) : | real(DBKIND),intent(in)
|
平均操作を行い半整数格子点の配列値を整数格子点上へ返す
function q_avr_y(y_Var)
! 平均操作を行い半整数格子点の配列値を整数格子点上へ返す
real(DBKIND),intent(in) :: y_Var(jmin:jmax) ! 入力
real(DBKIND) :: q_avr_y(jmin:jmax) ! 出力
integer :: jy ! ループ添字
! 初期化
! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき
!
q_avr_y = 0.0d0
! 平均操作
! * 平均がとれない jmax 格子上の値は計算しない.
! * 不等間隔格子なので重みをつけて平均する.
! 点 P, Q を a:b に内分する点の X の値は, a*X(Q) + b*X(P)
! (a+b=1 を仮定) であることから,
!
! q_Var(jy) = [0.5*y_dy(jy) /q_dy(jy)]*y_Var(jy+1) +
! [0.5*y_dy(jy+1)/q_dy(jy)]*y_Var(jy)
!
! 変形すると
!
! q_Var(jy) = [y_dy(jy)*y_Var(jy+1) + y_dy(jy+1)*y_Var(jy)]
! *0.5/q_dy(jy)
!
do jy = jmin, jmax-1
q_avr_y(jy) = (y_dy(jy)*y_Var(jy+1) + y_dy(jy+1)*y_Var(jy))*0.5d0/q_dy(jy)
end do
! jmax 格子点の値
q_avr_y(jmax) = q_avr_y(jmax-1)
end function q_avr_y
| Function : | |||
| y_avr_q(jmin:jmax) : | real(DBKIND)
| ||
| q_Var(jmin:jmax) : | real(DBKIND),intent(in)
|
平均操作を行い整数格子点の配列値を半整数格子点上へ返す
function y_avr_q(q_Var)
! 平均操作を行い整数格子点の配列値を半整数格子点上へ返す
real(DBKIND),intent(in) :: q_Var(jmin:jmax) ! 入力
real(DBKIND) :: y_avr_q(jmin:jmax) ! 出力
integer :: jy ! ループ添字
! 初期化
! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき
!
y_avr_q = 0.0d0
! 平均操作
! * 平均がとれない jmin 格子上の値は計算しない.
!
do jy = jmin+1, jmax
y_avr_q(jy) = (q_Var(jy) + q_Var(jy-1))*0.5d0
end do
! jmin 格子点の値
y_avr_q(jmin) = y_avr_q(jmin+1)
end function y_avr_q
| Subroutine : | |||
| j : | integer,intent(in)
| ||
| ymg : | integer,intent(in)
| ||
| ymin : | real(DBKIND),intent(in)
| ||
| ymax : | real(DBKIND),intent(in)
|
y 方向の座標値と格子点間隔を設定する
subroutine y_axis_init(j, ymg, ymin, ymax)
! y 方向の座標値と格子点間隔を設定する
integer,intent(in) :: j ! y 方向格子点数
integer,intent(in) :: ymg ! y 方向糊代格子点数
real(DBKIND),intent(in) :: ymin ! y 座標最小値
real(DBKIND),intent(in) :: ymax ! y 座標最大値
integer :: jy ! ループ添字
real(DBKIND) :: dy
jm = j
ymargin = ymg
jmin = 1 - ymargin
jmax = jm + ymargin
allocate(y_Y(jmin:jmax))
allocate(q_Y(jmin:jmax))
allocate(y_dy(jmin:jmax))
allocate(q_dy(jmin:jmax))
dy = (ymax - ymin)/jm
do jy = jmin, jmax
q_Y(jy) = dy * jy
y_Y(jy) = dy * (jy - 0.5)
y_dy(jy) = dy
q_dy(jy) = dy
end do
end subroutine y_axis_init