!= Module BasicSet
!
! Authors::   SUGIYAMA Ko-ichiro, ODAKA Masatsugu
! Version::   $Id: basicset.f90,v 1.1 2011-04-26 04:08:10 sugiyama Exp $
! Tag Name::  $Name:  $
! Copyright:: Copyright (C) GFD Dennou Club, 2007. All rights reserved.
! License::   See COPYRIGHT[link:../../COPYRIGHT]
!
!== Overview 
!
! デフォルトの基本場を設定するための変数参照型モジュール
! * BasicEnvFile_init: 基本場の値を netCDF ファイルから取得
! * BasicEnvCalc_Init: 基本場の情報を Namelist から取得して値を計算
!
!== Error Handling
!
!== Known Bugs
!
!== Note
!
!== Future Plans
!

module basicset
  !
  !デフォルトの基本場を設定するための変数参照型モジュール
  !ただし, hogeBasicZ となる配列は, 外部から値を入力することで
  !初期化を行う. 
  !

  !モジュール読み込み
  use dc_types,   only: DP, STRING
  use dc_iounit,  only: FileOpen
  use dc_message, only: MessageNotify   !メッセージ出力  
  use gridset,    only: imin,       &! 配列の X 方向の下限
    &                   imax,       &! 配列の X 方向の上限
    &                   jmin,       &! 配列の Z 方向の下限
    &                   jmax,       &! 配列の Z 方向の上限
    &                   kmin,       &! 配列の Z 方向の下限
    &                   kmax,       &! 配列の Z 方向の上限
    &                   nf          ! 化学種の数

  !暗黙の型宣言禁止
  implicit none

  !save 属性
  private

  !Public Interface
  real(DP), allocatable  :: xyz_DensBasicZ(:,:,:)    !密度
  real(DP), allocatable  :: xyz_PressBasicZ(:,:,:)   !無次元圧力
  real(DP), allocatable  :: xyz_ExnerBasicZ(:,:,:)   !無次元圧力
  real(DP), allocatable  :: xyz_TempBasicZ(:,:,:)    !温度
  real(DP), allocatable  :: xyz_PotTempBasicZ(:,:,:) !温位
  real(DP), allocatable  :: xyz_VelSoundBasicZ(:,:,:)!音速
  real(DP), allocatable  :: xyza_MixRtBasicZ(:,:,:,:)!凝縮成分混合比
  real(DP), allocatable  :: xyz_EffMolWtBasicZ(:,:,:)!分子量効果

  save   xyz_DensBasicZ, xyz_PressBasicZ, xyz_ExnerBasicZ, xyz_TempBasicZ, &
    &    xyz_PotTempBasicZ, xyz_VelSoundBasicZ, xyza_MixRtBasicZ, xyz_EffMolWtBasicZ
  public xyz_DensBasicZ, xyz_PressBasicZ, xyz_ExnerBasicZ, xyz_TempBasicZ, &
    &    xyz_PotTempBasicZ, xyz_VelSoundBasicZ, xyza_MixRtBasicZ, xyz_EffMolWtBasicZ
  public basicset_init

contains

!!!-----------------------------------------------------------------!!!
  subroutine basicset_init(                                     &
    & xyz_Press, xyz_Exner, xyz_Temp, xyz_PotTemp, xyz_Dens,    & 
    & xyz_VelSound, xyza_MixRt, xyz_EffMolWt &
    & )
    !
    ! 基本場の値を外部から取得する. 
    ! dry の場合は混合比や乾燥成分と凝結成分の存在比を陽に使わないので,
    ! これらの変数は optional にしている. 
    !
    
    !入力変数
    real(DP), intent(in) :: xyz_Press(imin:imax,jmin:jmax,kmin:kmax)
    real(DP), intent(in) :: xyz_Exner(imin:imax,jmin:jmax,kmin:kmax)
    real(DP), intent(in) :: xyz_Temp(imin:imax,jmin:jmax,kmin:kmax)
    real(DP), intent(in) :: xyz_PotTemp(imin:imax,jmin:jmax,kmin:kmax)
    real(DP), intent(in) :: xyz_Dens(imin:imax,jmin:jmax,kmin:kmax)
    real(DP), intent(in) :: xyz_VelSound(imin:imax,jmin:jmax,kmin:kmax)
    real(DP), intent(in), optional :: xyza_MixRt(imin:imax,jmin:jmax,kmin:kmax,nf)
    real(DP), intent(in), optional :: xyz_EffMolWt(imin:imax,jmin:jmax,kmin:kmax)

    ! 配列の初期化
    call basicset_array_init
    
    !値の入力
    xyz_PressBasicZ    = xyz_Press
    xyz_ExnerBasicZ    = xyz_Exner
    xyz_TempBasicZ     = xyz_Temp
    xyz_PotTempBasicZ  = xyz_PotTemp
    xyz_DensBasicZ     = xyz_Dens
    xyz_VelSoundBasicZ = xyz_VelSound
    if (present(xyza_MixRt))   xyza_MixRtBasicZ = xyza_MixRt
    if (present(xyz_EffMolWt)) xyz_EffMolWtBasicZ = xyz_EffMolWt
    
  end subroutine basicset_init


  subroutine basicset_array_init
    !
    ! *BasicZ な配列の初期化
    !

    allocate( & 
      & xyz_DensBasicZ    (imin:imax,jmin:jmax,kmin:kmax), &
      & xyz_PressBasicZ   (imin:imax,jmin:jmax,kmin:kmax), &
      & xyz_ExnerBasicZ   (imin:imax,jmin:jmax,kmin:kmax), &
      & xyz_TempBasicZ    (imin:imax,jmin:jmax,kmin:kmax), &
      & xyz_PotTempBasicZ (imin:imax,jmin:jmax,kmin:kmax), &
      & xyz_VelSoundBasicZ(imin:imax,jmin:jmax,kmin:kmax), &
      & xyza_MixRtBasicZ  (imin:imax,jmin:jmax,kmin:kmax,nf), &
      & xyz_EffMolWtBasicZ(imin:imax,jmin:jmax,kmin:kmax)  &
      & )

    ! 値の確定
    xyz_DensBasicZ     = 0.0d0
    xyz_PressBasicZ    = 0.0d0   
    xyz_ExnerBasicZ    = 0.0d0   
    xyz_TempBasicZ     = 0.0d0   
    xyz_PotTempBasicZ  = 0.0d0
    xyz_VelSoundBasicZ = 0.0d0
    xyza_MixRtBasicZ   = 0.0d0
    xyz_EffMolWtBasicZ = 1.0d0 ! dry の場合は必ず 1.0
    
  end subroutine basicset_array_init
  
end module basicset
