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