| Class | axesset | 
| In: | ../src/setup/axesset.f90 | 
axesset は, 3 次元 (xyz 方向) 等間隔交互格子を用いた有限差分法に基づく 数値モデルのための, 基本的な Fortran90 副プログラムおよび関数を提供する. 具体的に行っていることは以下の通り.
| Function : | |||
| AvrXYZ_pyz : | real(DP) 
 | ||
| pyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
pyz 格子上の配列に対し領域積分を行う
  function AvrXYZ_pyz(pyz_Var)
    ! pyz 格子上の配列に対し領域積分を行う
    
    real(DP), intent(in) :: pyz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: AvrXYZ_pyz                             ! 出力
    
    ! 初期化
    AvrXYZ_pyz = 0.0d0
    
    AvrXYZ_pyz = IntXYZ_pyz(pyz_Var)/ (sum(x_dx(1:nx))*sum(y_dy(1:ny))*sum(z_dz(1:nz)))
    
  end function AvrXYZ_pyz
          | Function : | |||
| AvrXYZ_xqz : | real(DP) 
 | ||
| xqz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xqz 格子上の配列に対し領域積分を行う
  function AvrXYZ_xqz(xqz_Var)
    ! xqz 格子上の配列に対し領域積分を行う
    
    real(DP), intent(in) :: xqz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: AvrXYZ_xqz                             ! 出力
    
    ! 初期化
    AvrXYZ_xqz = 0.0d0
    
    AvrXYZ_xqz = IntXYZ_xqz(xqz_Var)/ (sum(x_dx(1:nx))*sum(y_dy(1:ny))*sum(z_dz(1:nz)))
    
  end function AvrXYZ_xqz
          | Function : | |||
| AvrXYZ_xyr : | real(DP) 
 | ||
| xyr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xyr 格子上の配列に対し領域積分を行う
  function AvrXYZ_xyr(xyr_Var)
    ! xyr 格子上の配列に対し領域積分を行う
    
    real(DP), intent(in) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: AvrXYZ_xyr                             ! 出力
    
    ! 初期化
    AvrXYZ_xyr = 0.0d0
    AvrXYZ_xyr = IntXYZ_xyr(xyr_Var)/ (sum(x_dx(1:nx))*sum(y_dy(1:ny))*sum(z_dz(1:nz)))
    
  end function AvrXYZ_xyr
          | Function : | |||
| AvrXYZ_xyz : | real(DP) 
 | ||
| xyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xyz 格子上の配列に対し領域積分を行う
  function AvrXYZ_xyz(xyz_Var)
    ! xyz 格子上の配列に対し領域積分を行う
    
    real(DP), intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: AvrXYZ_xyz                             ! 出力
    
    ! 初期化
    AvrXYZ_xyz = 0.0d0
    
    AvrXYZ_xyz = IntXYZ_xyz(xyz_Var)/ (sum(x_dx(1:nx))*sum(y_dy(1:ny))*sum(z_dz(1:nz)))
    
  end function AvrXYZ_xyz
          | Function : | |||
| IntXYZ_pyz : | real(DP) 
 | ||
| pyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
pyz 格子上の配列に対し領域積分を行う
  function IntXYZ_pyz(pyz_Var)
    ! pyz 格子上の配列に対し領域積分を行う
    
    real(DP), intent(in) :: pyz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: IntXYZ_pyz                             ! 出力
    
    ! 初期化
    IntXYZ_pyz = 0.0d0
    IntXYZ_pyz = IntZ_z(z_IntXY_pyz(pyz_Var))
    
  end function IntXYZ_pyz
          | Function : | |||
| IntXYZ_xqz : | real(DP) 
 | ||
| xqz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xqz 格子上の配列に対し領域積分を行う
  function IntXYZ_xqz(xqz_Var)
    ! xqz 格子上の配列に対し領域積分を行う
    
    real(DP), intent(in) :: xqz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: IntXYZ_xqz                             ! 出力
    
    ! 初期化
    IntXYZ_xqz = 0.0d0
    
    IntXYZ_xqz = IntZ_z(z_IntXY_xqz(xqz_Var))
    
  end function IntXYZ_xqz
          | Function : | |||
| IntXYZ_xyr : | real(DP) 
 | ||
| xyr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xyr 格子上の配列に対し領域積分を行う
  function IntXYZ_xyr(xyr_Var)
    ! xyr 格子上の配列に対し領域積分を行う
    
    real(DP), intent(in) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: IntXYZ_xyr                             ! 出力
    
    ! 初期化
    IntXYZ_xyr = 0.0d0
    
    IntXYZ_xyr = IntZ_r(a_IntXY_xya(xyr_Var))
  end function IntXYZ_xyr
          | Function : | |||
| IntXYZ_xyz : | real(DP) 
 | ||
| xyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xyz 格子上の配列に対し領域積分を行う
  function IntXYZ_xyz(xyz_Var)
    ! xyz 格子上の配列に対し領域積分を行う
    
    real(DP), intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: IntXYZ_xyz                             ! 出力
    
    ! 初期化
    IntXYZ_xyz = 0.0d0
    
    IntXYZ_xyz = IntZ_z(a_IntXY_xya(xyz_Var))
    
  end function IntXYZ_xyz
          | Subroutine : | 
格子点座標配列と格子点間隔配列の初期化
This procedure input/output NAMELIST#axesset_nml .
  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     ! 設定ファイル用装置番号
    
    !設定ファイルから読み込む出力ファイル情報
    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 x_axis_init
    call y_axis_init
    call z_axis_init
    
    ! MPI 対応
    ! * x 方向のみ
    !
    XMin = XMin           ! XMin = 0 を仮定
    XMax = XMax * nprocs  ! CPU の数だけ領域を拡張する
    ! 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/)    )
    end if
  
  end subroutine axesset_init
          | Function : | |
