Class axesset
In: ../src/setup/axesset.f90

3 次元 (xyz 方向) 等間隔交互格子 格子点設定モジュール

概要

axesset は, 3 次元 (xyz 方向) 等間隔交互格子を用いた有限差分法に基づく 数値モデルのための, 基本的な Fortran90 副プログラムおよび関数を提供する. 具体的に行っていることは以下の通り.

  • 格子点座標配列と格子点間隔配列の設定
  • 格子点配列の平均関数

Methods

DX   DY   DZ   Xmax   Xmin   Ymax   Ymin   Zmax   Zmin   axesset_init   p_X   p_dx   pqz_avr_pyz   pqz_avr_xqz   pqz_avr_xyz   pyr_avr_pyz   pyr_avr_xyr   pyr_avr_xyz   pyz_avr_pqz   pyz_avr_pyr   pyz_avr_xyz   q_Y   q_dy   r_Z   r_dz   x_X   x_dx   xqr_avr_xqz   xqr_avr_xyr   xqr_avr_xyz   xqz_avr_pqz   xqz_avr_xqr   xqz_avr_xyz   xyr_avr_pyr   xyr_avr_xqr   xyr_avr_xyz   xyz_X   xyz_Y   xyz_Z   xyz_avr_pqz   xyz_avr_pyr   xyz_avr_pyz   xyz_avr_xqr   xyz_avr_xqz   xyz_avr_xyr   xyz_dX   xyz_dY   xyz_dZ   y_Y   y_dy   z_Z   z_dz  

Included Modules

dc_types dc_iounit dc_message mpi_wrapper gridset namelist_util

Public Instance methods

DX
Variable :
DX :real(DP), public, save
DY
Variable :
DY :real(DP), public, save
DZ
Variable :
DZ :real(DP), public, save
Xmax
Variable :
Xmax = 1.0d4 :real(DP), public, save
: x 座標の始点・終点
Xmin
Variable :
Xmin = 0.0d0 :real(DP), public, save
: x 座標の始点・終点
Ymax
Variable :
Ymax = 1.0d4 :real(DP), public, save
: x 座標の始点・終点
Ymin
Variable :
Ymin = 0.0d0 :real(DP), public, save
: x 座標の始点・終点
Zmax
Variable :
Zmax = 1.0d4 :real(DP), public, save
: z 座標の始点・終点
Zmin
Variable :
Zmin = 0.0d0 :real(DP), public, save
: z 座標の始点・終点
Subroutine :

格子点座標配列と格子点間隔配列の初期化

This procedure input/output NAMELIST#axesset_nml .

[Source]

  subroutine axesset_init
    ! 格子点座標配列と格子点間隔配列の初期化    

    ! 暗黙の型宣言禁止
    implicit none

    ! 変数定義
    real(DP),allocatable :: xy_X(:,:)! x 座標(半整数格子, 作業配列)
    real(DP),allocatable :: xy_Y(:,:)! y 座標(半整数格子, 作業配列)
    real(DP),allocatable :: yz_Z(:,:)! z 座標(半整数格子, 作業配列)
    integer              :: unit     ! 設定ファイル用装置番号
    integer              :: comm_cart
    logical, parameter   :: periodic = .false.

    !設定ファイルから読み込む出力ファイル情報
    NAMELIST /axesset_nml/ xmin, xmax, ymin, ymax, zmin, zmax

    !設定ファイルから出力ファイルに記載する情報を読み込む
    call FileOpen(unit, file=namelist_filename, mode='r')
    read(unit, NML=axesset_nml)
    close(unit)
    
    ! 配列の上下限の値, 座標値と格子点間隔を設定
    ! * 1 次元用のサブルーチンを用いる
    !
    call MPIWrapperCartCreate(xsub, ysub, periodic, comm_cart)
    call x_axis_init(comm_cart)
    call y_axis_init(comm_cart)
    call z_axis_init
    call MPIWrapperCommFree(comm_cart)
    
    ! 3 次元格子点座標配列の設定
    ! * 組み込み関数 spread を用いる. 
    ! * 中間配列として 2 次元格子点座標配列を作り, それを 3 次元に拡張する.
    ! 
    allocate(xy_X(imin:imax,jmin:jmax))
    allocate(xy_Y(imin:imax,jmin:jmax))
    allocate(yz_Z(jmin:jmax,kmin:kmax))
    
    allocate(xyz_X(imin:imax,jmin:jmax,kmin:kmax))
    allocate(xyz_Y(imin:imax,jmin:jmax,kmin:kmax))
    allocate(xyz_Z(imin:imax,jmin:jmax,kmin:kmax))
    allocate(xyz_dX(imin:imax,jmin:jmax,kmin:kmax))
    allocate(xyz_dY(imin:imax,jmin:jmax,kmin:kmax))
    allocate(xyz_dZ(imin:imax,jmin:jmax,kmin:kmax))
    
    xy_X  = spread(x_X, 2,size(y_Y))
    xyz_X = spread(xy_X,3,size(z_Z))
    
    xy_X   = spread(x_dX, 2,size(y_dY))
    xyz_dX = spread(xy_X,3,size(z_dZ))
    
    xy_Y  = spread(y_Y, 1,size(x_X))
    xyz_Y = spread(xy_Y,3,size(z_Z))
    
    xy_Y   = spread(y_dY, 1,size(x_dX))
    xyz_dY = spread(xy_Y,3,size(z_dZ))
    
    yz_Z  = spread(z_Z, 1,size(y_Y))
    xyz_Z = spread(yz_Z,1,size(x_X))
    
    yz_Z   = spread(z_dZ, 1,size(y_dY))
    xyz_dZ = spread(yz_Z,1,size(x_dX))
    
    deallocate(xy_X)
    deallocate(xy_Y)
    deallocate(yz_Z)

    !"myrank == 0" に該当する計算ノードが, 読み込んだ情報を出力
    if (myrank == 0) then 
      call MessageNotify( "M", "axesset_init", "XMin = %f", d=(/XMin/)    )
      call MessageNotify( "M", "axesset_init", "XMax = %f", d=(/XMax/)    )
      call MessageNotify( "M", "axesset_init", "YMin = %f", d=(/YMin/)    )
      call MessageNotify( "M", "axesset_init", "YMax = %f", d=(/YMax/)    )
      call MessageNotify( "M", "axesset_init", "ZMin = %f", d=(/ZMin/)    )
      call MessageNotify( "M", "axesset_init", "ZMax = %f", d=(/ZMax/)    )
      call MessageNotify( "M", "axesset_init", "dx = %f", d=(/dx/)    )
      call MessageNotify( "M", "axesset_init", "dy = %f", d=(/dy/)    )
      call MessageNotify( "M", "axesset_init", "dz = %f", d=(/dz/)    )
    end if
  
  end subroutine axesset_init
