!--------------------------------------------------------------------- ! Copyright (C) GFD Dennou Club, 2006. All rights reserved. !--------------------------------------------------------------------- ! != 1 次元 (z 方向) 不等間隔交互格子 有限差分モデル用 境界条件モジュール ! !* 履歴 ! * 2007/07/15 (小高正嗣) : 3D deepconv へ移植, dc_types を Use. ! * 2006/06/02 (小高正嗣) : x_bc_module より作成 ! module z_bc_module != 1 次元 (z 方向) 不等間隔交互格子 有限差分モデル用 境界条件モジュール ! !== 概要 ! ! z_bc_module は, 1 次元 (z 方向) 不等間隔交互格子を用いた有限差分法に ! 基づく数値モデルのための, 境界条件設定 Fortran 90 副プログラムを提供 ! する. ! ! このモジュールは z_module の下位モジュールである. 下請けモジュール ! として data_type, z_base_module モジュールを用いている. ! ! !== 手続きの命名法 ! ! 境界条件を設定する副プログラムは ! ! Boundary[境界条件を示す文字列]_(入力配列の次元情報) ! ! のように命名されている. 境界条件を示す文字列は以下の 3 つである. ! ! Sym : 境界で対称 ! Asym : 境界で反対称 ! Cyc : 周期境界 ! use dc_types, only : DBKIND => DP use z_base_module, only : km, zmargin, kmin, kmax implicit none private public :: BoundarySym_z, BoundaryAsym_z, BoundaryCyc_z public :: BoundarySym_r, BoundaryAsym_r, BoundaryCyc_r interface BoundaryCyc_z module procedure BoundaryCyc end interface interface BoundaryCyc_r module procedure BoundaryCyc end interface contains !-------------------------------------------------------------------- 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 !-------------------------------------------------------------------- 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 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 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 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 !-------------------------------------------------------------------- end module z_bc_module