| aqa_avr_aya(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| aya_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
  function aqa_avr_aya(aya_Var)
    ! 平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
    
    real(DP),intent(in) :: aya_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: aqa_avr_aya(imin:imax,jmin:jmax,kmin:kmax) 
    integer                 :: jy
    
    ! 2 次元計算(y 方向の配列要素数が 1)の場合, 代入値をそのまま返す
    if (jmin == jmax) then 
      aqa_avr_aya = aya_Var
      return
    end if
    
    ! 平均操作
    !
    do jy = jmin, jmax-1
!      aqa_avr_aya(:,jy,:) = &
!        &  (y_dy(jy)*aya_Var(:,jy+1,:) + y_dy(jy+1)*aya_Var(:,jy,:)) &
!        &  * 0.5d0/q_dy(jy)
      aqa_avr_aya(:,jy,:) = (aya_Var(:,jy+1,:) + aya_Var(:,jy,:)) * 0.5d0
    end do
    
    ! jmax 格子上の値
    aqa_avr_aya(:,jmax,:) = 1.0d10
    
  end function aqa_avr_aya
          | Function : | |
| paa_avr_xaa(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| xaa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
半整数格子点の配列値を整数点上へ返す
  function paa_avr_xaa(xaa_Var)
    ! 半整数格子点の配列値を整数点上へ返す
    
    real(DP),intent(in) :: xaa_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: paa_avr_xaa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: ix
    ! 平均操作: x 座標から p 座標へ返す. imax の値は陽に代入する.
    !     
    !    p     imin    0     1         imax-1  imax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    x  imin   0      1         imax-1  imax
    !
    do ix = imin, imax-1
!      paa_avr_xaa(ix,:,:) = &
!        &  (x_dx(ix)*xaa_Var(ix+1,:,:) + x_dx(ix+1)*xaa_Var(ix,:,:)) &
!        &  *0.5d0/p_dx(ix)
      paa_avr_xaa(ix,:,:) = (xaa_Var(ix+1,:,:) + xaa_Var(ix,:,:)) * 0.5d0
    end do
    
    ! imax 格子上の値
    paa_avr_xaa(imax,:,:) = 1.0d10
    
  end function paa_avr_xaa
          | Function : | |||
| pqz_avr_xyz(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) 
 | ||
| xyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
  function pqz_avr_xyz(xyz_Var)
    real(DP), intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax)      ! 入力
    real(DP)             :: pqz_avr_xyz(imin:imax,jmin:jmax,kmin:kmax)  ! 出力
    integer              :: ix, jy                                      ! ループ添字
    ! 2 次元計算(y 方向の配列要素数が 1)の場合, pz_avr_xz と同じ計算を行う.
    if (jmin == jmax) then 
      do ix = imin, imax-1
        pqz_avr_xyz(ix,:,:) = ( xyz_Var(ix,:,:) + xyz_Var(ix+1,:,:) ) * 0.5d0 
      end do
      ! imax 格子上の値
      pqz_avr_xyz(imax,:,:) = 1.0d10
    ! 3 次元計算の場合
    else
      do jy = jmin, jmax-1
        do ix = imin, imax-1
          pqz_avr_xyz(ix,jy,:) = ( xyz_Var(ix,jy,:)   + xyz_Var(ix+1,jy,:) + xyz_Var(ix,jy+1,:) + xyz_Var(ix+1,jy+1,:) ) * 0.25d0 
        end do
      end do
      ! imax 格子上の値
      pqz_avr_xyz(imax,:,:) = 1.0d10
      ! jmax 格子上の値
      pqz_avr_xyz(:,jmax,:) = 1.0d10
    end if
        
  end function pqz_avr_xyz
          | Function : | |||
| aa_AvrZ_aaz(imin:imax,jmin:jmax) : | real(DP) 
 | ||
| aaz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
aaz 格子上の配列に対し z 方向平均を行う
  function aa_AvrZ_aaz(aaz_Var)
    ! aaz 格子上の配列に対し z 方向平均を行う
    
    real(DP), intent(in) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_AvrZ_aaz(imin:imax,jmin:jmax)       ! 出力
    
    ! 初期化
    aa_AvrZ_aaz = 0.0d0
    
    ! 平均
    aa_AvrZ_aaz = aa_IntZ_aaz(aaz_Var)/sum(z_dz(1:nz))
    
  end function aa_AvrZ_aaz
          | Function : | |||
| aa_IntZ_aaz(imin:imax,jmin:jmax) : | real(DP) 
 | ||
| aaz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
aaz 格子上の配列に対し z 方向積分を行う
  function aa_IntZ_aaz(aaz_Var)
    ! aaz 格子上の配列に対し z 方向積分を行う
    
    real(DP), intent(in) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_IntZ_aaz(imin:imax,jmin:jmax)       ! 出力
    integer                  :: ix, jy                           ! ループ添字
    
    ! 初期化
    aa_IntZ_aaz = 0.0d0
    ! 積分
    do jy = jmin, jmax
      do ix = imin, imax
        aa_IntZ_aaz(ix,jy) = IntZ_z(aaz_Var(ix,jy,:))
      end do
    end do
    
  end function aa_IntZ_aaz
          | Function : | |
| aar_avr_aaz(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| aaz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い z 方向半整数格子点の配列値を整数格子点上へ返す
  function aar_avr_aaz(aaz_Var)
    ! 平均操作を行い z 方向半整数格子点の配列値を整数格子点上へ返す
    
    real(DP),intent(in) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax) 
    real(DP)            :: aar_avr_aaz(imin:imax,jmin:jmax,kmin:kmax)
    integer                 :: kz
    
    ! 平均操作
    !
    do kz = kmin, kmax-1
!      aar_avr_aaz(:,:,kz) = &
!        &  (z_dz(kz)*aaz_Var(:,:,kz+1) + z_dz(kz+1)*aaz_Var(:,:,kz)) &
!        &  *0.5d0/r_dz(kz)
      aar_avr_aaz(:,:,kz) = (aaz_Var(:,:,kz+1) + aaz_Var(:,:,kz)) * 0.5d0
    end do
    
    ! kmax 格子上の値
    aar_avr_aaz(:,:,kmax) = 1.0d10
    
  end function aar_avr_aaz
          | Function : | |
| paa_avr_xaa(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| xaa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
半整数格子点の配列値を整数点上へ返す
  function paa_avr_xaa(xaa_Var)
    ! 半整数格子点の配列値を整数点上へ返す
    
    real(DP),intent(in) :: xaa_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: paa_avr_xaa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: ix
    ! 平均操作: x 座標から p 座標へ返す. imax の値は陽に代入する.
    !     
    !    p     imin    0     1         imax-1  imax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    x  imin   0      1         imax-1  imax
    !
    do ix = imin, imax-1
!      paa_avr_xaa(ix,:,:) = &
!        &  (x_dx(ix)*xaa_Var(ix+1,:,:) + x_dx(ix+1)*xaa_Var(ix,:,:)) &
!        &  *0.5d0/p_dx(ix)
      paa_avr_xaa(ix,:,:) = (xaa_Var(ix+1,:,:) + xaa_Var(ix,:,:)) * 0.5d0
    end do
    
    ! imax 格子上の値
    paa_avr_xaa(imax,:,:) = 1.0d10
    
  end function paa_avr_xaa
          | Function : | |||
| pyr_avr_xyz(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) 
 | ||
| xyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
  function pyr_avr_xyz(xyz_Var)
    real(DP), intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax)     ! 入力
    real(DP)             :: pyr_avr_xyz(imin:imax,jmin:jmax,kmin:kmax) ! 出力
    integer              :: ix, kz                                     ! ループ添字
    
    do kz = kmin, kmax-1
      do ix = imin, imax-1
        pyr_avr_xyz(ix,:,kz) = ( xyz_Var(ix,:,kz)   + xyz_Var(ix+1,:,kz) + xyz_Var(ix,:,kz+1) + xyz_Var(ix+1,:,kz+1) ) * 0.25d0 
      end do
    end do
    ! imax 格子上の値
    pyr_avr_xyz(imax,:,:) = 1.0d10
    ! kmax 格子上の値
    pyr_avr_xyz(:,:,kmax) = 1.0d10
    
  end function pyr_avr_xyz
          | Function : | |
| aya_avr_aqa(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| aqa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
  function aya_avr_aqa(aqa_Var)
    ! 平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
    
    real(DP),intent(in) :: aqa_Var(imin:imax,jmin:jmax,kmin:kmax)   
    real(DP)            :: aya_avr_aqa(imin:imax,jmin:jmax,kmin:kmax)
    integer                 :: jy
    
    ! 2 次元計算(y 方向の配列要素数が 1)の場合, 代入値をそのまま返す
    if (jmin == jmax) then 
      aya_avr_aqa = aqa_Var
      return
    end if
    
    ! 平均操作
    !
    do jy = jmin+1, jmax
      aya_avr_aqa(:,jy,:) = (aqa_Var(:,jy,:) + aqa_Var(:,jy-1,:))*0.5d0 
    end do
    
    ! jmin 格子上の値
    aya_avr_aqa(:,jmin,:) = 1.0d10
    
  end function aya_avr_aqa
          | Function : | |
| aaz_avr_aar(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| aar_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い z 方向整数格子点の配列値を半整数格子点上へ返す
  function aaz_avr_aar(aar_Var)
    ! 平均操作を行い z 方向整数格子点の配列値を半整数格子点上へ返す
    
    real(DP),intent(in) :: aar_Var(imin:imax,jmin:jmax,kmin:kmax)   
    real(DP)            :: aaz_avr_aar(imin:imax,jmin:jmax,kmin:kmax)
    integer                 :: kz
    
    ! 平均操作
    !
    do kz = kmin+1, kmax
      aaz_avr_aar(:,:,kz) = (aar_Var(:,:,kz) + aar_Var(:,:,kz-1))*0.5d0 
    end do
    
    ! kmin 格子上の値
    aaz_avr_aar(:,:,kmin) = 1.0d10
    
  end function aaz_avr_aar
          | Function : | |
| paa_avr_xaa(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| xaa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
半整数格子点の配列値を整数点上へ返す
  function paa_avr_xaa(xaa_Var)
    ! 半整数格子点の配列値を整数点上へ返す
    
    real(DP),intent(in) :: xaa_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: paa_avr_xaa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: ix
    ! 平均操作: x 座標から p 座標へ返す. imax の値は陽に代入する.
    !     
    !    p     imin    0     1         imax-1  imax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    x  imin   0      1         imax-1  imax
    !
    do ix = imin, imax-1
!      paa_avr_xaa(ix,:,:) = &
!        &  (x_dx(ix)*xaa_Var(ix+1,:,:) + x_dx(ix+1)*xaa_Var(ix,:,:)) &
!        &  *0.5d0/p_dx(ix)
      paa_avr_xaa(ix,:,:) = (xaa_Var(ix+1,:,:) + xaa_Var(ix,:,:)) * 0.5d0
    end do
    
    ! imax 格子上の値
    paa_avr_xaa(imax,:,:) = 1.0d10
    
  end function paa_avr_xaa
          | Function : | |||
| aa_AvrY_aya(imin:imax,kmin:kmax) : | real(DP) 
 | ||
| aya_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
aya 格子上の配列に対し y 方向平均を行う
  function aa_AvrY_aya(aya_Var)
    ! aya 格子上の配列に対し y 方向平均を行う
    
    real(DP), intent(in) :: aya_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_AvrY_aya(imin:imax,kmin:kmax)       ! 出力
    
    ! 初期化
    aa_AvrY_aya = 0.0d0
    
    ! 平均
    aa_AvrY_aya = aa_IntY_aya(aya_Var)/sum(y_dy(1:ny))
    
  end function aa_AvrY_aya
          | Function : | |||
| aa_IntY_aya(imin:imax,kmin:kmax) : | real(DP) 
 | ||
| aya_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
aya 格子上の配列に対し y 方向積分を行う
  function aa_IntY_aya(aya_Var)
    ! aya 格子上の配列に対し y 方向積分を行う
    
    real(DP), intent(in) :: aya_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_IntY_aya(imin:imax,kmin:kmax)       ! 出力
    integer                  :: ix, kz                           ! ループ添字
    
    ! 初期化
    aa_IntY_aya = 0.0d0
    
    ! 積分
    do kz = kmin, kmax
      do ix = imin, imax
        aa_IntY_aya(ix,kz) = IntY_y(aya_Var(ix,:,kz))
      end do
    end do
    
  end function aa_IntY_aya
          | Function : | |||
| aa_AvrX_xaa(jmin:jmax,kmin:kmax) : | real(DP) 
 | ||
| xaa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xaa 格子上の配列に対し x 方向平均を行う
  function aa_AvrX_xaa(xaa_Var)
    ! xaa 格子上の配列に対し x 方向平均を行う
    real(DP), intent(in) :: xaa_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_AvrX_xaa(jmin:jmax,kmin:kmax)       ! 出力
    
    ! 初期化
    aa_AvrX_xaa = 0.0d0
    
    ! 平均
    aa_AvrX_xaa = aa_IntX_xaa(xaa_Var)/sum(x_dx(1:nx))
    
  end function aa_AvrX_xaa
          | Function : | |||
| aa_IntX_xaa(jmin:jmax,kmin:kmax) : | real(DP) 
 | ||
| xaa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xaa 格子上の配列に対し x 方向積分を行う
  function aa_IntX_xaa(xaa_Var)
    ! xaa 格子上の配列に対し x 方向積分を行う
    
    real(DP), intent(in) :: xaa_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_IntX_xaa(jmin:jmax,kmin:kmax)       ! 出力
    integer                  :: jy, kz                           ! ループ添字
    
    ! 初期化
    aa_IntX_xaa = 0.0d0
    
    ! 積分
    do kz = kmin, kmax
      do jy = jmin, jmax
        aa_IntX_xaa(jy,kz) = IntX_x(xaa_Var(:,jy,kz))
      end do
    end do
    
  end function aa_IntX_xaa
          | Function : | |||
| a_AvrXY_xya(kmin:kmax) : | real(DP) 
 | ||
| xya_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xya 格子上の配列に対し xy 方向平均を行う
  function a_AvrXY_xya(xya_Var)
    ! xya 格子上の配列に対し xy 方向平均を行う
    
    real(DP), intent(in) :: xya_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: a_AvrXY_xya(kmin:kmax)       ! 出力
    ! 初期化
    a_AvrXY_xya = 0.0d0
    
    ! 平均
    a_AvrXY_xya = a_IntXY_xya(xya_Var)/(sum(x_dx(1:nx))*sum(y_dy(1:ny)))
    
  end function a_AvrXY_xya
          | Function : | |||
| a_IntXY_xya(kmin:kmax) : | real(DP) 
 | ||
| xya_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xya 格子上の配列に対し xy 方向積分を行う
  function a_IntXY_xya(xya_Var)
    ! xya 格子上の配列に対し xy 方向積分を行う
    
    real(DP), intent(in) :: xya_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: a_IntXY_xya(kmin:kmax)       ! 出力
    integer                  :: kz                           ! ループ添字
    
    ! 初期化
    a_IntXY_xya = 0.0d0
    
    ! 積分
    do kz = kmin, kmax
      a_IntXY_xya(kz) = IntY_y(y_IntX_xy(xya_Var(:,:,kz)))
    end do
    
  end function a_IntXY_xya
          | Function : | |||
| aa_AvrZ_aaz(imin:imax,jmin:jmax) : | real(DP) 
 | ||
| aaz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
aaz 格子上の配列に対し z 方向平均を行う
  function aa_AvrZ_aaz(aaz_Var)
    ! aaz 格子上の配列に対し z 方向平均を行う
    
    real(DP), intent(in) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_AvrZ_aaz(imin:imax,jmin:jmax)       ! 出力
    
    ! 初期化
    aa_AvrZ_aaz = 0.0d0
    
    ! 平均
    aa_AvrZ_aaz = aa_IntZ_aaz(aaz_Var)/sum(z_dz(1:nz))
    
  end function aa_AvrZ_aaz
          | Function : | |||
| aa_IntZ_aaz(imin:imax,jmin:jmax) : | real(DP) 
 | ||
| aaz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
aaz 格子上の配列に対し z 方向積分を行う
  function aa_IntZ_aaz(aaz_Var)
    ! aaz 格子上の配列に対し z 方向積分を行う
    
    real(DP), intent(in) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_IntZ_aaz(imin:imax,jmin:jmax)       ! 出力
    integer                  :: ix, jy                           ! ループ添字
    
    ! 初期化
    aa_IntZ_aaz = 0.0d0
    ! 積分
    do jy = jmin, jmax
      do ix = imin, imax
        aa_IntZ_aaz(ix,jy) = IntZ_z(aaz_Var(ix,jy,:))
      end do
    end do
    
  end function aa_IntZ_aaz
          | Function : | |
| aar_avr_aaz(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| aaz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い z 方向半整数格子点の配列値を整数格子点上へ返す
  function aar_avr_aaz(aaz_Var)
    ! 平均操作を行い z 方向半整数格子点の配列値を整数格子点上へ返す
    
    real(DP),intent(in) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax) 
    real(DP)            :: aar_avr_aaz(imin:imax,jmin:jmax,kmin:kmax)
    integer                 :: kz
    
    ! 平均操作
    !
    do kz = kmin, kmax-1
!      aar_avr_aaz(:,:,kz) = &
!        &  (z_dz(kz)*aaz_Var(:,:,kz+1) + z_dz(kz+1)*aaz_Var(:,:,kz)) &
!        &  *0.5d0/r_dz(kz)
      aar_avr_aaz(:,:,kz) = (aaz_Var(:,:,kz+1) + aaz_Var(:,:,kz)) * 0.5d0
    end do
    
    ! kmax 格子上の値
    aar_avr_aaz(:,:,kmax) = 1.0d10
    
  end function aar_avr_aaz
          | Function : | |
| aqa_avr_aya(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| aya_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
  function aqa_avr_aya(aya_Var)
    ! 平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
    
    real(DP),intent(in) :: aya_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: aqa_avr_aya(imin:imax,jmin:jmax,kmin:kmax) 
    integer                 :: jy
    
    ! 2 次元計算(y 方向の配列要素数が 1)の場合, 代入値をそのまま返す
    if (jmin == jmax) then 
      aqa_avr_aya = aya_Var
      return
    end if
    
    ! 平均操作
    !
    do jy = jmin, jmax-1
!      aqa_avr_aya(:,jy,:) = &
!        &  (y_dy(jy)*aya_Var(:,jy+1,:) + y_dy(jy+1)*aya_Var(:,jy,:)) &
!        &  * 0.5d0/q_dy(jy)
      aqa_avr_aya(:,jy,:) = (aya_Var(:,jy+1,:) + aya_Var(:,jy,:)) * 0.5d0
    end do
    
    ! jmax 格子上の値
    aqa_avr_aya(:,jmax,:) = 1.0d10
    
  end function aqa_avr_aya
          | Function : | |||
| xqr_avr_xyz(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) 
 | ||
| xyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
  function xqr_avr_xyz(xyz_Var)
    real(DP), intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax)       ! 入力
    real(DP)             :: xqr_avr_xyz(imin:imax,jmin:jmax,kmin:kmax)   ! 出力
    integer              :: jy, kz                                       ! ループ添字
    
    if (jmin == jmax) then 
      ! xr_avr_xz と同じになる
      do kz = kmin, kmax-1
        xqr_avr_xyz(:,:,kz) = ( xyz_Var(:,:,kz) + xyz_Var(:,:,kz+1) ) * 0.5d0 
      end do
      ! kmax 格子上の値
      xqr_avr_xyz(:,:,kmax) = 1.0d10
      
    else
      do kz = kmin, kmax-1
        do jy = jmin, jmax-1
          xqr_avr_xyz(:,jy,kz) = ( xyz_Var(:,jy,kz)   + xyz_Var(:,jy+1,kz) + xyz_Var(:,jy,kz+1) + xyz_Var(:,jy+1,kz+1) ) * 0.25d0 
        end do
      end do
      ! jmax 格子上の値
      xqr_avr_xyz(:,jmax,:) = 1.0d10
      ! kmax 格子上の値
      xqr_avr_xyz(:,:,kmax) = 1.0d10
    end if
    
  end function xqr_avr_xyz
          | Function : | |
| xaa_avr_paa(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| paa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い x 方向整数格子点の配列値を半整数点上へ返す
  function xaa_avr_paa(paa_Var)
    ! 平均操作を行い x 方向整数格子点の配列値を半整数点上へ返す
    
    real(DP),intent(in) :: paa_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: xaa_avr_paa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: ix
    ! 平均操作: p 座標から x 座標へ返す. imin の値は陽に代入する.
    !
    !    p     imin    0     1         imax-1  imax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    x  imin   0      1         imax-1  imax
    !
    do ix = imin+1, imax
      xaa_avr_paa(ix,:,:) = (paa_Var(ix,:,:) + paa_Var(ix-1,:,:))*0.5d0 
    end do
    
    ! imin 格子上の値
    xaa_avr_paa(imin,:,:) = 1.0d10 
    
  end function xaa_avr_paa
          | Function : | |
| aaz_avr_aar(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| aar_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い z 方向整数格子点の配列値を半整数格子点上へ返す
  function aaz_avr_aar(aar_Var)
    ! 平均操作を行い z 方向整数格子点の配列値を半整数格子点上へ返す
    
    real(DP),intent(in) :: aar_Var(imin:imax,jmin:jmax,kmin:kmax)   
    real(DP)            :: aaz_avr_aar(imin:imax,jmin:jmax,kmin:kmax)
    integer                 :: kz
    
    ! 平均操作
    !
    do kz = kmin+1, kmax
      aaz_avr_aar(:,:,kz) = (aar_Var(:,:,kz) + aar_Var(:,:,kz-1))*0.5d0 
    end do
    
    ! kmin 格子上の値
    aaz_avr_aar(:,:,kmin) = 1.0d10
    
  end function aaz_avr_aar
          | Function : | |
| aqa_avr_aya(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| aya_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
  function aqa_avr_aya(aya_Var)
    ! 平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
    
    real(DP),intent(in) :: aya_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: aqa_avr_aya(imin:imax,jmin:jmax,kmin:kmax) 
    integer                 :: jy
    
    ! 2 次元計算(y 方向の配列要素数が 1)の場合, 代入値をそのまま返す
    if (jmin == jmax) then 
      aqa_avr_aya = aya_Var
      return
    end if
    
    ! 平均操作
    !
    do jy = jmin, jmax-1
!      aqa_avr_aya(:,jy,:) = &
!        &  (y_dy(jy)*aya_Var(:,jy+1,:) + y_dy(jy+1)*aya_Var(:,jy,:)) &
!        &  * 0.5d0/q_dy(jy)
      aqa_avr_aya(:,jy,:) = (aya_Var(:,jy+1,:) + aya_Var(:,jy,:)) * 0.5d0
    end do
    
    ! jmax 格子上の値
    aqa_avr_aya(:,jmax,:) = 1.0d10
    
  end function aqa_avr_aya
          | Function : | |||
| aa_AvrY_aya(imin:imax,kmin:kmax) : | real(DP) 
 | ||
| aya_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
aya 格子上の配列に対し y 方向平均を行う
  function aa_AvrY_aya(aya_Var)
    ! aya 格子上の配列に対し y 方向平均を行う
    
    real(DP), intent(in) :: aya_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_AvrY_aya(imin:imax,kmin:kmax)       ! 出力
    
    ! 初期化
    aa_AvrY_aya = 0.0d0
    
    ! 平均
    aa_AvrY_aya = aa_IntY_aya(aya_Var)/sum(y_dy(1:ny))
    
  end function aa_AvrY_aya
          | Function : | |||
| aa_IntY_aya(imin:imax,kmin:kmax) : | real(DP) 
 | ||
| aya_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
aya 格子上の配列に対し y 方向積分を行う
  function aa_IntY_aya(aya_Var)
    ! aya 格子上の配列に対し y 方向積分を行う
    
    real(DP), intent(in) :: aya_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_IntY_aya(imin:imax,kmin:kmax)       ! 出力
    integer                  :: ix, kz                           ! ループ添字
    
    ! 初期化
    aa_IntY_aya = 0.0d0
    
    ! 積分
    do kz = kmin, kmax
      do ix = imin, imax
        aa_IntY_aya(ix,kz) = IntY_y(aya_Var(ix,:,kz))
      end do
    end do
    
  end function aa_IntY_aya
          | Function : | |||
| xy_AvrZ_xyr(imin:imax,jmin:jmax) : | real(DP) 
 | ||
| xyr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xyr 格子上の配列に対し z 方向平均を行う
  function xy_AvrZ_xyr(xyr_Var)
    ! xyr 格子上の配列に対し z 方向平均を行う
    
    real(DP), intent(in) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: xy_AvrZ_xyr(imin:imax,jmin:jmax)       ! 出力
      
    ! 初期化
    xy_AvrZ_xyr = 0.0d0
    
    ! 平均
    xy_AvrZ_xyr = xy_IntZ_xyr(xyr_Var)/sum(z_dz(1:nz))
    
  end function xy_AvrZ_xyr
          | Function : | |||
| aa_AvrZ_aaz(imin:imax,jmin:jmax) : | real(DP) 
 | ||
| aaz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
aaz 格子上の配列に対し z 方向平均を行う
  function aa_AvrZ_aaz(aaz_Var)
    ! aaz 格子上の配列に対し z 方向平均を行う
    
    real(DP), intent(in) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_AvrZ_aaz(imin:imax,jmin:jmax)       ! 出力
    
    ! 初期化
    aa_AvrZ_aaz = 0.0d0
    
    ! 平均
    aa_AvrZ_aaz = aa_IntZ_aaz(aaz_Var)/sum(z_dz(1:nz))
    
  end function aa_AvrZ_aaz
          | Function : | |||
| xy_IntZ_xyr(imin:imax,jmin:jmax) : | real(DP) 
 | ||
| xyr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xyr 格子上の配列に対し z 方向積分を行う
  function xy_IntZ_xyr(xyr_Var)
    ! xyr 格子上の配列に対し z 方向積分を行う
    
    real(DP), intent(in) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: xy_IntZ_xyr(imin:imax,jmin:jmax)       ! 出力
    integer                  :: ix, jy                           ! ループ添字
    
    ! 初期化
    xy_IntZ_xyr = 0.0d0
    
    ! 積分
    do jy = jmin, jmax
      do ix = imin, imax
        xy_IntZ_xyr(ix,jy) = IntZ_r(xyr_Var(ix,jy,:))
      end do
    end do
    
  end function xy_IntZ_xyr
          | Function : | |||
| aa_IntZ_aaz(imin:imax,jmin:jmax) : | real(DP) 
 | ||
| aaz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
aaz 格子上の配列に対し z 方向積分を行う
  function aa_IntZ_aaz(aaz_Var)
    ! aaz 格子上の配列に対し z 方向積分を行う
    
    real(DP), intent(in) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_IntZ_aaz(imin:imax,jmin:jmax)       ! 出力
    integer                  :: ix, jy                           ! ループ添字
    
    ! 初期化
    aa_IntZ_aaz = 0.0d0
    ! 積分
    do jy = jmin, jmax
      do ix = imin, imax
        aa_IntZ_aaz(ix,jy) = IntZ_z(aaz_Var(ix,jy,:))
      end do
    end do
    
  end function aa_IntZ_aaz
          | Function : | |
| xaa_avr_paa(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| paa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い x 方向整数格子点の配列値を半整数点上へ返す
  function xaa_avr_paa(paa_Var)
    ! 平均操作を行い x 方向整数格子点の配列値を半整数点上へ返す
    
    real(DP),intent(in) :: paa_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: xaa_avr_paa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: ix
    ! 平均操作: p 座標から x 座標へ返す. imin の値は陽に代入する.
    !
    !    p     imin    0     1         imax-1  imax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    x  imin   0      1         imax-1  imax
    !
    do ix = imin+1, imax
      xaa_avr_paa(ix,:,:) = (paa_Var(ix,:,:) + paa_Var(ix-1,:,:))*0.5d0 
    end do
    
    ! imin 格子上の値
    xaa_avr_paa(imin,:,:) = 1.0d10 
    
  end function xaa_avr_paa
          | Function : | |
| aya_avr_aqa(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| aqa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
  function aya_avr_aqa(aqa_Var)
    ! 平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
    
    real(DP),intent(in) :: aqa_Var(imin:imax,jmin:jmax,kmin:kmax)   
    real(DP)            :: aya_avr_aqa(imin:imax,jmin:jmax,kmin:kmax)
    integer                 :: jy
    
    ! 2 次元計算(y 方向の配列要素数が 1)の場合, 代入値をそのまま返す
    if (jmin == jmax) then 
      aya_avr_aqa = aqa_Var
      return
    end if
    
    ! 平均操作
    !
    do jy = jmin+1, jmax
      aya_avr_aqa(:,jy,:) = (aqa_Var(:,jy,:) + aqa_Var(:,jy-1,:))*0.5d0 
    end do
    
    ! jmin 格子上の値
    aya_avr_aqa(:,jmin,:) = 1.0d10
    
  end function aya_avr_aqa
          | Function : | |
| aar_avr_aaz(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| aaz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い z 方向半整数格子点の配列値を整数格子点上へ返す
  function aar_avr_aaz(aaz_Var)
    ! 平均操作を行い z 方向半整数格子点の配列値を整数格子点上へ返す
    
    real(DP),intent(in) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax) 
    real(DP)            :: aar_avr_aaz(imin:imax,jmin:jmax,kmin:kmax)
    integer                 :: kz
    
    ! 平均操作
    !
    do kz = kmin, kmax-1
!      aar_avr_aaz(:,:,kz) = &
!        &  (z_dz(kz)*aaz_Var(:,:,kz+1) + z_dz(kz+1)*aaz_Var(:,:,kz)) &
!        &  *0.5d0/r_dz(kz)
      aar_avr_aaz(:,:,kz) = (aaz_Var(:,:,kz+1) + aaz_Var(:,:,kz)) * 0.5d0
    end do
    
    ! kmax 格子上の値
    aar_avr_aaz(:,:,kmax) = 1.0d10
    
  end function aar_avr_aaz
          | Function : | |||
| xyz_avr_pqz(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) 
 | ||
| pqz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
  function xyz_avr_pqz(pqz_Var)
    real(DP), intent(in) :: pqz_Var(imin:imax,jmin:jmax,kmin:kmax)     ! 入力
    real(DP)             :: xyz_avr_pqz(imin:imax,jmin:jmax,kmin:kmax) ! 出力
    integer              :: ix, jy                                     ! ループ添字
    
    if (jmin == jmax) then 
      ! xz_avr_pz と同じになる
      do ix = imin+1, imax
        xyz_avr_pqz(ix,:,:) = ( pqz_Var(ix-1,:,:) + pqz_Var(ix,:,:) ) * 0.5d0 
      end do
      ! imin 格子上の値
      xyz_avr_pqz(imin,:,:) = 1.0d10
    else
      do jy = jmin+1, jmax
        do ix = imin+1, imax
          xyz_avr_pqz(ix,jy,:) = ( pqz_Var(ix-1,jy-1,:) + pqz_Var(ix,jy-1,:) + pqz_Var(ix-1,jy,:)   + pqz_Var(ix,jy,:) ) * 0.25d0 
        end do
      end do
      ! imin 格子上の値
      xyz_avr_pqz(imin,:,:) = 1.0d10
      ! jmin 格子上の値
      xyz_avr_pqz(:,jmin,:) = 1.0d10
    end if
    
  end function xyz_avr_pqz
          | Function : | |||
| xyz_avr_pyr(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) 
 | ||
| pyr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
  function xyz_avr_pyr(pyr_Var)
    real(DP), intent(in) :: pyr_Var(imin:imax,jmin:jmax,kmin:kmax)     ! 入力
    real(DP)             :: xyz_avr_pyr(imin:imax,jmin:jmax,kmin:kmax) ! 出力
    integer              :: ix, kz                                     ! ループ添字
        
    do kz = kmin+1, kmax
      do ix = imin+1, imax
        xyz_avr_pyr(ix,:,kz) = ( pyr_Var(ix-1,:,kz-1) + pyr_Var(ix,:,kz-1) + pyr_Var(ix-1,:,kz)   + pyr_Var(ix,:,kz)     ) * 0.25d0 
      end do
    end do
    ! imin 格子上の値
    xyz_avr_pyr(imin,:,:) = 1.0d10
    ! kmin 格子上の値
    xyz_avr_pyr(:,:,kmin) = 1.0d10
  end function xyz_avr_pyr
          | Function : | |
| xaa_avr_paa(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| paa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い x 方向整数格子点の配列値を半整数点上へ返す
  function xaa_avr_paa(paa_Var)
    ! 平均操作を行い x 方向整数格子点の配列値を半整数点上へ返す
    
    real(DP),intent(in) :: paa_Var(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)            :: xaa_avr_paa(imin:imax,jmin:jmax,kmin:kmax)
    integer             :: ix
    ! 平均操作: p 座標から x 座標へ返す. imin の値は陽に代入する.
    !
    !    p     imin    0     1         imax-1  imax
    !     |--*--|--*--||--*--|--*--|--*--||--*--|
    !    x  imin   0      1         imax-1  imax
    !
    do ix = imin+1, imax
      xaa_avr_paa(ix,:,:) = (paa_Var(ix,:,:) + paa_Var(ix-1,:,:))*0.5d0 
    end do
    
    ! imin 格子上の値
    xaa_avr_paa(imin,:,:) = 1.0d10 
    
  end function xaa_avr_paa
          | Function : | |||
| xyz_avr_xqr(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) 
 | ||
| xqr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
  function xyz_avr_xqr(xqr_Var)
    real(DP), intent(in) :: xqr_Var(imin:imax,jmin:jmax,kmin:kmax)     ! 入力
    real(DP)             :: xyz_avr_xqr(imin:imax,jmin:jmax,kmin:kmax) ! 出力
    integer              :: jy, kz                                     ! ループ添字
        
    if (jmin == jmax) then  
      !xz_avr_xr と同じ
      do kz = kmin+1, kmax
        xyz_avr_xqr(:,:,kz) = ( xqr_Var(:,:,kz-1) + xqr_Var(:,:,kz) ) * 0.5d0 
      end do
      ! kmin 格子上の値
      xyz_avr_xqr(:,:,kmin) = 1.0d10
    else
      do kz = kmin+1, kmax
        do jy = jmin+1, jmax
          xyz_avr_xqr(:,jy,kz) = ( xqr_Var(:,jy-1,kz-1) + xqr_Var(:,jy,kz-1) + xqr_Var(:,jy-1,kz)   + xqr_Var(:,jy,kz)     ) * 0.25d0 
        end do
      end do
      ! jmin 格子上の値
      xyz_avr_xqr(:,jmin,:) = 1.0d10
      ! kmin 格子上の値
      xyz_avr_xqr(:,:,kmin) = 1.0d10
    end if
    
  end function xyz_avr_xqr
          | Function : | |
| aya_avr_aqa(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| aqa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
  function aya_avr_aqa(aqa_Var)
    ! 平均操作を行い y 方向半整数格子点の配列値を整数格子点上へ返す
    
    real(DP),intent(in) :: aqa_Var(imin:imax,jmin:jmax,kmin:kmax)   
    real(DP)            :: aya_avr_aqa(imin:imax,jmin:jmax,kmin:kmax)
    integer                 :: jy
    
    ! 2 次元計算(y 方向の配列要素数が 1)の場合, 代入値をそのまま返す
    if (jmin == jmax) then 
      aya_avr_aqa = aqa_Var
      return
    end if
    
    ! 平均操作
    !
    do jy = jmin+1, jmax
      aya_avr_aqa(:,jy,:) = (aqa_Var(:,jy,:) + aqa_Var(:,jy-1,:))*0.5d0 
    end do
    
    ! jmin 格子上の値
    aya_avr_aqa(:,jmin,:) = 1.0d10
    
  end function aya_avr_aqa
          | Function : | |
| aaz_avr_aar(imin:imax,jmin:jmax,kmin:kmax) : | real(DP) | 
| aar_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) | 
平均操作を行い z 方向整数格子点の配列値を半整数格子点上へ返す
  function aaz_avr_aar(aar_Var)
    ! 平均操作を行い z 方向整数格子点の配列値を半整数格子点上へ返す
    
    real(DP),intent(in) :: aar_Var(imin:imax,jmin:jmax,kmin:kmax)   
    real(DP)            :: aaz_avr_aar(imin:imax,jmin:jmax,kmin:kmax)
    integer                 :: kz
    
    ! 平均操作
    !
    do kz = kmin+1, kmax
      aaz_avr_aar(:,:,kz) = (aar_Var(:,:,kz) + aar_Var(:,:,kz-1))*0.5d0 
    end do
    
    ! kmin 格子上の値
    aaz_avr_aar(:,:,kmin) = 1.0d10
    
  end function aaz_avr_aar
          | Function : | |||
| xz_AvrY_xqz(imin:imax,kmin:kmax) : | real(DP) 
 | ||
| xqz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xqz 格子上の配列に対し y 方向平均を行う
  function xz_AvrY_xqz(xqz_Var)
    ! xqz 格子上の配列に対し y 方向平均を行う
    
    real(DP), intent(in) :: xqz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: xz_AvrY_xqz(imin:imax,kmin:kmax)       ! 出力
    
    ! 初期化
    xz_AvrY_xqz = 0.0d0
    
    ! 平均
    xz_AvrY_xqz = xz_IntY_xqz(xqz_Var)/sum(y_dy(1:ny))
    
  end function xz_AvrY_xqz
          | Function : | |||
| aa_AvrY_aya(imin:imax,kmin:kmax) : | real(DP) 
 | ||
| aya_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
aya 格子上の配列に対し y 方向平均を行う
  function aa_AvrY_aya(aya_Var)
    ! aya 格子上の配列に対し y 方向平均を行う
    
    real(DP), intent(in) :: aya_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_AvrY_aya(imin:imax,kmin:kmax)       ! 出力
    
    ! 初期化
    aa_AvrY_aya = 0.0d0
    
    ! 平均
    aa_AvrY_aya = aa_IntY_aya(aya_Var)/sum(y_dy(1:ny))
    
  end function aa_AvrY_aya
          | Function : | |||
| xz_IntY_xqz(imin:imax,kmin:kmax) : | real(DP) 
 | ||
| xqz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xqz 格子上の配列に対し y 方向積分を行う
  function xz_IntY_xqz(xqz_Var)
    ! xqz 格子上の配列に対し y 方向積分を行う
    
    real(DP), intent(in) :: xqz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: xz_IntY_xqz(imin:imax,kmin:kmax)       ! 出力
    integer                  :: ix, kz                           ! ループ添字
    
    ! 初期化
    xz_IntY_xqz = 0.0d0
    
    ! 積分
    do kz = kmin, kmax
      do ix = imin, imax
        xz_IntY_xqz(ix,kz) = IntY_q(xqz_Var(ix,:,kz))
      end do
    end do
    
  end function xz_IntY_xqz
          | Function : | |||
| aa_IntY_aya(imin:imax,kmin:kmax) : | real(DP) 
 | ||
| aya_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
aya 格子上の配列に対し y 方向積分を行う
  function aa_IntY_aya(aya_Var)
    ! aya 格子上の配列に対し y 方向積分を行う
    
    real(DP), intent(in) :: aya_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_IntY_aya(imin:imax,kmin:kmax)       ! 出力
    integer                  :: ix, kz                           ! ループ添字
    
    ! 初期化
    aa_IntY_aya = 0.0d0
    
    ! 積分
    do kz = kmin, kmax
      do ix = imin, imax
        aa_IntY_aya(ix,kz) = IntY_y(aya_Var(ix,:,kz))
      end do
    end do
    
  end function aa_IntY_aya
          | Function : | |||
| aa_AvrX_xaa(jmin:jmax,kmin:kmax) : | real(DP) 
 | ||
| xaa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xaa 格子上の配列に対し x 方向平均を行う
  function aa_AvrX_xaa(xaa_Var)
    ! xaa 格子上の配列に対し x 方向平均を行う
    real(DP), intent(in) :: xaa_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_AvrX_xaa(jmin:jmax,kmin:kmax)       ! 出力
    
    ! 初期化
    aa_AvrX_xaa = 0.0d0
    
    ! 平均
    aa_AvrX_xaa = aa_IntX_xaa(xaa_Var)/sum(x_dx(1:nx))
    
  end function aa_AvrX_xaa
          | Function : | |||
| aa_IntX_xaa(jmin:jmax,kmin:kmax) : | real(DP) 
 | ||
| xaa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xaa 格子上の配列に対し x 方向積分を行う
  function aa_IntX_xaa(xaa_Var)
    ! xaa 格子上の配列に対し x 方向積分を行う
    
    real(DP), intent(in) :: xaa_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_IntX_xaa(jmin:jmax,kmin:kmax)       ! 出力
    integer                  :: jy, kz                           ! ループ添字
    
    ! 初期化
    aa_IntX_xaa = 0.0d0
    
    ! 積分
    do kz = kmin, kmax
      do jy = jmin, jmax
        aa_IntX_xaa(jy,kz) = IntX_x(xaa_Var(:,jy,kz))
      end do
    end do
    
  end function aa_IntX_xaa
          | Function : | |||
| yz_AvrX_pyz(jmin:jmax,kmin:kmax) : | real(DP) 
 | ||
| pyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
pyz 格子上の配列に対し x 方向平均を行う
  function yz_AvrX_pyz(pyz_Var)
    ! pyz 格子上の配列に対し x 方向平均を行う
    
    real(DP), intent(in) :: pyz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: yz_AvrX_pyz(jmin:jmax,kmin:kmax)       ! 出力
    
    ! 初期化
    yz_AvrX_pyz = 0.0d0
    
    ! 平均
    yz_AvrX_pyz = yz_IntX_pyz(pyz_Var)/sum(x_dx(1:nx))
    
  end function yz_AvrX_pyz
          | Function : | |||
| aa_AvrX_xaa(jmin:jmax,kmin:kmax) : | real(DP) 
 | ||
| xaa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xaa 格子上の配列に対し x 方向平均を行う
  function aa_AvrX_xaa(xaa_Var)
    ! xaa 格子上の配列に対し x 方向平均を行う
    real(DP), intent(in) :: xaa_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_AvrX_xaa(jmin:jmax,kmin:kmax)       ! 出力
    
    ! 初期化
    aa_AvrX_xaa = 0.0d0
    
    ! 平均
    aa_AvrX_xaa = aa_IntX_xaa(xaa_Var)/sum(x_dx(1:nx))
    
  end function aa_AvrX_xaa
          | Function : | |||
| yz_IntX_pyz(jmin:jmax,kmin:kmax) : | real(DP) 
 | ||
| pyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
pyz 格子上の配列に対し x 方向積分を行う
  function yz_IntX_pyz(pyz_Var)
    ! pyz 格子上の配列に対し x 方向積分を行う
    
    real(DP), intent(in) :: pyz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: yz_IntX_pyz(jmin:jmax,kmin:kmax)       ! 出力
    integer                  :: jy, kz                           ! ループ添字
    
    ! 初期化
    yz_IntX_pyz = 0.0d0
    
    ! 積分
    do kz = kmin, kmax
      do jy = jmin, jmax
        yz_IntX_pyz(jy,kz) = IntX_p(pyz_Var(:,jy,kz))
      end do
    end do
    
  end function yz_IntX_pyz
          | Function : | |||
| aa_IntX_xaa(jmin:jmax,kmin:kmax) : | real(DP) 
 | ||
| xaa_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xaa 格子上の配列に対し x 方向積分を行う
  function aa_IntX_xaa(xaa_Var)
    ! xaa 格子上の配列に対し x 方向積分を行う
    
    real(DP), intent(in) :: xaa_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: aa_IntX_xaa(jmin:jmax,kmin:kmax)       ! 出力
    integer                  :: jy, kz                           ! ループ添字
    
    ! 初期化
    aa_IntX_xaa = 0.0d0
    
    ! 積分
    do kz = kmin, kmax
      do jy = jmin, jmax
        aa_IntX_xaa(jy,kz) = IntX_x(xaa_Var(:,jy,kz))
      end do
    end do
    
  end function aa_IntX_xaa
          | Function : | |||
| z_AvrXY_pyz(kmin:kmax) : | real(DP) 
 | ||
| pyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
pyz 格子上の配列に対し xy 方向平均を行う
  function z_AvrXY_pyz(pyz_Var)
    ! pyz 格子上の配列に対し xy 方向平均を行う
    
    real(DP), intent(in) :: pyz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: z_AvrXY_pyz(kmin:kmax)       ! 出力
    
    ! 初期化
    z_AvrXY_pyz = 0.0d0
    
    ! 平均
    z_AvrXY_pyz = z_IntXY_pyz(pyz_Var)/(sum(x_dx(1:nx))*sum(y_dy(1:ny)))
    
  end function z_AvrXY_pyz
          | Function : | |||
| z_AvrXY_xqz(kmin:kmax) : | real(DP) 
 | ||
| xqz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xqz 格子上の配列に対し xy 方向積分を行う
  function z_AvrXY_xqz(xqz_Var)
    ! xqz 格子上の配列に対し xy 方向積分を行う
    
    real(DP), intent(in) :: xqz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: z_AvrXY_xqz(kmin:kmax)       ! 出力
    
    ! 初期化
    z_AvrXY_xqz = 0.0d0
    
    ! 平均
    z_AvrXY_xqz = z_IntXY_xqz(xqz_Var)/(sum(x_dx(1:nx))*sum(y_dy(1:ny)))
    
  end function z_AvrXY_xqz
          | Function : | |||
| a_AvrXY_xya(kmin:kmax) : | real(DP) 
 | ||
| xya_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xya 格子上の配列に対し xy 方向平均を行う
  function a_AvrXY_xya(xya_Var)
    ! xya 格子上の配列に対し xy 方向平均を行う
    
    real(DP), intent(in) :: xya_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: a_AvrXY_xya(kmin:kmax)       ! 出力
    ! 初期化
    a_AvrXY_xya = 0.0d0
    
    ! 平均
    a_AvrXY_xya = a_IntXY_xya(xya_Var)/(sum(x_dx(1:nx))*sum(y_dy(1:ny)))
    
  end function a_AvrXY_xya
          | Function : | |||
| z_IntXY_pyz(kmin:kmax) : | real(DP) 
 | ||
| pyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
pyz 格子上の配列に対し xy 方向積分を行う
  function z_IntXY_pyz(pyz_Var)
    ! pyz 格子上の配列に対し xy 方向積分を行う
    
    real(DP), intent(in) :: pyz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: z_IntXY_pyz(kmin:kmax)       ! 出力
    integer                  :: kz                           ! ループ添字
    
    ! 初期化
    z_IntXY_pyz = 0.0d0
    
    ! 積分
    do kz = kmin, kmax
      z_IntXY_pyz(kz) = IntY_y(y_IntX_py(pyz_Var(:,:,kz)))
    end do
    
  end function z_IntXY_pyz
          | Function : | |||
| z_IntXY_xqz(kmin:kmax) : | real(DP) 
 | ||
| xqz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xqz 格子上の配列に対し xy 方向積分を行う
  function z_IntXY_xqz(xqz_Var)
    ! xqz 格子上の配列に対し xy 方向積分を行う
    
    real(DP), intent(in) :: xqz_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: z_IntXY_xqz(kmin:kmax)       ! 出力
    integer                  :: kz                           ! ループ添字
    
    ! 初期化
    z_IntXY_xqz = 0.0d0
    
    ! 積分
    do kz = kmin, kmax
      z_IntXY_xqz(kz) = IntY_q(q_IntX_xq(xqz_Var(:,:,kz)))
    end do
    
  end function z_IntXY_xqz
          | Function : | |||
| a_IntXY_xya(kmin:kmax) : | real(DP) 
 | ||
| xya_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(in) 
 | 
xya 格子上の配列に対し xy 方向積分を行う
  function a_IntXY_xya(xya_Var)
    ! xya 格子上の配列に対し xy 方向積分を行う
    
    real(DP), intent(in) :: xya_Var(imin:imax,jmin:jmax,kmin:kmax) ! 入力
    real(DP)             :: a_IntXY_xya(kmin:kmax)       ! 出力
    integer                  :: kz                           ! ループ添字
    
    ! 初期化
    a_IntXY_xya = 0.0d0
    
    ! 積分
    do kz = kmin, kmax
      a_IntXY_xya(kz) = IntY_y(y_IntX_xy(xya_Var(:,:,kz)))
    end do
    
  end function a_IntXY_xya