| Class | z_base_module |
| In: |
setup/z_base_module.f90
|
z_base_module は, 1 次元 (z 方向) 等間隔交互格子を用いた有限差分 法に基づく数値モデルのための基本的な Fortran90 副プログラムおよび 関数を提供する. このモジュールは z_module の下位モジュールである.
| Function : | |||
| AvrZ_r : | real(DBKIND)
| ||
| r_Var(kmin:kmax) : | real(DBKIND), intent(in)
|
整数格子上の配列に対し z 方向の平均操作を行う
function AvrZ_r(r_Var)
! 整数格子上の配列に対し z 方向の平均操作を行う
real(DBKIND), intent(in) :: r_Var(kmin:kmax) ! 入力
real(DBKIND) :: AvrZ_r ! 出力
AvrZ_r = IntZ_r(r_Var)/sum(r_dz(1:km))
end function AvrZ_r
| Function : | |||
| AvrZ_z : | real(DBKIND)
| ||
| z_Var(kmin:kmax) : | real(DBKIND), intent(in)
|
半整数格子上の配列に対し z 方向の平均操作を行う
function AvrZ_z(z_Var)
! 半整数格子上の配列に対し z 方向の平均操作を行う
real(DBKIND), intent(in) :: z_Var(kmin:kmax) ! 入力
real(DBKIND) :: AvrZ_z ! 出力
AvrZ_z = IntZ_z(z_Var)/sum(z_dz(1:km))
end function AvrZ_z
| Function : | |||
| IntZ_r : | real(DBKIND)
| ||
| r_Var(kmin:kmax) : | real(DBKIND), intent(in)
|
整数格子上の配列に対し z 方向に重み付きの積分を行う
function IntZ_r(r_Var)
! 整数格子上の配列に対し z 方向に重み付きの積分を行う
real(DBKIND), intent(in) :: r_Var(kmin:kmax) ! 入力
real(DBKIND) :: IntZ_r ! 出力
! 初期化
IntZ_r = 0.0d0
! 積分
IntZ_r = sum(r_Var(1:km)*r_dz(1:km))
end function IntZ_r
| Function : | |||
| IntZ_z : | real(DBKIND)
| ||
| z_Var(kmin:kmax) : | real(DBKIND), intent(in)
|
半整数格子上の配列に対し z 方向に重み付きの積分を行う
function IntZ_z(z_Var)
! 半整数格子上の配列に対し z 方向に重み付きの積分を行う
real(DBKIND), intent(in) :: z_Var(kmin:kmax) ! 入力
real(DBKIND) :: IntZ_z ! 出力
! 初期化
IntZ_z = 0.0d0
! 積分
IntZ_z = sum(z_Var(1:km)*z_dz(1:km))
end function IntZ_z
| Function : | |||
| r_avr_z(kmin:kmax) : | real(DBKIND)
| ||
| z_Var(kmin:kmax) : | real(DBKIND),intent(in)
|
平均操作を行い半整数格子点の配列値を整数格子点上へ返す
function r_avr_z(z_Var)
! 平均操作を行い半整数格子点の配列値を整数格子点上へ返す
real(DBKIND),intent(in) :: z_Var(kmin:kmax) ! 入力
real(DBKIND) :: r_avr_z(kmin:kmax) ! 出力
integer :: kz ! ループ添字
! 初期化
! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき
!
r_avr_z = 0.0d0
! 平均操作
! * 平均がとれない kmax 格子上の値は計算しない.
! * 不等間隔格子なので重みをつけて平均する.
! 点 P, Q を a:b に内分する点の X の値は, a*X(Q) + b*X(P)
! (a+b=1 を仮定) であることから,
!
! r_Var(kz) = [0.5*z_dz(kz) /r_dz(kz)]*z_Var(kz+1) +
! [0.5*z_dz(kz+1)/r_dz(kz)]*z_Var(kz)
!
! 変形すると
!
! r_Var(kz) = [z_dz(kz)*z_Var(kz+1) + z_dz(kz+1)*z_Var(kz)]
! *0.5/r_dz(kz)
!
do kz = kmin, kmax-1
r_avr_z(kz) = (z_dz(kz)*z_Var(kz+1) + z_dz(kz+1)*z_Var(kz))*0.5d0/r_dz(kz)
end do
! kmax 格子の値
r_avr_z(kmax) = r_avr_z(kmax-1)
end function r_avr_z
| Function : | |||
| z_avr_r(kmin:kmax) : | real(DBKIND)
| ||
| r_Var(kmin:kmax) : | real(DBKIND),intent(in)
|
平均操作を行い整数格子点の配列値を半整数格子点上へ返す
function z_avr_r(r_Var)
! 平均操作を行い整数格子点の配列値を半整数格子点上へ返す
real(DBKIND),intent(in) :: r_Var(kmin:kmax) ! 入力
real(DBKIND) :: z_avr_r(kmin:kmax) ! 出力
integer :: kz ! ループ添字
! 初期化
! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき
!
z_avr_r = 0.0d0
! 平均操作
! * 平均がとれない kmin 格子上の値は計算しない.
!
do kz = kmin+1, kmax
z_avr_r(kz) = (r_Var(kz) + r_Var(kz-1))*0.5d0
end do
! kmin 格子の値
z_avr_r(kmin) = z_avr_r(kmin+1)
end function z_avr_r
| Subroutine : | |||
| k : | integer,intent(in)
| ||
| zmg : | integer,intent(in)
| ||
| zmin : | real(DBKIND),intent(in)
| ||
| zmax : | real(DBKIND),intent(in)
|
z 方向の座標値と格子点間隔を設定する
subroutine z_axis_init(k, zmg, zmin, zmax)
! z 方向の座標値と格子点間隔を設定する
integer,intent(in) :: k ! z 方向格子点数
integer,intent(in) :: zmg ! z 方向糊代格子点数
real(DBKIND),intent(in) :: zmin ! z 座標最小値
real(DBKIND),intent(in) :: zmax ! z 座標最大値
integer :: kz ! ループ添字
real(DBKIND) :: dz
km = k
zmargin = zmg
kmin = 1 - zmargin
kmax = km + zmargin
allocate(z_Z(kmin:kmax))
allocate(r_Z(kmin:kmax))
allocate(z_dz(kmin:kmax))
allocate(r_dz(kmin:kmax))
dz = (zmax - zmin)/km
do kz = kmin, kmax
r_Z(kz) = dz * kz
z_Z(kz) = dz * (kz - 0.5)
r_dz(kz) = dz
z_dz(kz) = dz
end do
end subroutine z_axis_init