!---------------------------------------------------------------------
!     Copyright (C) GFD Dennou Club, 2005. All rights reserved.
!---------------------------------------------------------------------
! physics_qvapsat_tetens.f90 
!
! History
!   2006/10/31 ISHIWATARI Masaki

module physics_qvapsat_nha92

  use type_mod,    only : REKIND, DBKIND, INTKIND, TOKEN, STRING

  implicit none

  private
  public :: QvapSat, DQvapSatDTemp

contains

  real(DBKIND) function QvapSat(Temp, Press) result(result)
    !
    !== 飽和蒸気圧の計算
    ! Nakajima et al. (1992) の式を用いて飽和蒸気圧を計算する.
    !
    !==TODO
    ! * 引数として, 配列でも変数でも取れるようにしておくと便利だろう.
    !   interface とか使うと良いの???
    !
    use type_mod,  only: REKIND, DBKIND, INTKIND, TOKEN, STRING
    use dc_trace,  only: SetDebug, BeginSub, EndSub, DbgMessage, DataDump
    use constants_mod, only: &
         &                   EL    ,& ! 水の凝結の潜熱 
         &                   EpsV  ,& ! 水と大気の分子量比ε
         &                   RVap     ! 水蒸気気体定数


    implicit none

    real(DBKIND),intent(in) :: Temp
    real(DBKIND),intent(in) :: Press
    character(STRING), parameter:: subname = "QvapSat"
  continue

    ! 開始処理
    call BeginSub( subname )

    result = Epsv  &
            & * 1.4d+11* EXP( - 5250.87d0/Temp ) &
            & / Press

    ! 終了処理
    call EndSub( subname )

  end function QvapSat

  real(DBKIND) function DQvapSatDTemp(Temp, Press) result(result)
    !
    !== 飽和蒸気圧の微分の計算
    ! * Nakajima et al. (1992) の式を用いて算する.
    ! * AGCM5 では, 引数として,  温度と飽和比湿を与えていたが, 温度と圧力に変更した.
    !==TODO
    ! * 引数として, 配列でも変数でも取れるようにしておくと便利だろう.
    !   interface とか使うと良いの???
    !
    use type_mod,  only: REKIND, DBKIND, INTKIND, TOKEN, STRING
    use dc_trace,  only: SetDebug, BeginSub, EndSub, DbgMessage, DataDump
    use constants_mod, only: &
         &                   EL    ,& ! 水の凝結の潜熱 
         &                   EpsV  ,& ! 水と大気の分子量比ε
         &                   RVap     ! 水蒸気気体定数


    implicit none

    real(DBKIND),intent(in) :: Temp
    real(DBKIND),intent(in) :: Press
    character(STRING), parameter:: subname = "QvapSat"
  continue

    ! 開始処理
    call BeginSub( subname )

    result = 5250.87d0/(Temp * Temp) &
      & * Epsv  &
      & * 1.4d+11* EXP( - 5250.87d0/Temp ) &
      & / Press

    ! 終了処理
    call EndSub( subname )

  end function DQvapSatDTemp

end module physics_qvapsat_nha92
