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

module physics_qvapsat_tetens

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

  implicit none

  private
  public :: QvapSat, DQvapSatDTemp

contains

  real(DBKIND) function QvapSat(Temp, Press) result(result)
    !
    !== 飽和蒸気圧の計算
    ! Tetens の式を用いて飽和蒸気圧を計算する.
    !
    !==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  ,& ! 水と大気の分子量比ε
         &                   ES0   ,& ! ０℃飽和蒸気圧：Ｐａ
         &                   RVap     ! 水蒸気気体定数

    implicit none

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

    ! 開始処理
    call BeginSub( subname )

    result = EpsV * ES0  &
         & *  EXP( EL / RVap * ( 1.0d0/273.0d0 - 1.0d0/Temp ) ) / Press

    ! 終了処理
    call EndSub( subname )

  end function QvapSat

  real(DBKIND) function DQvapSatDTemp(Temp, Press) result(result)
    !
    !== 飽和蒸気圧の温度微分の計算
    ! Tetens の式を用いて飽和蒸気圧を計算する.
    !
    !==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  ,& ! 水と大気の分子量比ε
         &                   ES0   ,& ! ０℃飽和蒸気圧：Ｐａ
         &                   RVap     ! 水蒸気気体定数

    implicit none

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

    ! 開始処理
    call BeginSub( subname )

    result = EL/ (RVap * Temp * Temp) * EpsV * ES0  &
         & *  EXP( EL / RVap * ( 1.0d0/273.0d0 - 1.0d0/Temp ) ) / Press

    ! 終了処理
    call EndSub( subname )

  end function DQvapSatDTemp

end module physics_qvapsat_tetens
