!----------------------------------------------------------------------
!  Copyright (c) 2006 - Masatsugu Odaka. All rights reserved. 
!----------------------------------------------------------------------
!
!= 3 次元 (xyz方向) 等間隔交互格子 基本モジュール
!
!* 履歴
!  * 2007/07/15 (小高正嗣) : 3D deepconv へ移植, dc_types を Use.
!  * 2006/06/07 (小高正嗣) : 新規作成
!

module xyz_module
  !== 概要
  !
  ! xyz_module は, 2 次元 (xyz 方向) 不等間隔交互格子を用いた有限差分法に
  ! 基づく数値モデルのための, Fortran90 副プログラムおよび関数を提供する.
  ! 
  ! xyz_module は以下のモジュールから構成される.
  ! 
  ! : xyz_base_module
  !   格子点設定, 平均操作などの基本的な副プログラム/関数を提供するモジュール
  ! : xyz_bc_module
  !   境界条件を設定する関数を提供するモジュール
  !
  ! 
  !== 変数, 手続きの命名法
  !
  ! * 変数配列は
  ! 
  !     (次元情報を示す文字列)_(変数名)
  ! 
  !   のように命名する.
  ! 
  ! * 配列を引数とする関数は
  !    
  !     (出力の次元情報を示す文字列)_(手続き名)_(入力の次元情報を示す文字列)
  ! 
  !   のように命名する.
  ! 
  ! * 配列を引数とする副プログラムは
  !    
  !     (手続き名)_(入力の次元情報を示す文字列)
  ! 
  !   のように命名する.
  !
  ! * 次元情報を示す文字列は, 文字数で配列の次元を表し, 文字の種類で
  !   格子点の位置を表す.
  ! 
  !     xyz : xyz 方向半整数格子点上の 2 次元配列
  !     pxz : x 方向整数格子, yz 方向半正数点上の 2 次元配列
  !     xqz : y 方向整数格子, xz 方向半正数点上の 2 次元配列
  !     xyr : z 方向整数格子, xy 方向半正数点上の 2 次元配列
  ! 
  !
  !== 変数, 手続きの要約
  !
  !=== 初期化 (xyz_base_module)
  !
  ! xyz_axis_init   :: 配列の上下限の値と格子点座標値, 格子点間隔を設定する
  ! 
  !=== 座標変数 (xyz_base_module)
  !
  ! imin, imax, jmin, jmax, kmin, kmax :: 配列の上限, 下限
  ! xmargin, ymargin, zmargin          :: 糊代格子点数
  ! x_X, p_X, y_Y, q_Y, z_Z, r_Z       :: 格子点座標(1次元)
  ! xyz_X, xyz_Y, xyz_Z                :: 格子点座標(3次元)
  ! x_dx, p_dx, y_dy, q_dy, z_dz, r_dz :: 格子間隔(半整数格子, 整数格子)
  !
  !=== 基本関数 (xyz_base_module)
  ! 
  ! x_avr_p, p_avr_x, y_avr_q, q_avr_y、z_avr_r, r_avr_z  :: 格子点間の変換(1次元)
  ! xyz_avr_pyz, xyr_avr_pyr, xqz_avr_pqz :: 格子点間の変換(3次元)
  ! pyz_avr_xyz, pyr_avr_xyr, pqz_avr_xqz :: 格子点間の変換(3次元)
  ! xyz_avr_xqz, pyz_avr_pqz, xyr_avr_xqr :: 格子点間の変換(3次元)
  ! xqz_avr_xyz, pqz_avr_pyz, xqr_avr_xyr :: 格子点間の変換(3次元)
  ! xyz_avr_xyr, pyz_avr_pyr, xqz_avr_xqr :: 格子点間の変換(3次元)
  ! xyr_avr_xyz, pyr_avr_pyz, xqr_avr_xqz :: 格子点間の変換(3次元)
  ! pqz_avr_xyz, pyr_avr_xyz, xqr_avr_xyz :: 格子点間の変換(3次元)
  ! xyz_avr_pqz, xyz_avr_pyr, xyz_avr_xqr :: 格子点間の変換(3次元)
  ! yz_IntX_xyz, yz_IntX_pyz, qz_IntX_xqz, yr_IntX_xyr   :: x 方向積分
  ! xz_IntY_xyz, xz_IntY_xqz, pz_IntY_pyz, xr_IntY_xyr   :: y 方向積分
  ! xy_IntZ_xyz, xy_IntZ_xyr, py_IntZ_pyz, xq_IntZ_xqz   :: z 方向積分
  ! z_IntXY_xyz, z_IntXY_pyz, z_IntXY_xqz, r_IntXY_xyr   :: xy 方向積分
  ! IntXYZ_xyz , IntXYZ_pyz , IntXYZ_xqz , IntXYZ_xyr,   :: 領域積分
  ! yz_AvrX_xyz, yz_AvrX_pyz, qz_AvrX_xqz, yr_AvrX_xyr   :: x 方向平均
  ! xz_AvrY_xyz, xz_AvrY_xqz, pz_AvrY_pyz, xr_AvrY_xyr   :: y 方向平均
  ! xy_AvrZ_xyz, xy_AvrZ_xyr, py_AvrZ_pyz, xq_AvrZ_xqz   :: z 方向平均
  ! z_AvrXY_xyz, z_AvrXY_pyz, z_AvrXY_xqz, r_AvrXY_xyr   :: xy 方向平均
  ! AvrXYZ_xyz , AvrXYZ_pyz , AvrXYZ_xqz , AvrXYZ_xyr    :: 領域平均
  !
  !=== 境界条件設定 (xyz_bc_module)
  !
  !==== x 方向の境界条件設定
  ! 
  ! BoundaryXSym_xyz, BoundaryXAsym_xyz, BoundaryXCyc_xyz 
  ! BoundaryXSym_xqz, BoundaryXAsym_xqz, BoundaryXCyc_xqz 
  ! BoundaryXSym_xyr, BoundaryXAsym_xyr, BoundaryXCyc_xyr 
  ! BoundaryXSym_pyz, BoundaryXAsym_pyz, BoundaryXCyc_pyz 
  !
  !==== y 方向の境界条件設定
  !
  ! BoundaryYSym_xyz, BoundaryYAsym_xyz, BoundaryYCyc_xyz 
  ! BoundaryYSym_xqz, BoundaryYAsym_xqz, BoundaryYCyc_xqz 
  ! BoundaryYSym_xyr, BoundaryYAsym_xyr, BoundaryYCyc_xyr 
  ! BoundaryYSym_pyz, BoundaryYAsym_pyz, BoundaryYCyc_pyz 
  !
  !==== z 方向の境界条件設定
  !
  ! BoundaryZSym_xyz, BoundaryZAsym_xyz, BoundaryZCyc_xyz 
  ! BoundaryZSym_xqz, BoundaryZAsym_xqz, BoundaryZCyc_xqz 
  ! BoundaryZSym_xyr, BoundaryZAsym_xyr, BoundaryZCyc_xyr 
  ! BoundaryZSym_pyz, BoundaryZAsym_pyz, BoundaryZCyc_pyz 
  !

  use xyz_base_module, only : &
    &                imin, imax, x_X, p_X, x_dx, p_dx,                     &
    &                jmin, jmax, y_Y, q_Y, y_dy, q_dy,                     &
    &                kmin, kmax, z_Z, r_Z, z_dz, r_dz,                     &
    &                xmargin, ymargin, zmargin,                            &
    &                xyz_X, xyz_Y, xyz_Z, xyz_dX, xyz_dY, xyz_dZ,          &
    &                xyz_axis_init,                                        &
    &                xyz_avr_pyz, xyr_avr_pyr, xqz_avr_pqz, &
    &                pyz_avr_xyz, pyr_avr_xyr, pqz_avr_xqz, &
    &                xyz_avr_xqz, pyz_avr_pqz, xyr_avr_xqr, &
    &                xqz_avr_xyz, pqz_avr_pyz, xqr_avr_xyr, &
    &                xyz_avr_xyr, pyz_avr_pyr, xqz_avr_xqr, &
    &                xyr_avr_xyz, pyr_avr_pyz, xqr_avr_xqz, &
    &                pqz_avr_xyz, pyr_avr_xyz, xqr_avr_xyz, &
    &                xyz_avr_pqz, xyz_avr_pyr, xyz_avr_xqr, &
    &                yz_IntX_xyz, yz_IntX_pyz, qz_IntX_xqz, yr_IntX_xyr,   &
    &                xz_IntY_xyz, xz_IntY_xqz, pz_IntY_pyz, xr_IntY_xyr,   & 
    &                xy_IntZ_xyz, xy_IntZ_xyr, py_IntZ_pyz, xq_IntZ_xqz,   &
    &                z_IntXY_xyz, z_IntXY_pyz, z_IntXY_xqz, r_IntXY_xyr,   &
    &                IntXYZ_xyz , IntXYZ_pyz , IntXYZ_xqz , IntXYZ_xyr,    &
    &                yz_AvrX_xyz, yz_AvrX_pyz, qz_AvrX_xqz, yr_AvrX_xyr,   &
    &                xz_AvrY_xyz, xz_AvrY_xqz, pz_AvrY_pyz, xr_AvrY_xyr,   &
    &                xy_AvrZ_xyz, xy_AvrZ_xyr, py_AvrZ_pyz, xq_AvrZ_xqz,   & 
    &                z_AvrXY_xyz, z_AvrXY_pyz, z_AvrXY_xqz, r_AvrXY_xyr,   &
    &                AvrXYZ_xyz , AvrXYZ_pyz , AvrXYZ_xqz , AvrXYZ_xyr    

  use xyz_bc_module, only : BoundaryXSym_xyz, BoundaryXAsym_xyz, &
    &                       BoundaryXCyc_xyz, BoundaryXSym_xqz,  &
    &                       BoundaryXAsym_xqz, BoundaryXCyc_xqz, &
    &                       BoundaryXSym_xyr, BoundaryXAsym_xyr, &
    &                       BoundaryXCyc_xyr, BoundaryXSym_pyz,  &
    &                       BoundaryXAsym_pyz, BoundaryXCyc_pyz, &
    &                       BoundaryYSym_xyz, BoundaryYAsym_xyz, &
    &                       BoundaryYCyc_xyz, BoundaryYSym_xqz,  &
    &                       BoundaryYAsym_xqz, BoundaryYCyc_xqz, &
    &                       BoundaryYSym_xyr, BoundaryYAsym_xyr, &
    &                       BoundaryYCyc_xyr, BoundaryYSym_pyz,  &
    &                       BoundaryYAsym_pyz, BoundaryYCyc_pyz, &
    &                       BoundaryZSym_xyz, BoundaryZAsym_xyz, &
    &                       BoundaryZCyc_xyz, BoundaryZSym_xqz,  &
    &                       BoundaryZAsym_xqz, BoundaryZCyc_xqz, &
    &                       BoundaryZSym_xyr, BoundaryZAsym_xyr, &
    &                       BoundaryZCyc_xyr, BoundaryZSym_pyz,  &
    &                       BoundaryZAsym_pyz, BoundaryZCyc_pyz 

  implicit none
  public  

end module xyz_module
