Class z_bc_module
In: util/z_bc_module.f90

1 次元 (z 方向) 不等間隔交互格子 有限差分モデル用 境界条件モジュール

概要

z_bc_module は, 1 次元 (z 方向) 不等間隔交互格子を用いた有限差分法に 基づく数値モデルのための, 境界条件設定 Fortran 90 副プログラムを提供 する.

このモジュールは z_module の下位モジュールである. 下請けモジュール として data_type, z_base_module モジュールを用いている.

手続きの命名法

境界条件を設定する副プログラムは

  Boundary[境界条件を示す文字列]_(入力配列の次元情報)

のように命名されている. 境界条件を示す文字列は以下の 3 つである.

  Sym  : 境界で対称
  Asym : 境界で反対称
  Cyc : 周期境界

Methods

Included Modules

dc_types z_base_module

Public Instance methods

Subroutine :
r_Var(kmin:kmax) :real(DBKIND),intent(inout)
: 入出力配列

1 次元 (z 方向) 配列に反対称境界条件を適用する.

[Source]

    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 方向) 配列に反対称境界条件を適用する.

[Source]

    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 方向) 配列に周期境界条件を適用する.

[Source]

    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 方向) 配列に周期境界条件を適用する.

[Source]

    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 方向) 配列に対称境界条件を適用する.

[Source]

    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 方向) 配列に対称境界条件を適用する.

[Source]

    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