!---------------------------------------------------------------------
!     Copyright (C) GFD Dennou Club, 2005. All rights reserved.
!---------------------------------------------------------------------
!= Module ConvertUnit
!
!   * Developer: SUGIYAMA Ko-ichiro
!   * Version: $Id: $
!   * Tag Name: $Name:  $
!   * Change History: 
!
!== Overview
!
!単位変換のためのモジュール
!   * 蒸気圧から飽和混合比へ変換
! 
!== Error Handling
!
!== Bugs
!
!== Note
!
!== Future Plans
!
!

module ConvertUnit

  interface ss_Vap2MixRt_ss_ss
    function ss_Vap2MixRt_ss_ss(ss_VapAll, ss_ExnerAll)
      use gridset
      real(8), intent(in) :: ss_VapAll(DimXMin:DimXMax, DimZMin:DimZMax) 
                                       !蒸気圧(擾乱成分と基本場の和)    [Pa]
      real(8), intent(in) :: ss_ExnerAll(DimXMin:DimXMax, DimZMin:DimZMax) 
                                       !エクスナー関数(擾乱成分と基本場の和)
      real(8)             :: ss_Vap2MixRt_ss(DimXMin:DimXMax, DimZMin:DimZMax) 
                                       !蒸気圧から混合比への変換
    end function ss_Vap2MixRt_ss_ss
  end interface

  interface Vap2MixRt
    function Vap2MixRt(VapAll, ExnerAll)
      real(8), intent(in) :: VapAll    !蒸気圧(擾乱成分と基本場の和)    [Pa]
      real(8), intent(in) :: ExnerAll  !エクスナー関数(擾乱成分と基本場の和)
      real(8)             :: Vap2MixRt !蒸気圧から混合比への変換
    end function Vap2MixRt
  end interface

end module ConvertUnit



function ss_Vap2MixRt_ss_ss(ss_VapAll, ss_ExnerAll)
  !Dependency
  use gridset, only: DimXMin,    & ! x 方向の配列の下限
    &                DimXMax,    & ! x 方向の配列の上限
    &                DimZMin,    & ! z 方向の配列の下限
    &                DimZMax       ! z 方向の配列の上限
  use physset, only: PressSfc,   & !標準圧力               [Pa]
    &                CpDry,      & !乾燥成分の平均定圧比熱 [J/K kg]
    &                MolWtDry,   & !乾燥成分の平均分子量   [kg/mol]
    &                MolWtWet,   & !乾燥成分の平均分子量   [kg/mol]
    &                GasRDry       !乾燥成分の気体定数     [J/K mol]

  !暗黙の型宣言禁止
  implicit none 

  !入出力変数
  real(8), intent(in) :: ss_VapAll(DimXMin:DimXMax, DimZMin:DimZMax) 
                                   !蒸気圧(擾乱成分と基本場の和)   [Pa]
  real(8), intent(in) :: ss_ExnerAll(DimXMin:DimXMax, DimZMin:DimZMax) 
                                   !エクスナー関数(擾乱成分と基本場の和)
  real(8)             :: ss_Vap2MixRt_ss_ss(DimXMin:DimXMax, DimZMin:DimZMax) 
                                   !蒸気圧から混合比への変換
 
  ss_Vap2MixRt_ss_ss = 0.0d0
  ss_Vap2MixRt_ss_ss = &
    & ((MolWtWet/MolWtDry) * ss_VapAll) &
    & / (PressSfc * (ss_ExnerAll ** (CpDry / GasRDry)) - ss_VapAll)
  
end function ss_Vap2MixRt_ss_ss


function Vap2MixRt(VapAll, ExnerAll)
  use physset, only: PressSfc,   & !標準圧力               [Pa]
    &                CpDry,      & !乾燥成分の平均定圧比熱 [J/K kg]
    &                MolWtDry,   & !乾燥成分の平均分子量   [kg/mol]
    &                MolWtWet,   & !乾燥成分の平均分子量   [kg/mol]
    &                GasRDry       !乾燥成分の気体定数     [J/K mol]

  !暗黙の型宣言禁止
  implicit none 

  !入出力変数
  real(8), intent(in) :: VapAll    !蒸気圧(擾乱成分と基本場の和)    [Pa]
  real(8), intent(in) :: ExnerAll  !エクスナー関数(擾乱成分と基本場の和)
  real(8)             :: Vap2MixRt !蒸気圧から混合比への変換
 
  Vap2MixRt = 0.0d0
  Vap2MixRt = &
    & ((MolWtWet/MolWtDry) * VapAll) &
    & / (PressSfc * (ExnerAll ** (CpDry / GasRDry)) - VapAll)
  
end function Vap2MixRt
