| Class | z_bc_module |
| In: |
util/z_bc_module.f90
|
z_bc_module は, 1 次元 (z 方向) 不等間隔交互格子を用いた有限差分法に 基づく数値モデルのための, 境界条件設定 Fortran 90 副プログラムを提供 する.
このモジュールは z_module の下位モジュールである. 下請けモジュール として data_type, z_base_module モジュールを用いている.
境界条件を設定する副プログラムは
Boundary[境界条件を示す文字列]_(入力配列の次元情報)
のように命名されている. 境界条件を示す文字列は以下の 3 つである.
Sym : 境界で対称 Asym : 境界で反対称 Cyc : 周期境界
| Subroutine : | |||
| r_Var(kmin:kmax) : | real(DBKIND),intent(inout)
|
1 次元 (z 方向) 配列に反対称境界条件を適用する.
subroutine BoundaryAsym_r(r_Var)
! 1 次元 (z 方向) 配列に反対称境界条件を適用する.
real(DBKIND),intent(inout) :: r_Var(kmin:kmax) ! 入出力配列
integer :: kz ! ループ添字
! 反対称境界条件を適用する
!
! ex.) km=5, zmargin=2 の場合 (kmin=-1, kmax=7)
!
! r -1 0 1 2 3 4 5 6 7
! |-:-|-:-|-:-|-:-|-:-|-:-|-:-|-:-|-:-|
! z -1 0 1 2 3 4 5 6 7
! <-------> <------->
! r_Var(kmin:0) と r_Var(km,kmax) の値を更新
!
! z_Var(0) = 0
! z_Var(-1) = - z_Var(1)
! z_Var(5) = 0
! z_Var(6) = - z_Var(4)
! z_Var(7) = - z_Var(3)
!
r_Var(0) = 0.0d0
r_Var(km) = 0.0d0
do kz = 1, zmargin-1
r_Var(-kz) = - r_Var(kz)
end do
do kz = 1, zmargin
r_Var(km+kz) = - r_Var(km-kz)
end do
end subroutine BoundaryAsym_r
| Subroutine : | |||
| z_Var(kmin:kmax) : | real(DBKIND),intent(inout)
|
1 次元 (z 方向) 配列に反対称境界条件を適用する.
subroutine BoundaryAsym_z(z_Var)
! 1 次元 (z 方向) 配列に反対称境界条件を適用する.
real(DBKIND),intent(inout) :: z_Var(kmin:kmax) ! 入出力配列
integer :: kz ! ループ添字
! 反対称境界条件を適用する
!
! ex.) km=5, zmargin=2 の場合 (kmin=-1, kmax=7)
!
! r -1 0 1 2 3 4 5 6 7
! |-:-|-:-|-:-|-:-|-:-|-:-|-:-|-:-|-:-|
! z -1 0 1 2 3 4 5 6 7
! <-------> <------->
! z_Var(kmin:0) と z_Var(km+1,kmax) の値を更新
!
! z_Var(0) = - z_Var(1)
! z_Var(-1) = - z_Var(2)
! z_Var(6) = - z_Var(5)
! z_Var(7) = - z_Var(4)
!
do kz = 1, zmargin
z_Var(1-kz) = - z_Var(kz)
z_Var(km+kz) = - z_Var(km+1-kz)
end do
end subroutine BoundaryAsym_z
| Subroutine : | |||
| Var(kmin:kmax) : | real(DBKIND),intent(inout)
|
1 次元 (z 方向) 配列に周期境界条件を適用する.
subroutine BoundaryCyc(Var)
! 1 次元 (z 方向) 配列に周期境界条件を適用する.
real(DBKIND),intent(inout) :: Var(kmin:kmax) ! 入出力配列
integer :: kz ! ループ添字
! 周期界条件を適用する
!
! ex.) km=5, zmargin=2 の場合 (kmin=-1, kmax=7)
!
! r -1 0 1 2 3 4 5 6 7
! |-:-|-:-|-:-|-:-|-:-|-:-|-:-|-:-|-:-|
! z -1 0 1 2 3 4 5 6 7
! <-------> <------->
! z_Var(kmin:0) と z_Var(km+1,kmax) の値を更新
! r_Var(kmin:0) と r_Var(km+1,kmax) の値を更新
!
! z_Var(0) = z_Var(5)
! z_Var(-1) = z_Var(4)
! z_Var(6) = z_Var(1)
! z_Var(7) = z_Var(2)
!
! r_Var(0) = r_Var(5)
! r_Var(-1) = r_Var(4)
! r_Var(6) = r_Var(1)
! r_Var(7) = r_Var(2)
!
do kz = 1, zmargin
Var(1-kz) = Var(km+1-kz)
Var(km+kz) = Var(kz)
end do
end subroutine BoundaryCyc
| Subroutine : | |||
| Var(kmin:kmax) : | real(DBKIND),intent(inout)
|
1 次元 (z 方向) 配列に周期境界条件を適用する.
subroutine BoundaryCyc(Var)
! 1 次元 (z 方向) 配列に周期境界条件を適用する.
real(DBKIND),intent(inout) :: Var(kmin:kmax) ! 入出力配列
integer :: kz ! ループ添字
! 周期界条件を適用する
!
! ex.) km=5, zmargin=2 の場合 (kmin=-1, kmax=7)
!
! r -1 0 1 2 3 4 5 6 7
! |-:-|-:-|-:-|-:-|-:-|-:-|-:-|-:-|-:-|
! z -1 0 1 2 3 4 5 6 7
! <-------> <------->
! z_Var(kmin:0) と z_Var(km+1,kmax) の値を更新
! r_Var(kmin:0) と r_Var(km+1,kmax) の値を更新
!
! z_Var(0) = z_Var(5)
! z_Var(-1) = z_Var(4)
! z_Var(6) = z_Var(1)
! z_Var(7) = z_Var(2)
!
! r_Var(0) = r_Var(5)
! r_Var(-1) = r_Var(4)
! r_Var(6) = r_Var(1)
! r_Var(7) = r_Var(2)
!
do kz = 1, zmargin
Var(1-kz) = Var(km+1-kz)
Var(km+kz) = Var(kz)
end do
end subroutine BoundaryCyc
| Subroutine : | |||
| r_Var(kmin:kmax) : | real(DBKIND),intent(inout)
|
1 次元 (z 方向) 配列に対称境界条件を適用する.
subroutine BoundarySym_r(r_Var)
! 1 次元 (z 方向) 配列に対称境界条件を適用する.
real(DBKIND),intent(inout) :: r_Var(kmin:kmax) ! 入出力配列
integer :: kz ! ループ添字
! 対称境界条件を適用する
!
! ex.) km=5, zmargin=2 の場合 (kmin=-1, kmax=7)
!
! r -1 0 1 2 3 4 5 6 7
! |-:-|-:-|-:-|-:-|-:-|-:-|-:-|-:-|-:-|
! z -1 0 1 2 3 4 5 6 7
! <-------> <------->
! r_Var(kmin:-1) と r_Var(km+1:kmax) の値を更新
!
! r_Var(-1) = z_Var(1)
! r_Var(6) = z_Var(4)
! r_Var(7) = z_Var(3)
!
do kz = 1, zmargin-1
r_Var(-kz) = r_Var(kz)
end do
do kz = 1, zmargin
r_Var(km+kz) = r_Var(km+1-kz)
end do
end subroutine BoundarySym_r
| Subroutine : | |||
| z_Var(kmin:kmax) : | real(DBKIND),intent(inout)
|
1 次元 (z 方向) 配列に対称境界条件を適用する.
subroutine BoundarySym_z(z_Var)
! 1 次元 (z 方向) 配列に対称境界条件を適用する.
real(DBKIND),intent(inout) :: z_Var(kmin:kmax) ! 入出力配列
integer :: kz ! ループ添字
! 対称境界条件を適用する
!
! ex.) km=5, zmargin=2 の場合 (kmin=-1, kmax=7)
!
! r -1 0 1 2 3 4 5 6 7
! |-:-|-:-|-:-|-:-|-:-|-:-|-:-|-:-|-:-|
! z -1 0 1 2 3 4 5 6 7
! <-------> <------->
! z_Var(kmin:0) と z_Var(km+1,kmax) の値を更新
!
! z_Var(0) = z_Var(1)
! z_Var(-1) = z_Var(2)
! z_Var(6) = z_Var(5)
! z_Var(7) = z_Var(4)
!
do kz = 1, zmargin
z_Var(1-kz) = z_Var(kz)
z_Var(km+kz) = z_Var(km+1-kz)
end do
end subroutine BoundarySym_z