p_X
Variable :
p_X(:) :real(DP), allocatable, public, save
: 整数格子点座標
p_dx
Variable :
p_dx(:) :real(DP), allocatable, public, save
: 整数格子点間隔
Function :
aqa_aya(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aya_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い y 方向の整数格子点の配列値を半整数格子点上へ返す

平均操作: y 座標から q 座標へ返す. jmax の値は陽に代入する.

   q     jmin    0     1         jmax-1  jmax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   y  jmin   0      1         jmax-1  jmax

[Source]

  function aqa_aya(aya_Var)
    !
    != 平均操作を行い y 方向の整数格子点の配列値を半整数格子点上へ返す
    !
    ! 平均操作: y 座標から q 座標へ返す. jmax の値は陽に代入する.
    !
    !    q     jmin    0     1         jmax-1  jmax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    y  jmin   0      1         jmax-1  jmax
    !
    
    ! 暗黙の型宣言禁止
    implicit none

    real(DP),intent(in) :: aya_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: aqa_aya(imin:imax,jmin:jmax,kmin:kmax) 
    integer             :: i, j, k

    if ( FlagCalc3D ) then 
      do k = kmin, kmax
        do j = jmin, jmax-1  
          do i = imin, imax
            aqa_aya(i,j,k) = ( aya_Var(i,j+1,k) + aya_Var(i,j,k) ) * 0.5d0
          end do
        end do
      end do
      
      ! jmax 格子上の値
      aqa_aya(:,jmax,:) = 1.0d10

    else
    
      ! 2 次元計算(y 方向の配列要素数が 1)の場合, 代入値をそのまま返す
      aqa_aya = aya_Var
      return

    end if
    
    
  end function aqa_aya
Function :
paa_xaa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xaa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点の配列値を整数点上へ返す

平均操作: x 座標から p 座標へ返す. imax の値は陽に代入する.

   p     imin    0     1         imax-1  imax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   x  imin   0      1         imax-1  imax

[Source]

  function paa_xaa(xaa_Var)
    !
    != 半整数格子点の配列値を整数点上へ返す
    !
    ! 平均操作: x 座標から p 座標へ返す. imax の値は陽に代入する.
    !     
    !    p     imin    0     1         imax-1  imax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    x  imin   0      1         imax-1  imax
    !
    
    ! 暗黙の型宣言禁止
    implicit none

    real(DP),intent(in) :: xaa_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: paa_xaa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k

    do k = kmin, kmax
      do j = jmin, jmax    
        do i = imin, imax-1
          paa_xaa(i,j,k) = ( xaa_Var(i+1,j,k) + xaa_Var(i,j,k) ) * 0.5d0
        end do
      end do
    end do
    
    ! imax 格子上の値
    paa_xaa(imax,:,:) = 1.0d10
    
  end function paa_xaa
Function :
pqz_xyz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
: 出力
xyz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP), intent(in)
: 入力

XY 平面において, 半整数格子 (xy) から整数格子 (pq) へ変換

