!= Module WarmRainPrm_3d
!
! Authors::   SUGIYAMA Ko-ichiro, ODAKA Masatsugu
! Version::   $Id: warmrainprm_3d.f90,v 1.1 2008-06-19 16:53:25 odakker Exp $
! Tag Name::  $Name:  $
! Copyright:: Copyright (C) GFD Dennou Club, 2006. All rights reserved.
! License::   See COPYRIGHT[link:../../COPYRIGHT]
!
!== Overview
!
!暖かい雨のバルク法を用いた, 水蒸気と雨, 雲と雨の混合比の変換係数を求める.
!   * 中島健介 (1994) で利用した定式をそのまま利用. 
! 
!== Error Handling
!
!== Bugs
!
!== Note
!
!== Future Plans
!
!

module WarmRainPrm_3d
  !
  !暖かい雨のバルク法を用いた, 水蒸気と雨, 雲と雨の混合比の変換係数を求める.
  !   * 中島健介 (1994) で利用した定式をそのまま利用. 
  ! 
  
  !モジュール読み込み
  use dc_types,   only : DP
  use dc_iounit,  only : FileOpen
  use dc_message, only : MessageNotify

  use gridset,    only : DimXMin,           &!x 方向の配列の下限
    &                    DimXMax,           &!x 方向の配列の上限
    &                    DimYMin,           &!y 方向の配列の上限
    &                    DimYMax,           &!y 方向の配列の上限
    &                    DimZMin,           &!z 方向の配列の下限
    &                    DimZMax,           &!z 方向の配列の上限
    &                    RegZMax,           &
    &                    SpcNum              !化学種の数
  use constants,  only : PressBasis,        &!温位の基準圧力 
    &                    CpDry,             &!乾燥成分の比熱
    &                    MolWtDry,          &!
    &                    GasRDry             !乾燥成分の気体定数 
  use basicset_3d,only : xyz_DensBasicZ,    &!基本場の密度
    &                    xyz_PotTempBasicZ, &!基本場の温位
    &                    xyz_ExnerBasicZ,   &!基本場の無次元圧力
    &                    xyz_EffMolWtBasicZ,&!基本場の分子量の寄与
    &                    xyza_MixRtBasicZ    !基本場の混合比
  use composition,only : CondNum,          &!凝結過程の数
    &                    MolWtWet,          &!
    &                    SpcWetID,          &!
    &                  IdxCG,            &!凝結過程(蒸気)の配列添え字
    &                  IdxCC,            &!凝結過程(雲)の配列添え字
    &                  IdxCR,            &!凝結過程(雲)の配列添え字
    &                  CloudNum,         &!雲の数
    &                  RainNum,          &!雨の数
    &                  IdxC,             &!雲の配列添え字
    &                  IdxR,             &!雨の配列添え字
    &                  IdxNH3,           &!NH3(蒸気)の配列添え字
    &                  IdxH2S,           &!H2S(蒸気)の配列添え字
    &                  IdxNH4SHr          !NH4SH(雨)の配列添え字

!  use ChemCalc_3d, only : xyz_SvapPress, xyz_LatentHeat, ReactHeatNH4SH
!  use MoistFunc_3d,only : xyz_DelMixRtNH4SH
!  use StoreMixRt,  only : StoreMixRtRain
  
  !暗黙の型宣言禁止
  implicit none

  !属性の指定
  private

  !関数を public にする
  public WarmRainPrm_Init
  public xyza_FallRain

  real(DP)      :: FactorJ      = 1.0d0 !雲物理過程のパラメータ
                                       !木星では 3.0d0
                                       !地球では 1.0d0 とする
  real(DP)      :: AutoConvTime = 1.0d3 !併合成長の時定数 [sec]
  real(DP)      :: MixRt_AutoConvCr = 1.0d-3 
                                       !併合成長を生じる臨界混合比 [kg/kg]

  save FactorJ, AutoConvTime, MixRt_AutoConvCr

contains  

!!!=================================================================================!!!
  subroutine WarmRainPrm_Init( cfgfile )

    !暗黙の型宣言禁止
    implicit none

    !入力変数
    character(*), intent(in) :: cfgfile

    !内部変数
    integer                  :: unit    !装置番号

    !-----------------------------------------------------------
    ! NAMELIST から情報を取得
    !-----------------------------------------------------------
    ! NAMELIST から情報を取得
    NAMELIST /warmrainprm/                              &
      & FactorJ, AutoConvTime, MixRt_AutoConvCr

    call FileOpen(unit, file=cfgfile, mode='r')
    read(unit, NML=warmrainprm)
    close(unit)

    call MessageNotify( "M", &
      &  "WarmRainPrm_Init", "FactorJ = %f",  d=(/FactorJ/) )
    call MessageNotify( "M", &
      &  "WarmRainPrm_Init", "AutoConvTime = %f",  d=(/AutoConvTime/) )
    call MessageNotify( "M", &
      &  "WarmRainPrm_Init", "MixRt_AutoConvCr = %f",  d=(/MixRt_AutoConvCr/) )
    
  end subroutine WarmRainPrm_Init


!!!=================================================================================!!!
  function xyza_FallRain( xyza_MixRt )
    !
    ! 雨粒の落下による移流を求める. 
    ! 
    use xyz_base_module, only : xyr_avr_xyz
    use xyz_deriv_module,only : xyz_dz_xyr
    
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(DP), intent(in) :: xyza_MixRt(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax,SpcNum) 
                                                 !蒸気混合比(擾乱)
    real(DP)  :: xyza_MixRtAll(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax,SpcNum)
                                                 !蒸気混合比(擾乱 + 平均場)
    real(DP)  :: xyza_FallRain(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax,SpcNum)
                                                 !雨粒の落下効果
    real(DP)  :: xyra_FallRainFlux(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax,SpcNum)
                                                 !雨粒の落下効果
    real(DP)  :: xyz_VelZRain(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax)
                                                 !雨粒落下速度
    integer  :: s

    xyza_MixRtAll = max( 0.0d0, xyza_MixRt + xyza_MixRtBasicZ )
    xyza_FallRain = 0.0d0
    xyz_VelZRain = 0.0d0
    
    !落下による移流
    !  Dens の avr を取ってから割ると, ゼロ割が生じるので注意

    do s = 1, RainNum
      !雨粒終端速度
      xyz_VelZRain = - 12.2d0 * FactorJ * ( xyza_MixRtAll(:,:,:,IdxR(s)) ** 0.125d0 )
      
      xyra_FallRainFlux(:,:,:,IdxR(s)) =                                    &
        &  xyr_avr_xyz (                                                    &
        &    xyz_DensBasicZ * xyza_MixRtAll(:,:,:,IdxR(s)) * xyz_VelZRain   &
        &   )

      xyra_FallRainFlux(:, :, RegZMax, IdxR(s)) = 0.0d0

      xyza_FallRain(:,:,:,IdxR(s)) =                                    &
        &  - xyz_dz_xyr( xyra_FallRainFlux(:,:,:,IdxR(s)) ) / xyz_DensBasicZ  

    end do
    
!    call StoreMixRtRain( xyza_FallRain )
    
  end function xyza_FallRain
  
  
end module WarmRainPrm_3d