[Source]

  function pqz_xyz(xyz_Var)
    !
    != XY 平面において, 半整数格子 (xy) から整数格子 (pq) へ変換
    !

    ! 暗黙の型宣言禁止
    implicit none

    real(DP), intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax)  ! 入力
    real(DP)             :: pqz_xyz(imin:imax,jmin:jmax,kmin:kmax)  ! 出力
    integer              :: i, j, k                                 ! ループ添字

    if ( FlagCalc3D ) then 
      ! 3 次元の計算
      !
      do k = kmin, kmax
        do j = jmin, jmax-1
          do i = imin, imax-1
            pqz_xyz(i,j,k) = ( xyz_Var(i,   j,   k) + xyz_Var(i+1, j,   k) + xyz_Var(i,   j+1, k) + xyz_Var(i+1, j+1, k) ) * 0.25d0 
          end do
        end do
      end do
      
      ! imax 格子上の値
      pqz_xyz(imax,:,:) = 1.0d10
      ! jmax 格子上の値
      pqz_xyz(:,jmax,:) = 1.0d10
      
    else
      ! 2 次元計算 (y 方向の配列要素数が 1) の場合
      !
      do k = kmin, kmax
        do j = jmin, jmax    
          do i = imin, imax-1
            pqz_xyz(i,j,k) = ( xyz_Var(i,   j, k) + xyz_Var(i+1, j, k) ) * 0.5d0 
          end do
        end do
      end do

      ! imax 格子上の値
      pqz_xyz(imax,:,:) = 1.0d10
      
    end if
        
  end function pqz_xyz
Function :
aar_aaz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aaz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い z 方向半整数格子点の配列値を整数格子点上へ返す

平均操作: z 座標から r 座標へ返す. zmax の値は陽に代入する.

   r     kmin    0     1         kmax-1  kmax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   z  kmin   0      1         kmax-1  kmax

[Source]

  function aar_aaz(aaz_Var)
    !
    != 平均操作を行い z 方向半整数格子点の配列値を整数格子点上へ返す
    !
    ! 平均操作: z 座標から r 座標へ返す. zmax の値は陽に代入する.
    !
    !    r     kmin    0     1         kmax-1  kmax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    z  kmin   0      1         kmax-1  kmax
    !
    
    ! 暗黙の型宣言禁止
    implicit none
    
    real(DP),intent(in) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax) 
    real(DP)            :: aar_aaz(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k
    
    do k = kmin, kmax-1
      do j = jmin, jmax    
        do i = imin, imax
          aar_aaz(i,j,k) = ( aaz_Var(i,j,k+1) + aaz_Var(i,j,k) ) * 0.5d0
        end do
      end do
    end do
    
    ! kmax 格子上の値
    aar_aaz(:,:,kmax) = 1.0d10
    
  end function aar_aaz
Function :
paa_xaa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xaa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点の配列値を整数点上へ返す

平均操作: x 座標から p 座標へ返す. imax の値は陽に代入する.

   p     imin    0     1         imax-1  imax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   x  imin   0      1         imax-1  imax

[Source]

  function paa_xaa(xaa_Var)
    !
    != 半整数格子点の配列値を整数点上へ返す
    !
    ! 平均操作: x 座標から p 座標へ返す. imax の値は陽に代入する.
    !     
    !    p     imin    0     1         imax-1  imax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    x  imin   0      1         imax-1  imax
    !
    
    ! 暗黙の型宣言禁止
    implicit none

    real(DP),intent(in) :: xaa_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: paa_xaa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k

    do k = kmin, kmax
      do j = jmin, jmax    
        do i = imin, imax-1
          paa_xaa(i,j,k) = ( xaa_Var(i+1,j,k) + xaa_Var(i,j,k) ) * 0.5d0
        end do
      end do
    end do
    
    ! imax 格子上の値
    paa_xaa(imax,:,:) = 1.0d10
    
  end function paa_xaa
Function :
pyr_xyz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
: 出力
xyz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP), intent(in)
: 入力

XZ 平面において半整数格子 (xz) から整数格子 (pr) への変換を行う

[Source]

  function pyr_xyz(xyz_Var)
    !
    != XZ 平面において半整数格子 (xz) から整数格子 (pr) への変換を行う
    !

    ! 暗黙の型宣言禁止
    implicit none

    real(DP), intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: pyr_xyz(imin:imax,jmin:jmax,kmin:kmax) ! 出力
    integer              :: i, j, k                                ! ループ添字
    
    do k = kmin, kmax-1
      do j = jmin, jmax
        do i = imin, imax-1
          pyr_xyz(i,j,k) = ( + xyz_Var(i,   j, k  ) + xyz_Var(i+1, j, k  ) + xyz_Var(i,   j, k+1) + xyz_Var(i+1, j, k+1) ) * 0.25d0 
        end do
      end do
    end do

    ! imax 格子上の値
    pyr_xyz(imax,:,:) = 1.0d10
    ! kmax 格子上の値
    pyr_xyz(:,:,kmax) = 1.0d10

    
  end function pyr_xyz
Function :
aya_aqa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aqa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す

平均操作: q 座標から y 座標へ返す. jmin の値は陽に代入する.

   q     jmin    0     1         jmax-1  jmax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   y  jmin   0      1         jmax-1  jmax

[Source]

  function aya_aqa(aqa_Var)
    !
    != 平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
    !
    ! 平均操作: q 座標から y 座標へ返す. jmin の値は陽に代入する.
    !
    !    q     jmin    0     1         jmax-1  jmax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    y  jmin   0      1         jmax-1  jmax
    !
    
    ! 暗黙の型宣言禁止
    implicit none

    real(DP),intent(in) :: aqa_Var(imin:imax,jmin:jmax,kmin:kmax)   
    real(DP)            :: aya_aqa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k 
 
    if ( FlagCalc3D ) then 
      do k = kmin, kmax
        do j = jmin+1, jmax    
          do i = imin,   imax
            aya_aqa(i,j,k) = ( aqa_Var(i,j,k) + aqa_Var(i,j-1,k) ) * 0.5d0 
          end do
        end do
      end do
      
      ! jmin 格子上の値
      aya_aqa(:,jmin,:) = 1.0d10

    else      
      ! 2 次元計算(y 方向の配列要素数が 1)の場合, 代入値をそのまま返す
      aya_aqa = aqa_Var
      return
      
    end if   
    
  end function aya_aqa
Function :
aaz_aar(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aar_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い z 方向整数格子点の配列値を半整数格子点上へ返す

平均操作: r 座標から z 座標へ返す. zmin の値は陽に代入する.

   r     kmin    0     1         kmax-1  kmax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   z  kmin   0      1         kmax-1  kmax

[Source]

  function aaz_aar(aar_Var)
    !
    != 平均操作を行い z 方向整数格子点の配列値を半整数格子点上へ返す
    !
    ! 平均操作: r 座標から z 座標へ返す. zmin の値は陽に代入する.
    !
    !    r     kmin    0     1         kmax-1  kmax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    z  kmin   0      1         kmax-1  kmax
    !
    
    ! 暗黙の型宣言禁止
    implicit none

    real(DP),intent(in) :: aar_Var(imin:imax,jmin:jmax,kmin:kmax)   
    real(DP)            :: aaz_aar(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k
    
    do k = kmin+1, kmax
      do j = jmin, jmax    
        do i = imin, imax
          aaz_aar(i,j,k) = ( aar_Var(i,j,k) + aar_Var(i,j,k-1) ) * 0.5d0 
        end do
      end do
    end do
    
    ! kmin 格子上の値
    aaz_aar(:,:,kmin) = 1.0d10
    
  end function aaz_aar
Function :
paa_xaa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xaa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点の配列値を整数点上へ返す

平均操作: x 座標から p 座標へ返す. imax の値は陽に代入する.

   p     imin    0     1         imax-1  imax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   x  imin   0      1         imax-1  imax

[Source]

  function paa_xaa(xaa_Var)
    !
    != 半整数格子点の配列値を整数点上へ返す
    !
    ! 平均操作: x 座標から p 座標へ返す. imax の値は陽に代入する.
    !     
    !    p     imin    0     1         imax-1  imax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    x  imin   0      1         imax-1  imax
    !
    
    ! 暗黙の型宣言禁止
    implicit none

    real(DP),intent(in) :: xaa_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: paa_xaa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k

    do k = kmin, kmax
      do j = jmin, jmax    
        do i = imin, imax-1
          paa_xaa(i,j,k) = ( xaa_Var(i+1,j,k) + xaa_Var(i,j,k) ) * 0.5d0
        end do
      end do
    end do
    
    ! imax 格子上の値
    paa_xaa(imax,:,:) = 1.0d10
    
  end function paa_xaa
q_Y
Variable :
q_Y(:) :real(DP), allocatable, public, save
: 整数格子点座標
q_dy
Variable :
q_dy(:) :real(DP), allocatable, public, save
: 整数格子点間隔
r_Z
Variable :
r_Z(:) :real(DP), allocatable, public, save
: 整数格子点座標
r_dz
Variable :
r_dz(:) :real(DP), allocatable, public, save
: 整数格子点間隔
x_X
Variable :
x_X(:) :real(DP), allocatable, public, save
: 半整数格子点座標
x_dx
Variable :
x_dx(:) :real(DP), allocatable, public, save
: 半整数格子点間隔
Function :
aar_aaz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aaz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い z 方向半整数格子点の配列値を整数格子点上へ返す

平均操作: z 座標から r 座標へ返す. zmax の値は陽に代入する.

   r     kmin    0     1         kmax-1  kmax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   z  kmin   0      1         kmax-1  kmax

[Source]

  function aar_aaz(aaz_Var)
    !
    != 平均操作を行い z 方向半整数格子点の配列値を整数格子点上へ返す
    !
    ! 平均操作: z 座標から r 座標へ返す. zmax の値は陽に代入する.
    !
    !    r     kmin    0     1         kmax-1  kmax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    z  kmin   0      1         kmax-1  kmax
    !
    
    ! 暗黙の型宣言禁止
    implicit none
    
    real(DP),intent(in) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax) 
    real(DP)            :: aar_aaz(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k
    
    do k = kmin, kmax-1
      do j = jmin, jmax    
        do i = imin, imax
          aar_aaz(i,j,k) = ( aaz_Var(i,j,k+1) + aaz_Var(i,j,k) ) * 0.5d0
        end do
      end do
    end do
    
    ! kmax 格子上の値
    aar_aaz(:,:,kmax) = 1.0d10
    
  end function aar_aaz
Function :
aqa_aya(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aya_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い y 方向の整数格子点の配列値を半整数格子点上へ返す

平均操作: y 座標から q 座標へ返す. jmax の値は陽に代入する.

   q     jmin    0     1         jmax-1  jmax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   y  jmin   0      1         jmax-1  jmax

[Source]

  function aqa_aya(aya_Var)
    !
    != 平均操作を行い y 方向の整数格子点の配列値を半整数格子点上へ返す
    !
    ! 平均操作: y 座標から q 座標へ返す. jmax の値は陽に代入する.
    !
    !    q     jmin    0     1         jmax-1  jmax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    y  jmin   0      1         jmax-1  jmax
    !
    
    ! 暗黙の型宣言禁止
    implicit none

    real(DP),intent(in) :: aya_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: aqa_aya(imin:imax,jmin:jmax,kmin:kmax) 
    integer             :: i, j, k

    if ( FlagCalc3D ) then 
      do k = kmin, kmax
        do j = jmin, jmax-1  
          do i = imin, imax
            aqa_aya(i,j,k) = ( aya_Var(i,j+1,k) + aya_Var(i,j,k) ) * 0.5d0
          end do
        end do
      end do
      
      ! jmax 格子上の値
      aqa_aya(:,jmax,:) = 1.0d10

    else
    
      ! 2 次元計算(y 方向の配列要素数が 1)の場合, 代入値をそのまま返す
      aqa_aya = aya_Var
      return

    end if
    
    
  end function aqa_aya
Function :
xqr_xyz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
: 出力
xyz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP), intent(in)
: 入力

YZ 平面において, 整数格子 (qr) から半整数格子 (yz) への変換を行う

[Source]

  function xqr_xyz(xyz_Var)
    !
    != YZ 平面において, 整数格子 (qr) から半整数格子 (yz) への変換を行う
    !

    ! 暗黙の型宣言禁止
    implicit none

    real(DP), intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax)   ! 入力
    real(DP)             :: xqr_xyz(imin:imax,jmin:jmax,kmin:kmax)   ! 出力
    integer              :: i, j, k                                  ! ループ添字
    
    if ( FlagCalc3D ) then 
      
      do k = kmin, kmax-1
        do j = jmin, jmax-1
          do i = imin, imax
            xqr_xyz(i,j,k) = ( + xyz_Var(i, j,   k  ) + xyz_Var(i, j+1, k  ) + xyz_Var(i, j,   k+1) + xyz_Var(i, j+1, k+1) ) * 0.25d0 
          end do
        end do
      end do

      ! jmax 格子上の値
      xqr_xyz(:,jmax,:) = 1.0d10
      ! kmax 格子上の値
      xqr_xyz(:,:,kmax) = 1.0d10

    else
      
      do k = kmin, kmax-1
        do j = jmin, jmax
          do i = imin, imax
            xqr_xyz(i,j,k) = ( + xyz_Var(i, j, k) + xyz_Var(i, j, k+1) ) * 0.5d0 
          end do
        end do
      end do

      ! kmax 格子上の値
      xqr_xyz(:,:,kmax) = 1.0d10

    end if
    
  end function xqr_xyz
Function :
xaa_paa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
paa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い x 方向整数格子点の配列値を半整数点上へ返す

平均操作: p 座標から x 座標へ返す. imin の値は陽に代入する.

   p     imin    0     1         imax-1  imax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   x  imin   0      1         imax-1  imax

[Source]

  function xaa_paa(paa_Var)
    !
    != 平均操作を行い x 方向整数格子点の配列値を半整数点上へ返す 
    ! 
    ! 平均操作: p 座標から x 座標へ返す. imin の値は陽に代入する.
    !
    !    p     imin    0     1         imax-1  imax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    x  imin   0      1         imax-1  imax
    !

    ! 暗黙の型宣言禁止
    implicit none
        
    real(DP),intent(in) :: paa_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: xaa_paa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k

    do k = kmin, kmax
      do j = jmin, jmax    
        do i = imin+1, imax
          xaa_paa(i,j,k) = ( paa_Var(i,j,k) + paa_Var(i-1,j,k) ) * 0.5d0 
        end do
      end do
    end do

    ! imin 格子上の値
    xaa_paa(imin,:,:) = 1.0d10 
    
  end function xaa_paa
Function :
aaz_aar(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aar_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い z 方向整数格子点の配列値を半整数格子点上へ返す

平均操作: r 座標から z 座標へ返す. zmin の値は陽に代入する.

   r     kmin    0     1         kmax-1  kmax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   z  kmin   0      1         kmax-1  kmax

[Source]

  function aaz_aar(aar_Var)
    !
    != 平均操作を行い z 方向整数格子点の配列値を半整数格子点上へ返す
    !
    ! 平均操作: r 座標から z 座標へ返す. zmin の値は陽に代入する.
    !
    !    r     kmin    0     1         kmax-1  kmax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    z  kmin   0      1         kmax-1  kmax
    !
    
    ! 暗黙の型宣言禁止
    implicit none

    real(DP),intent(in) :: aar_Var(imin:imax,jmin:jmax,kmin:kmax)   
    real(DP)            :: aaz_aar(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k
    
    do k = kmin+1, kmax
      do j = jmin, jmax    
        do i = imin, imax
          aaz_aar(i,j,k) = ( aar_Var(i,j,k) + aar_Var(i,j,k-1) ) * 0.5d0 
        end do
      end do
    end do
    
    ! kmin 格子上の値
    aaz_aar(:,:,kmin) = 1.0d10
    
  end function aaz_aar
Function :
aqa_aya(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aya_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い y 方向の整数格子点の配列値を半整数格子点上へ返す

平均操作: y 座標から q 座標へ返す. jmax の値は陽に代入する.

   q     jmin    0     1         jmax-1  jmax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   y  jmin   0      1         jmax-1  jmax

[Source]

  function aqa_aya(aya_Var)
    !
    != 平均操作を行い y 方向の整数格子点の配列値を半整数格子点上へ返す
    !
    ! 平均操作: y 座標から q 座標へ返す. jmax の値は陽に代入する.
    !
    !    q     jmin    0     1         jmax-1  jmax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    y  jmin   0      1         jmax-1  jmax
    !
    
    ! 暗黙の型宣言禁止
    implicit none

    real(DP),intent(in) :: aya_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: aqa_aya(imin:imax,jmin:jmax,kmin:kmax) 
    integer             :: i, j, k

    if ( FlagCalc3D ) then 
      do k = kmin, kmax
        do j = jmin, jmax-1  
          do i = imin, imax
            aqa_aya(i,j,k) = ( aya_Var(i,j+1,k) + aya_Var(i,j,k) ) * 0.5d0
          end do
        end do
      end do
      
      ! jmax 格子上の値
      aqa_aya(:,jmax,:) = 1.0d10

    else
    
      ! 2 次元計算(y 方向の配列要素数が 1)の場合, 代入値をそのまま返す
      aqa_aya = aya_Var
      return

    end if
    
    
  end function aqa_aya
Function :
xaa_paa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
paa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い x 方向整数格子点の配列値を半整数点上へ返す

平均操作: p 座標から x 座標へ返す. imin の値は陽に代入する.

   p     imin    0     1         imax-1  imax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   x  imin   0      1         imax-1  imax

[Source]

  function xaa_paa(paa_Var)
    !
    != 平均操作を行い x 方向整数格子点の配列値を半整数点上へ返す 
    ! 
    ! 平均操作: p 座標から x 座標へ返す. imin の値は陽に代入する.
    !
    !    p     imin    0     1         imax-1  imax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    x  imin   0      1         imax-1  imax
    !

    ! 暗黙の型宣言禁止
    implicit none
        
    real(DP),intent(in) :: paa_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: xaa_paa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k

    do k = kmin, kmax
      do j = jmin, jmax    
        do i = imin+1, imax
          xaa_paa(i,j,k) = ( paa_Var(i,j,k) + paa_Var(i-1,j,k) ) * 0.5d0 
        end do
      end do
    end do

    ! imin 格子上の値
    xaa_paa(imin,:,:) = 1.0d10 
    
  end function xaa_paa
Function :
aya_aqa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aqa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す

平均操作: q 座標から y 座標へ返す. jmin の値は陽に代入する.

   q     jmin    0     1         jmax-1  jmax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   y  jmin   0      1         jmax-1  jmax

[Source]

  function aya_aqa(aqa_Var)
    !
    != 平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
    !
    ! 平均操作: q 座標から y 座標へ返す. jmin の値は陽に代入する.
    !
    !    q     jmin    0     1         jmax-1  jmax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    y  jmin   0      1         jmax-1  jmax
    !
    
    ! 暗黙の型宣言禁止
    implicit none

    real(DP),intent(in) :: aqa_Var(imin:imax,jmin:jmax,kmin:kmax)   
    real(DP)            :: aya_aqa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k 
 
    if ( FlagCalc3D ) then 
      do k = kmin, kmax
        do j = jmin+1, jmax    
          do i = imin,   imax
            aya_aqa(i,j,k) = ( aqa_Var(i,j,k) + aqa_Var(i,j-1,k) ) * 0.5d0 
          end do
        end do
      end do
      
      ! jmin 格子上の値
      aya_aqa(:,jmin,:) = 1.0d10

    else      
      ! 2 次元計算(y 方向の配列要素数が 1)の場合, 代入値をそのまま返す
      aya_aqa = aqa_Var
      return
      
    end if   
    
  end function aya_aqa
Function :
aar_aaz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aaz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い z 方向半整数格子点の配列値を整数格子点上へ返す

平均操作: z 座標から r 座標へ返す. zmax の値は陽に代入する.

   r     kmin    0     1         kmax-1  kmax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   z  kmin   0      1         kmax-1  kmax

[Source]

  function aar_aaz(aaz_Var)
    !
    != 平均操作を行い z 方向半整数格子点の配列値を整数格子点上へ返す
    !
    ! 平均操作: z 座標から r 座標へ返す. zmax の値は陽に代入する.
    !
    !    r     kmin    0     1         kmax-1  kmax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    z  kmin   0      1         kmax-1  kmax
    !
    
    ! 暗黙の型宣言禁止
    implicit none
    
    real(DP),intent(in) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax) 
    real(DP)            :: aar_aaz(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k
    
    do k = kmin, kmax-1
      do j = jmin, jmax    
        do i = imin, imax
          aar_aaz(i,j,k) = ( aaz_Var(i,j,k+1) + aaz_Var(i,j,k) ) * 0.5d0
        end do
      end do
    end do
    
    ! kmax 格子上の値
    aar_aaz(:,:,kmax) = 1.0d10
    
  end function aar_aaz
xyz_X
Variable :
xyz_X(:,:,:) :real(DP), allocatable, public, save
: x 座標(半整数格子)
xyz_Y
Variable :
xyz_Y(:,:,:) :real(DP), allocatable, public, save
: y 座標(半整数格子)
xyz_Z
Variable :
xyz_Z(:,:,:) :real(DP), allocatable, public, save
: z 座標(半整数格子)
Function :
xyz_pqz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
: 出力
pqz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP), intent(in)
: 入力

XY 平面において, 整数格子 (pq) から半整数格子 (xz) へ変換

[Source]

  function xyz_pqz(pqz_Var)
    !
    != XY 平面において, 整数格子 (pq) から半整数格子 (xz) へ変換
    !

    ! 暗黙の型宣言禁止
    implicit none

    real(DP), intent(in) :: pqz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: xyz_pqz(imin:imax,jmin:jmax,kmin:kmax) ! 出力
    integer              :: i, j, k                                ! ループ添字
    
    if ( FlagCalc3D ) then 
      ! 3 次元の計算
      !
      do k = kmin, kmax
        do j = jmin+1, jmax
          do i = imin+1, imax
            xyz_pqz(i,j,k) = ( + pqz_Var(i-1, j-1, k) + pqz_Var(i,   j-1, k) + pqz_Var(i-1, j,   k) + pqz_Var(i,   j,   k) ) * 0.25d0 
          end do
        end do
      end do

      ! imin 格子上の値
      xyz_pqz(imin,:,:) = 1.0d10
      ! jmin 格子上の値
      xyz_pqz(:,jmin,:) = 1.0d10
      
    else
      ! 2 次元計算 (y 方向の配列要素数が 1) の場合
      !
      do k = kmin, kmax
        do j = jmin, jmax
          do i = imin+1, imax
            xyz_pqz(i,j,k) = ( + pqz_Var(i-1, j, k) + pqz_Var(i,   j, k) ) * 0.5d0 
          end do
        end do
      end do
      
      ! imin 格子上の値
      xyz_pqz(imin,:,:) = 1.0d10

    end if
    
  end function xyz_pqz
Function :
xyz_pyr(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
: 出力
pyr_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP), intent(in)
: 入力

XZ 平面において整数格子 (pr) から半整数格子 (xz) への変換を行う

[Source]

  function xyz_pyr(pyr_Var)
    !
    != XZ 平面において整数格子 (pr) から半整数格子 (xz) への変換を行う
    !

    ! 暗黙の型宣言禁止
    implicit none

    real(DP), intent(in) :: pyr_Var(imin:imax,jmin:jmax,kmin:kmax)     ! 入力
    real(DP)             :: xyz_pyr(imin:imax,jmin:jmax,kmin:kmax) ! 出力
    integer              :: i, j, k                                    ! ループ添字
        
    do k = kmin+1, kmax
      do j = jmin,   jmax
        do i = imin+1, imax
          xyz_pyr(i,j,k) = ( + pyr_Var(i-1, j, k-1) + pyr_Var(i,   j, k-1) + pyr_Var(i-1, j, k  ) + pyr_Var(i,   j, k  ) ) * 0.25d0 
        end do
      end do
    end do
    
    ! imin 格子上の値
    xyz_pyr(imin,:,:) = 1.0d10
    ! kmin 格子上の値
    xyz_pyr(:,:,kmin) = 1.0d10
    
  end function xyz_pyr
Function :
xaa_paa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
paa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い x 方向整数格子点の配列値を半整数点上へ返す

平均操作: p 座標から x 座標へ返す. imin の値は陽に代入する.

   p     imin    0     1         imax-1  imax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   x  imin   0      1         imax-1  imax

[Source]

  function xaa_paa(paa_Var)
    !
    != 平均操作を行い x 方向整数格子点の配列値を半整数点上へ返す 
    ! 
    ! 平均操作: p 座標から x 座標へ返す. imin の値は陽に代入する.
    !
    !    p     imin    0     1         imax-1  imax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    x  imin   0      1         imax-1  imax
    !

    ! 暗黙の型宣言禁止
    implicit none
        
    real(DP),intent(in) :: paa_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: xaa_paa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k

    do k = kmin, kmax
      do j = jmin, jmax    
        do i = imin+1, imax
          xaa_paa(i,j,k) = ( paa_Var(i,j,k) + paa_Var(i-1,j,k) ) * 0.5d0 
        end do
      end do
    end do

    ! imin 格子上の値
    xaa_paa(imin,:,:) = 1.0d10 
    
  end function xaa_paa
Function :
xyz_xqr(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
: 出力
xqr_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP), intent(in)
: 入力

YZ 平面において, 半整数格子 (yz) から整数格子 (qr) への変換を行う

[Source]

  function xyz_xqr(xqr_Var)
    !
    != YZ 平面において, 半整数格子 (yz) から整数格子 (qr) への変換を行う
    !

    ! 暗黙の型宣言禁止
    implicit none

    real(DP), intent(in) :: xqr_Var(imin:imax,jmin:jmax,kmin:kmax)     ! 入力
    real(DP)             :: xyz_xqr(imin:imax,jmin:jmax,kmin:kmax) ! 出力
    integer              :: i, j, k                                    ! ループ添字

    if ( FlagCalc3D ) then 

      do k = kmin+1, kmax
        do j = jmin+1, jmax
          do i = imin, imax
            xyz_xqr(i,j,k) = ( + xqr_Var(i, j-1, k-1) + xqr_Var(i, j,   k-1) + xqr_Var(i, j-1, k  ) + xqr_Var(i, j,   k  ) ) * 0.25d0 
          end do
        end do
      end do

      ! jmin 格子上の値
      xyz_xqr(:,jmin,:) = 1.0d10
      ! kmin 格子上の値
      xyz_xqr(:,:,kmin) = 1.0d10
      
    else

      do k = kmin+1, kmax
        do j = jmin, jmax
          do i = imin, imax
            xyz_xqr(i,j,k) = ( + xqr_Var(i, j, k-1) + xqr_Var(i, j, k  ) ) * 0.5d0 
          end do
        end do
      end do
      
      ! kmin 格子上の値
      xyz_xqr(:,:,kmin) = 1.0d10
      
    end if
    
  end function xyz_xqr
Function :
aya_aqa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aqa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す

平均操作: q 座標から y 座標へ返す. jmin の値は陽に代入する.

   q     jmin    0     1         jmax-1  jmax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   y  jmin   0      1         jmax-1  jmax

[Source]

  function aya_aqa(aqa_Var)
    !
    != 平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
    !
    ! 平均操作: q 座標から y 座標へ返す. jmin の値は陽に代入する.
    !
    !    q     jmin    0     1         jmax-1  jmax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    y  jmin   0      1         jmax-1  jmax
    !
    
    ! 暗黙の型宣言禁止
    implicit none

    real(DP),intent(in) :: aqa_Var(imin:imax,jmin:jmax,kmin:kmax)   
    real(DP)            :: aya_aqa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k 
 
    if ( FlagCalc3D ) then 
      do k = kmin, kmax
        do j = jmin+1, jmax    
          do i = imin,   imax
            aya_aqa(i,j,k) = ( aqa_Var(i,j,k) + aqa_Var(i,j-1,k) ) * 0.5d0 
          end do
        end do
      end do
      
      ! jmin 格子上の値
      aya_aqa(:,jmin,:) = 1.0d10

    else      
      ! 2 次元計算(y 方向の配列要素数が 1)の場合, 代入値をそのまま返す
      aya_aqa = aqa_Var
      return
      
    end if   
    
  end function aya_aqa
Function :
aaz_aar(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aar_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

平均操作を行い z 方向整数格子点の配列値を半整数格子点上へ返す

平均操作: r 座標から z 座標へ返す. zmin の値は陽に代入する.

   r     kmin    0     1         kmax-1  kmax
    |--*--|--*--||--*--|--*--|--*--||--*--|
   z  kmin   0      1         kmax-1  kmax

[Source]

  function aaz_aar(aar_Var)
    !
    != 平均操作を行い z 方向整数格子点の配列値を半整数格子点上へ返す
    !
    ! 平均操作: r 座標から z 座標へ返す. zmin の値は陽に代入する.
    !
    !    r     kmin    0     1         kmax-1  kmax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    z  kmin   0      1         kmax-1  kmax
    !
    
    ! 暗黙の型宣言禁止
    implicit none

    real(DP),intent(in) :: aar_Var(imin:imax,jmin:jmax,kmin:kmax)   
    real(DP)            :: aaz_aar(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: i, j, k
    
    do k = kmin+1, kmax
      do j = jmin, jmax    
        do i = imin, imax
          aaz_aar(i,j,k) = ( aar_Var(i,j,k) + aar_Var(i,j,k-1) ) * 0.5d0 
        end do
      end do
    end do
    
    ! kmin 格子上の値
    aaz_aar(:,:,kmin) = 1.0d10
    
  end function aaz_aar
xyz_dX
Variable :
xyz_dX(:,:,:) :real(DP), allocatable, public, save
: x 格子間隔(半整数格子)
xyz_dY
Variable :
xyz_dY(:,:,:) :real(DP), allocatable, public, save
: y 格子間隔(半整数格子)
xyz_dZ
Variable :
xyz_dZ(:,:,:) :real(DP), allocatable, public, save
: z 格子間隔(半整数格子)
y_Y
Variable :
y_Y(:) :real(DP), allocatable, public, save
: 半整数格子点座標
y_dy
Variable :
y_dy(:) :real(DP), allocatable, public, save
: 半整数格子点間隔
z_Z
Variable :
z_Z(:) :real(DP), allocatable, public, save
: 半整数格子点座標
z_dz
Variable :
z_dz(:) :real(DP), allocatable, public, save
: 半整数格子点間隔