Class | Thermo_Function |
In: |
thermo_function.f90
|
熱力学に関係する関数集 熱力学変数間の変換関数の場合, "..2.."という形になる. この場合, 2 の前に来ているものから 2 の後にくるものに変換するという ことを意味している.
Function : | |||
Cefp : | real | ||
qv : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
水蒸気混合比から有効定圧比熱を計算する.
real function Cefp( qv, dl ) ! 水蒸気混合比から有効定圧比熱を計算する. use Thermo_Const implicit none real, intent(in) :: qv ! 水蒸気混合比 [kg/kg] integer, intent(in), optional :: dl ! デバッグレベル Cefp=(Cpd+qv*Cpv)/(1.0+qv) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'Cefp', Cefp, 'J K-1 kg-1' ) end if return end function
Function : | |||
Cefv : | real | ||
qv : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
水蒸気混合比から有効定積比熱を計算する.
real function Cefv( qv, dl ) ! 水蒸気混合比から有効定積比熱を計算する. use Thermo_Const implicit none real, intent(in) :: qv ! 水蒸気混合比 [kg/kg] integer, intent(in), optional :: dl ! デバッグレベル Cefv=(Cvd+qv*Cvv)/(1.0+qv) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'Cefv', Cefv, 'J K-1 kg-1' ) end if return end function
Function : | |||
Cl : | real | ||
T : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
液水の比熱を計算する.
real function Cl( T, dl ) ! 液水の比熱を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] integer, intent(in), optional :: dl ! デバッグレベル real, parameter :: c1=4190.0, c2=4770.0 real :: val_rat, tref val_rat=(c1-c2)/40.0 tref=273.15-40.0 if(T>=273.15)then Cl=c1 else Cl=c2+val_rat*(T-tref) end if if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'Cl', Cl, 'J K-1 kg-1' ) end if return end function
Function : | |||
DSE_Emanuel : | real | ||
T : | real, intent(in)
| ||
qv : | real, intent(in)
| ||
z : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
Emanuel (1994) の (4.5.24) で定義される乾燥静的エネルギーを計算する.
real function DSE_Emanuel( T, qv, z, dl ) ! Emanuel (1994) の (4.5.24) で定義される乾燥静的エネルギーを計算する. use Thermo_Const use Phys_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: qv ! 水蒸気混合比 [kg/kg] real, intent(in) :: z ! 地表面高度 [m] integer, intent(in), optional :: dl ! デバッグレベル integer :: i, n DSE_Emanuel=(Cpd+qv*Cpv)*T+(1.0+qv)*g*z if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'DSE_Emanuel', DSE_Emanuel, 'J kg-1' ) end if return end function
Function : | |||
LH : | real | ||
T : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
温度 T における潜熱の計算 本関数は, 潜熱を一定とした場合の結果とそれほど大きな差は生まれない. 本計算式は, 潜熱の温度変化に関する方程式「キルヒホッフの式」を用いた. また, その際に必要な液相の水の定圧比熱および水蒸気圧の定圧比熱は 温度依存性がないものと仮定し, それぞれ $C_l=4190,\; C_{pv}=1870$という値を用いて導出した関係式である. よって, 用いる比熱の値やその温度依存性を考慮すると係数が少し変化する可能性.
real function LH(T, dl) ! 温度 T における潜熱の計算 ! 本関数は, 潜熱を一定とした場合の結果とそれほど大きな差は生まれない. ! 本計算式は, 潜熱の温度変化に関する方程式「キルヒホッフの式」を用いた. ! また, その際に必要な液相の水の定圧比熱および水蒸気圧の定圧比熱は ! 温度依存性がないものと仮定し, それぞれ ! $C_l=4190,\; C_{pv}=1870$という値を用いて導出した関係式である. ! よって, 用いる比熱の値やその温度依存性を考慮すると係数が少し変化する可能性. use Thermo_Const implicit none real, intent(in) :: T ! 大気の温度 [K] integer, intent(in), optional :: dl ! デバッグレベル LH=LH0-2.32e3*(T-t0) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'LH', LH, 'J kg-1' ) end if return end function
Function : | |||
MSE_Emanuel : | real | ||
T : | real, intent(in)
| ||
qv : | real, intent(in)
| ||
z : | real, intent(in)
| ||
qo(:) : | real, intent(in), optional
| ||
dl : | integer, intent(in), optional
|
Emanuel (1994) の (4.5.23) で定義される湿潤静的エネルギーを計算する.
real function MSE_Emanuel( T, qv, z, qo, dl ) ! Emanuel (1994) の (4.5.23) で定義される湿潤静的エネルギーを計算する. use Thermo_Const use Phys_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: qv ! 水蒸気混合比 [kg/kg] real, intent(in) :: z ! 地表面高度 [m] real, intent(in), optional :: qo(:) ! 水蒸気以外の水物質混合比 [kg/kg] integer, intent(in), optional :: dl ! デバッグレベル integer :: i, n real :: tmpq if(present(qo))then n=size(qo) tmpq=qv do i=1,n tmpq=tmpq+qo(i) end do else tmpq=qv end if MSE_Emanuel=(Cpd+tmpq*Cl( T ))*T+LH( T )*qv+(1.0+tmpq)*g*z if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'MSE_Emanuel', MSE_Emanuel, 'J kg-1' ) end if return end function
Function : | |||
RHTP_2_qv : | real | ||
RH : | real, intent(in)
| ||
T : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
相対湿度と温度から混合比を計算する RHT_2_e から水蒸気圧を計算し, eP_2_qv から混合比を計算する.
real function RHTP_2_qv(RH,T,P, dl) ! 相対湿度と温度から混合比を計算する ! RHT_2_e から水蒸気圧を計算し, eP_2_qv から混合比を計算する. use Thermo_Const implicit none real, intent(in) :: RH ! 相対湿度 [%] real, intent(in) :: T ! 温度 [K] real, intent(in) :: P ! 全圧 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: e e=RHT_2_e(RH,T) RHTP_2_qv=eP_2_qv(e,P) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'RHTP_2_qv', RHTP_2_qv, 'kg kg-1' ) end if return end function
Function : | |||
RHT_2_e : | real | ||
RH : | real, intent(in)
| ||
T : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
相対湿度と温度から水蒸気圧を計算する $RH=(e/es)times 100$ という定義から計算.
real function RHT_2_e(RH,T, dl) ! 相対湿度と温度から水蒸気圧を計算する ! $RH=(e/es)\times 100$ という定義から計算. use Thermo_Const implicit none real, intent(in) :: RH ! 相対湿度 [%] real, intent(in) :: T ! 温度 [K] integer, intent(in), optional :: dl ! デバッグレベル real :: es es=es_Bolton(T) RHT_2_e=RH*es*1.0e-2 if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'RHT_2_e', RHT_2_e, 'Pa' ) end if return end function
Function : | |||
Reff : | real | ||
qv : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
水蒸気混合比から有効気体定数を計算する.
real function Reff( qv, dl ) ! 水蒸気混合比から有効気体定数を計算する. use Thermo_Const implicit none real, intent(in) :: qv ! 水蒸気混合比 [kg/kg] integer, intent(in), optional :: dl ! デバッグレベル Reff=(Rd+qv*Rv)/(1.0+qv) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'Reff', Reff, 'J K-1 kg-1' ) end if return end function
Function : | |||
TP_2_qvs : | real | ||
T : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
温度と全圧から飽和混合比を計算する ここでは, es_Bolton を用いて飽和水蒸気圧を計算した後, eP_2_qv を用いて混合比に変換することで飽和混合比を計算する.
real function TP_2_qvs(T,P, dl) ! 温度と全圧から飽和混合比を計算する ! ここでは, es_Bolton を用いて飽和水蒸気圧を計算した後, ! eP_2_qv を用いて混合比に変換することで飽和混合比を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: P ! 大気の全圧 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: eps real :: es eps=Rd/Rv es=es_Bolton(T) TP_2_qvs=eps*es/(P-es) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'TP_2_qvs', TP_2_qvs, 'kg kg-1' ) end if return end function
Function : | |||
TP_2_rho : | real | ||
T : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
乾燥大気の状態方程式から, 温度と気圧を与えて密度を得る.
real function TP_2_rho( T, P, dl ) ! 乾燥大気の状態方程式から, 温度と気圧を与えて密度を得る. use Thermo_Const implicit none real, intent(in) :: T ! 大気の温度 [K] real, intent(in) :: P ! 大気の圧力 [Pa] integer, intent(in), optional :: dl ! デバッグレベル TP_2_rho=p/(Rd*T) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'TP_2_rho', TP_2_rho, 'kg m-3' ) end if return end function
Function : | |||
TTd_2_RH_Bolton : | real | ||
T : | real, intent(in)
| ||
Td : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
温度と露点温度から相対湿度を計算する. Bolton の式を用いて水蒸気圧・飽和水蒸気圧を計算する.
real function TTd_2_RH_Bolton( T, Td, dl ) ! 温度と露点温度から相対湿度を計算する. ! Bolton の式を用いて水蒸気圧・飽和水蒸気圧を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: Td ! 露点温度 [K] integer, intent(in), optional :: dl ! デバッグレベル real :: e,es e=es_Bolton(Td) es=es_Bolton(T) TTd_2_RH_Bolton=(e/es)*100.0 if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'TTd_2_RH_Bolton', TTd_2_RH_Bolton, '%' ) end if return end function
Function : | |||
TTd_2_RH_tetens : | real | ||
T : | real, intent(in)
| ||
Td : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
温度と露点温度から相対湿度を計算する. tetens の式を用いて水蒸気圧・飽和水蒸気圧を計算する.
real function TTd_2_RH_tetens( T, Td, dl ) ! 温度と露点温度から相対湿度を計算する. ! tetens の式を用いて水蒸気圧・飽和水蒸気圧を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: Td ! 露点温度 [K] integer, intent(in), optional :: dl ! デバッグレベル real :: e,es e=tetens(Td) es=tetens(T) TTd_2_RH_tetens=(e/es)*100.0 if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'TTd_2_RH_tetens', TTd_2_RH_tetens, '%' ) end if return end function
Function : | |||
Tq_2_Trho : | real | ||
T : | real, intent(in)
| ||
qv : | real, intent(in)
| ||
qo(:) : | real, intent(in), optional
| ||
dl : | integer, intent(in), optional
|
温度と水物質から密度温度を計算する.
real function Tq_2_Trho( T, qv, qo, dl ) ! 温度と水物質から密度温度を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: qv ! 水蒸気混合比 [kg/kg] real, intent(in), optional :: qo(:) ! 水蒸気以外の水凝結物質混合比 [kg/kg] ! 凝結物質のカテゴリはいくらでも構わない. integer, intent(in), optional :: dl ! デバッグレベル integer :: i, n real :: tmpq if(present(qo))then n=size(qo) tmpq=qv do i=1,n tmpq=tmpq+qo(i) end do else tmpq=qv end if Tq_2_Trho=T*(1.0+qv*Rv/Rd)/(1.0+tmpq) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'Tq_2_Trho', Tq_2_Trho, 'K' ) end if return end function
Function : | |||
TqvP_2_TLCL : | real | ||
T : | real, intent(in)
| ||
qv : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
! 温度と混合比と全圧から T_LCL を計算する 混合比から水蒸気圧を求め, そこから T_LCL を計算する
real function TqvP_2_TLCL(T,qv,P, dl) !! 温度と混合比と全圧から T_LCL を計算する ! 混合比から水蒸気圧を求め, そこから T_LCL を計算する use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: qv ! 混合比 [kg / kg] real, intent(in) :: P ! 全圧 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real, parameter :: coe=2840.0, a=3.5, b=4.805, c=55.0 real :: e e=qvP_2_e(qv,P) e=e*1.0e-2 if(e>0.0)then TqvP_2_TLCL=coe/(a*log(T)-log(e)-b)+55.0 else TqvP_2_TLCL=coe/(a*log(T)-b)+55.0 ! true ?? end if if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'TqvP_2_TLCL', TqvP_2_TLCL, 'K' ) end if return end function
Function : | |||
TqvP_2_thetae : | real | ||
T : | real, intent(in)
| ||
qv : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
温度, 混合比, 全圧から相当温位を計算する. T_LCL を用いるので, そのための関数を使用する.
real function TqvP_2_thetae(T,qv,P, dl) ! 温度, 混合比, 全圧から相当温位を計算する. ! T_LCL を用いるので, そのための関数を使用する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: qv ! 混合比 [kg / kg] real, intent(in) :: P ! 全圧 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: T_LCL, kappa, theta_d, e, qvs real, parameter :: a=0.2854, b=0.28, c=3376.0, d=0.81 kappa=Rd/Cpd e=qvP_2_e(qv,P) T_LCL=TqvP_2_TLCL(T,qv,P) theta_d=T*(p0/(P-e))**kappa qvs=TP_2_qvs(T_LCL,P) TqvP_2_thetae=theta_d*exp(LH(T_LCL)*qvs/(Cpd*T_LCL)) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'TqvP_2_thetae', TqvP_2_thetae, 'K' ) end if return end function
Function : | |||
TqvP_2_thetaes : | real | ||
T : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
温度, 混合比, 全圧から飽和相当温位を計算する. T_LCL を用いるので, そのための関数を使用する.
real function TqvP_2_thetaes(T,P, dl) ! 温度, 混合比, 全圧から飽和相当温位を計算する. ! T_LCL を用いるので, そのための関数を使用する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] ! real, intent(in) :: qv ! 混合比 [kg / kg] real, intent(in) :: P ! 全圧 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: kappa, theta_d, qvs !,e real, parameter :: a=0.2854, b=0.28, c=3376.0, d=0.81 kappa=Rd/Cpd ! e=qvP_2_e(qv,P) ! theta_d=T*(p0/(P-e))**kappa theta_d=T*(p0/P)**kappa qvs=TP_2_qvs(T,P) TqvP_2_thetaes=theta_d*exp(LH(T)*qvs/(Cpd*T)) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'TqvP_2_thetaes', TqvP_2_thetaes, 'K' ) end if return end function
Function : | |||
TqvP_2_thetav : | real | ||
T : | real, intent(in)
| ||
qv : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
温度, 水蒸気混合比, 圧力から仮温位を計算する.
real function TqvP_2_thetav( T, qv, P, dl ) ! 温度, 水蒸気混合比, 圧力から仮温位を計算する. use Thermo_Const implicit none real, intent(in) :: qv ! 水蒸気混合比 [kg / kg] real, intent(in) :: T ! 温度 [K] real, intent(in) :: P ! 圧力 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: kappa, Tv kappa=Rd/cpd Tv=qvT_2_Tv(qv,T) TqvP_2_thetav=theta_dry(Tv,P) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'TqvP_2_thetav', TqvP_2_thetav, 'K' ) end if return end function
Function : | |||
TthetavP_2_qv : | real | ||
T : | real, intent(in)
| ||
thetav : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
温度, 仮温位, 圧力から水蒸気混合比を計算する.
real function TthetavP_2_qv( T, thetav, P, dl ) ! 温度, 仮温位, 圧力から水蒸気混合比を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: thetav ! 仮温位 [K] real, intent(in) :: P ! 圧力 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: Tv, eps, exn eps=Rd/Rv exn=exner_func_dry( P ) if(T/=exn*thetav)then TthetavP_2_qv=eps*((T-exn*thetav)/(eps*exn*thetav-T)) else TthetavP_2_qv=0.0 end if if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'TthetavP_2_qv', TthetavP_2_qv, 'kg kg-1' ) end if return end function
Function : | |||
TvT_2_qv : | real | ||
Tv : | real, intent(in)
| ||
T : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
仮温度と温度から水蒸気混合比を計算する.
real function TvT_2_qv( Tv, T, dl) ! 仮温度と温度から水蒸気混合比を計算する. use Thermo_Const implicit none real, intent(in) :: Tv ! 仮温度 [K] real, intent(in) :: T ! 温度 [K] integer, intent(in), optional :: dl ! デバッグレベル real :: eps eps=Rd/Rv if(Tv/=T)then TvT_2_qv=eps*((T-Tv)/(eps*Tv-T)) else TvT_2_qv=0.0 end if if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'TvT_2_qv', TvT_2_qv, 'kg kg-1' ) end if return end function
Function : | |||
WSE_Emanuel : | real | ||
T : | real, intent(in)
| ||
ql : | real, intent(in)
| ||
z : | real, intent(in)
| ||
qo(:) : | real, intent(in), optional
| ||
dl : | integer, intent(in), optional
|
Emanuel (1994) の (4.5.25) で定義される液水静的エネルギーを計算する.
real function WSE_Emanuel( T, ql, z, qo, dl ) ! Emanuel (1994) の (4.5.25) で定義される液水静的エネルギーを計算する. use Thermo_Const use Phys_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: ql ! 液水混合比 [kg/kg] real, intent(in) :: z ! 地表面高度 [m] real, intent(in), optional :: qo(:) ! 液水以外の水物質混合比(水蒸気含む) [kg/kg] integer, intent(in), optional :: dl ! デバッグレベル integer :: i, n real :: tmpq if(present(qo))then n=size(qo) tmpq=ql do i=1,n tmpq=tmpq+qo(i) end do else tmpq=ql end if WSE_Emanuel=(Cpd+tmpq*Cpv)*T-LH( T )*ql+(1.0+tmpq)*g*z if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'WSE_Emanuel', WSE_Emanuel, 'J kg-1' ) end if return end function
Function : | |||
eP_2_qv : | real | ||
e : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
水蒸気圧と全圧から混合比を計算する
real function eP_2_qv(e,P, dl) ! 水蒸気圧と全圧から混合比を計算する use Thermo_Const implicit none real, intent(in) :: e ! 水蒸気圧 [Pa] real, intent(in) :: P ! 大気の全圧 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: eps eps=Rd/Rv eP_2_qv=eps*e/(P-e) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'eP_2_qv', eP_2_qv, 'kg kg-1' ) end if return end function
Function : | |||
eT_2_RH : | real | ||
e : | real, intent(in)
| ||
T : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
水蒸気圧と温度から相対湿度を計算する $RH=(e/es)times 100$ という定義から計算.
real function eT_2_RH(e,T, dl) ! 水蒸気圧と温度から相対湿度を計算する ! $RH=(e/es)\times 100$ という定義から計算. use Thermo_Const implicit none real, intent(in) :: e ! 水蒸気圧 [Pa] real, intent(in) :: T ! 温度 [K] integer, intent(in), optional :: dl ! デバッグレベル real :: es es=es_Bolton(T) eT_2_RH=100.0*e/es if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'eT_2_RH', eT_2_RH, '%' ) end if return end function
Function : | |||
es_Bolton : | real | ||
T : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
Bolton(1980) の手法を用いて飽和水蒸気圧を計算する.
real function es_Bolton(T, dl) ! Bolton(1980) の手法を用いて飽和水蒸気圧を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 大気の温度 [K] integer, intent(in), optional :: dl ! デバッグレベル real, parameter :: a=17.67, c=29.65 es_Bolton=e0*exp(a*((T-t0)/(T-c))) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'es_Bolton', es_Bolton, 'Pa' ) end if return end function
Function : | |||
es_TD : | real | ||
e : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
es_Bolton を用いて飽和水蒸気圧の計算式の逆算から 露点温度を計算する.
real function es_TD(e, dl) ! es_Bolton を用いて飽和水蒸気圧の計算式の逆算から ! 露点温度を計算する. use Thermo_Const implicit none real, intent(in) :: e ! 大気の水蒸気圧 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real, parameter :: a=17.67, c=29.65 if(e>0.0)then es_TD=c+(a*(t0-c))/(a-log(e/e0)) else es_TD=t0 ! true ?? end if if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'es_TD', es_TD, 'Pa' ) end if return end function
Function : | |||
esi_Emanuel : | real | ||
T : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
Emanuel (1994) の (4.4.15) から氷飽和蒸気圧を計算する.
real function esi_Emanuel( T, dl ) ! Emanuel (1994) の (4.4.15) から氷飽和蒸気圧を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] integer, intent(in), optional :: dl ! デバッグレベル real, parameter :: a=23.33086, b=6111.72784, c=0.15215 esi_Emanuel=a-b/T+c*log(T) esi_Emanuel=exp(esi_Emanuel)*100.0 if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'esi_Emanuel', esi_Emanuel, 'Pa' ) end if return end function
Function : | |||
exner_func_dry : | real | ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
乾燥大気についてのエクスナー関数を計算する
real function exner_func_dry(P, dl) ! 乾燥大気についてのエクスナー関数を計算する use Thermo_Const implicit none real, intent(in) :: P ! 圧力 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: kappa kappa=Rd/Cpd exner_func_dry=(P/p0)**kappa if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'exner_func_dry', exner_func_dry, '1' ) end if return end function
Function : | |||
get_gamma_d : | real | ||
dl : | integer, intent(in), optional
|
乾燥断熱減率を呼ぶ関数(この関数必要か?)
real function get_gamma_d( dl ) ! 乾燥断熱減率を呼ぶ関数(この関数必要か?) use Thermo_Const use Phys_Const implicit none integer, intent(in), optional :: dl ! デバッグレベル get_gamma_d=-g/Cpd if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'get_gamma_d', get_gamma_d, 'K m-1' ) end if return end function
Function : | |||
goff_gratch : | real | ||
T : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
goff-gratch の式を用いて飽和水蒸気圧を計算する.
real function goff_gratch(T, dl) ! goff-gratch の式を用いて飽和水蒸気圧を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 大気の温度 [K] integer, intent(in), optional :: dl ! デバッグレベル real, parameter :: a=-7.90298, b=5.02808, c=-1.3816e-7, d=8.1328e-3 real, parameter :: pa=11.344, pb=-3.49149 real, parameter :: tst=373.15 real, parameter :: est=1.01325e5 real :: term term=a*(tst/T-1.0)+b*log10(tst/T)+c*(10.0**(pa*(1.0-T/tst))-1.0)+d*(10.0**(pb*(tst/T-1.0))-1.0) goff_gratch=est*10.0**(term) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'goff_gratch', goff_gratch, 'Pa' ) end if return end function
Function : | |||
goff_gratch_i : | real | ||
T : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
goff-gratch の式を用いて飽和水蒸気圧 (氷飽和) を計算する.
real function goff_gratch_i(T, dl) ! goff-gratch の式を用いて飽和水蒸気圧 (氷飽和) を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 大気の温度 [K] integer, intent(in), optional :: dl ! デバッグレベル real, parameter :: a=-9.09718, b=-3.56654, c=0.876793 real, parameter :: est=6.1173e2 real :: term term=a*(ti0/T-1.0)+b*log10(ti0/T)+c*(1.0-t/ti0) goff_gratch_i=ei0*10.0**(term) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'goff_gratch_i', goff_gratch_i, 'Pa' ) end if return end function
Function : | |||
hypsometric_form : | real | ||
p : | real, intent(in)
| ||
z : | real, intent(in)
| ||
T : | real, intent(in)
| ||
z_t : | real, intent(in), optional
| ||
dl : | integer, intent(in), optional
|
高度と気圧を与えてある高度の気圧を求める.
気圧の更正には対流圏における標準大気の温度減率である 6.5 [K/km] で計算する.
real function hypsometric_form(p,z,T,z_t, dl) ! 高度と気圧を与えてある高度の気圧を求める. ! 気圧の更正には対流圏における標準大気の温度減率である 6.5 [K/km] で計算する. use Thermo_Const implicit none real, intent(in) :: p ! 基準となる高度における圧力 [Pa] real, intent(in) :: z ! 基準となる高度 [m] real, intent(in) :: T ! 基準点での温度 [K] real, intent(in), optional :: z_t ! 求める高度 [m] : デフォルトでは 0 m. integer, intent(in), optional :: dl ! デバッグレベル real, parameter :: gam = 6.5e-3 ! 標準大気の温度減率 [K/m] real :: z_calc, p_tmp !write(*,*) "hypsometric, g=", g if(present(z_t))then z_calc=z_t else z_calc=0.0 end if p_tmp=p*((T+gam*z)/(T+gam*z_calc))**(g/(gam*Rd)) hypsometric_form=p_tmp if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'hypsometric_form', hypsometric_form, 'Pa' ) end if return end function
Function : | |||
liquid_enthal : | real | ||
T : | real, intent(in)
| ||
ql : | real, intent(in)
| ||
qo(:) : | real, intent(in), optional
| ||
dl : | integer, intent(in), optional
|
温度と水物質から液水エンタルピーを計算する.
real function liquid_enthal( T, ql, qo, dl ) ! 温度と水物質から液水エンタルピーを計算する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: ql ! 液体水混合比 [kg/kg] real, intent(in), optional :: qo(:) ! 液体水以外の水物質混合比 [kg/kg] ! 水物質のカテゴリはいくらでも構わない(水蒸気も含む). integer, intent(in), optional :: dl ! デバッグレベル integer :: i, n real :: tmpq if(present(qo))then n=size(qo) tmpq=ql do i=1,n tmpq=tmpq+qo(i) end do else tmpq=ql end if liquid_enthal=(Cpd+tmpq*Cpv)*T-LH( T )*ql if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'liquid_enthal', liquid_enthal, 'J kg-1' ) end if return end function
Function : | |||
moist_enthal : | real | ||
T : | real, intent(in)
| ||
qv : | real, intent(in)
| ||
qo(:) : | real, intent(in), optional
| ||
dl : | integer, intent(in), optional
|
温度と水物質から湿潤エンタルピーを計算する.
real function moist_enthal( T, qv, qo, dl ) ! 温度と水物質から湿潤エンタルピーを計算する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: qv ! 水蒸気混合比 [kg/kg] real, intent(in), optional :: qo(:) ! 水蒸気以外の水凝結物質混合比 [kg/kg] ! 凝結物質のカテゴリはいくらでも構わない. integer, intent(in), optional :: dl ! デバッグレベル integer :: i, n real :: tmpq if(present(qo))then n=size(qo) tmpq=qv do i=1,n tmpq=tmpq+qo(i) end do else tmpq=qv end if moist_enthal=(Cpd+tmpq*Cl( T ))*T+LH( T )*qv if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'moist_enthal', moist_enthal, 'J kg-1' ) end if return end function
Function : | |||
moist_laps_temp : | real | ||
p_stan : | real, intent(in)
| ||
T_stan : | real, intent(in)
| ||
p : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
偽断熱過程における湿潤断熱減率に従う, 高度 p における気温を求める関数. 気温はパーセルの気温.
real function moist_laps_temp( p_stan, T_stan, p, dl ) ! 偽断熱過程における湿潤断熱減率に従う, 高度 p における気温を求める関数. ! 気温はパーセルの気温. use Thermo_Const implicit none real, intent(in) :: p_stan ! 基準気圧座標 [Pa] real, intent(in) :: T_stan ! 基準温度 [K] real, intent(in) :: p ! 求める高度における気圧 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: seqpt, t_temp, seqpt_temp, dt, seqpt_temp2 integer, parameter :: ilim=20 real, parameter :: limit=2.0e-4 seqpt=thetaes_Bolton( T_stan, p_stan ) seqpt_temp=thetaes_Bolton( t_stan, p ) if(p>p_stan)then dt=1.0 else dt=-1.0 end if t_temp=t_stan+dt seqpt_temp2=thetaes_Bolton( t_temp, p ) do while ( (seqpt_temp2-seqpt)*(seqpt_temp-seqpt) >0.0 ) t_temp=t_temp+dt seqpt_temp=seqpt_temp2 seqpt_temp2=thetaes_Bolton( t_temp, p ) end do seqpt_temp=seqpt_temp2 dt=1.0 do while ( abs(seqpt_temp-seqpt) > limit ) dt=0.5*dt if( (seqpt_temp-seqpt)>0.0 )then t_temp=t_temp-dt else t_temp=t_temp+dt end if seqpt_temp=thetaes_Bolton( t_temp, p ) end do moist_laps_temp=t_temp if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'moist_laps_temp', moist_laps_temp, 'K' ) end if return end function
Function : | |||
qvP_2_e : | real | ||
qv : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
混合比と全圧から水蒸気圧を計算する
real function qvP_2_e(qv,P, dl) ! 混合比と全圧から水蒸気圧を計算する use Thermo_Const implicit none real, intent(in) :: qv ! 混合比 [kg / kg] real, intent(in) :: P ! 全圧 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: eps eps=Rd/Rv qvP_2_e=P*qv/(eps+qv) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'qvP_2_e', qvP_2_e, 'Pa' ) end if return end function
Function : | |||
qvTP_2_RH : | real | ||
qv : | real, intent(in)
| ||
T : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
混合比と温度から相対湿度を計算する. qvP_2_e から水蒸気圧を計算し, 相対湿度の定義を用いる.
real function qvTP_2_RH(qv,T,P, dl) ! 混合比と温度から相対湿度を計算する. ! qvP_2_e から水蒸気圧を計算し, 相対湿度の定義を用いる. use Thermo_Const implicit none real, intent(in) :: qv ! 相対湿度 [kg / kg] real, intent(in) :: T ! 温度 [K] real, intent(in) :: P ! 全圧 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: e e=qvP_2_e(qv,P) qvTP_2_RH=eT_2_RH(e,T) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'qvTP_2_RH', qvTP_2_RH, '%' ) end if return end function
Function : | |||
qvT_2_Tv : | real | ||
qv : | real, intent(in)
| ||
T : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
温度と水蒸気混合比から仮温度を計算する.
real function qvT_2_Tv( qv, T, dl) ! 温度と水蒸気混合比から仮温度を計算する. use Thermo_Const implicit none real, intent(in) :: qv ! 水蒸気混合比 [kg / kg] real, intent(in) :: T ! 温度 [K] integer, intent(in), optional :: dl ! デバッグレベル real :: eps eps=Rd/Rv qvT_2_Tv=T*(1.0+qv/eps)/(1.0+qv) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'qvT_2_Tv', qvT_2_Tv, 'K' ) end if return end function
Function : | |||
qvTv_2_T : | real | ||
qv : | real, intent(in)
| ||
Tv : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
水蒸気混合比と仮温度から温度を計算する.
real function qvTv_2_T( qv, Tv, dl ) ! 水蒸気混合比と仮温度から温度を計算する. use Thermo_Const implicit none real, intent(in) :: qv ! 水蒸気混合比 [kg / kg] real, intent(in) :: Tv ! 仮温度 [K] integer, intent(in), optional :: dl ! デバッグレベル real :: eps eps=Rd/Rv qvTv_2_T=Tv*(1.0+qv)/(1.0+qv/eps) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'qvTv_2_T', qvTv_2_T, 'K' ) end if return end function
Function : | |||
qv_2_sh : | real | ||
qv : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
混合比から比湿を計算する.
real function qv_2_sh( qv, dl ) ! 混合比から比湿を計算する. use Thermo_Const implicit none real, intent(in) :: qv ! 水蒸気混合比 [kg/kg] integer, intent(in), optional :: dl ! デバッグレベル qv_2_sh=qv/(1.0+qv) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'qv_2_sh', qv_2_sh, 'kg kg-1' ) end if return end function
Function : | |||
rhoP_2_T : | real | ||
rho : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
乾燥大気の状態方程式から, 密度と気圧を与えて温度を得る.
real function rhoP_2_T( rho, P, dl ) ! 乾燥大気の状態方程式から, 密度と気圧を与えて温度を得る. use Thermo_Const implicit none real, intent(in) :: rho ! 大気の密度 [kg/m^3] real, intent(in) :: P ! 大気の圧力 [Pa] integer, intent(in), optional :: dl ! デバッグレベル rhoP_2_T=P/(Rd*rho) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'rhoP_2_T', rhoP_2_T, 'K' ) end if return end function
Function : | |||
rhoT_2_P : | real | ||
rho : | real, intent(in)
| ||
T : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
乾燥大気の状態方程式から, 密度と温度を与えて気圧を得る.
real function rhoT_2_P( rho, T, dl ) ! 乾燥大気の状態方程式から, 密度と温度を与えて気圧を得る. use Thermo_Const implicit none real, intent(in) :: rho ! 大気の密度 [kg/m^3] real, intent(in) :: T ! 大気の温度 [K] integer, intent(in), optional :: dl ! デバッグレベル rhoT_2_P=rho*Rd*T if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'rhoT_2_P', rhoT_2_P, 'Pa' ) end if return end function
Function : | |||
rho_ocean : | real | ||
pres : | real, intent(in)
| ||
temp : | real, intent(in)
| ||
sal : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
UNESCO (1981) の状態方程式を用いて, 絶対密度を計算する. ここでの計算式には以下のようなコード作成上の処理が含まれていることに注意する.
(a**x)*(b**y)=exp(x*ln(a)+y*ln(b))
なぜなら,
(a**x)*(b**y)=z
とくに, c*(b**y) という形の場合 (係数 x 変数べき乗) : c*(b**y)=exp(ln(c)+y*ln(b)) で表される.
real function rho_ocean( pres, temp, sal, dl ) ! UNESCO (1981) の状態方程式を用いて, 絶対密度を計算する. ! ここでの計算式には以下のようなコード作成上の処理が含まれていることに注意する. ! (a**x)*(b**y)=exp(x*ln(a)+y*ln(b)) ! なぜなら, ! (a**x)*(b**y)=z ! => ln{(a**x)*(b**y)}=ln(z) ! => x*ln(a)+y*ln(b)=ln(z) ! => exp(x*ln(a)+y*ln(b))=z. ! とくに, c*(b**y) という形の場合 (係数 x 変数べき乗) : ! c*(b**y)=exp(ln(c)+y*ln(b)) で表される. implicit none real, intent(in) :: pres ! 圧力 [Bar] real, intent(in) :: temp ! 温度 [degC] real, intent(in) :: sal ! 塩分濃度 [PSU] integer, intent(in), optional :: dl ! デバッグレベル real :: rhoz0, rhowc, Kw, Kz0, Kz, tmptemp if(temp>0.0)then tmptemp=temp Kw=19652.21+148.4206*tmptemp-2.327105*tmptemp*tmptemp +exp(log(1.360477e-2)+3.0*log(tmptemp)) -exp(log(5.155288e-5)+4.0*log(tmptemp)) Kz0=Kw+sal*(54.6746-0.603459*tmptemp +exp(log(1.09987e-2)+2.0*log(tmptemp)) -exp(log(6.167e-5)+3.0*log(tmptemp))) +(sal**1.5)*(7.944e-2+1.6483e-2*tmptemp -exp(log(5.3009e-4)+2.0*log(tmptemp))) Kz=Kz0+pres*(3.239908+1.43713e-3*tmptemp +exp(log(1.16092e-4)+2.0*log(tmptemp)) -exp(log(5.77905e-7)+3.0*log(tmptemp))) +pres*sal*(2.2838e-3-1.0981e-5*tmptemp -exp(log(1.6078e-6)+2.0*log(tmptemp))) +pres*(sal**1.5)*1.91075e-4 +(pres**2)*(8.50935e-5-6.12293e-6*tmptemp +exp(log(5.2787e-8)+2.0*log(tmptemp))) +(pres**2)*sal*(-9.9348e-7+2.0816e-8*tmptemp +exp(log(9.1697e-10)+2.0*log(tmptemp))) rhowc=999.842594+6.793952e-2*tmptemp -exp(log(9.09529e-3)+2.0*log(tmptemp)) +exp(log(1.001685e-4)+3.0*log(tmptemp)) -exp(log(1.120083e-6)+4.0*log(tmptemp)) +exp(log(6.536332e-9)+5.0*log(tmptemp)) rhoz0=rhowc +sal*(0.824493-4.0899e-3*tmptemp +exp(log(7.6438e-5)+2.0*log(tmptemp)) -exp(log(8.2467e-7)+3.0*log(tmptemp)) +exp(log(5.3875e-9)+4.0*log(tmptemp))) +(sal**1.5)*(-5.72466e-3+1.0227e-4*tmptemp -exp(log(1.6546e-6)+2.0*log(tmptemp))) +(sal**2)*4.8314e-4 else if(temp<0.0)then tmptemp=-temp Kw=19652.21-148.4206*tmptemp-2.327105*tmptemp*tmptemp -exp(log(1.360477e-2)+3.0*log(tmptemp)) -exp(log(5.155288e-5)+4.0*log(tmptemp)) Kz0=Kw+sal*(54.6746+0.603459*tmptemp +exp(log(1.09987e-2)+2.0*log(tmptemp)) +exp(log(6.167e-5)+3.0*log(tmptemp))) +(sal**1.5)*(7.944e-2-1.6483e-2*tmptemp -exp(log(5.3009e-4)+2.0*log(tmptemp))) Kz=Kz0+pres*(3.239908-1.43713e-3*tmptemp +exp(log(1.16092e-4)+2.0*log(tmptemp)) +exp(log(5.77905e-7)+3.0*log(tmptemp))) +pres*sal*(2.2838e-3+1.0981e-5*tmptemp -exp(log(1.6078e-6)+2.0*log(tmptemp))) +pres*(sal**1.5)*1.91075e-4 +(pres**2)*(8.50935e-5+6.12293e-6*tmptemp +exp(log(5.2787e-8)+2.0*log(tmptemp))) +(pres**2)*sal*(-9.9348e-7-2.0816e-8*tmptemp +exp(log(9.1697e-10)+2.0*log(tmptemp))) rhowc=999.842594-6.793952e-2*tmptemp -exp(log(9.09529e-3)+2.0*log(tmptemp)) -exp(log(1.001685e-4)+3.0*log(tmptemp)) -exp(log(1.120083e-6)+4.0*log(tmptemp)) -exp(log(6.536332e-9)+5.0*log(tmptemp)) rhoz0=rhowc +sal*(0.824493+4.0899e-3*tmptemp +exp(log(7.6438e-5)+2.0*log(tmptemp)) +exp(log(8.2467e-7)+3.0*log(tmptemp)) +exp(log(5.3875e-9)+4.0*log(tmptemp))) +(sal**1.5)*(-5.72466e-3-1.0227e-4*tmptemp -exp(log(1.6546e-6)+2.0*log(tmptemp))) +(sal**2)*4.8314e-4 else Kw=19652.21 Kz0=Kw+sal*(54.6746 +(sal**1.5)*7.944e-2) Kz=Kz0+pres*3.239908 +pres*sal*2.2838e-3 +pres*(sal**1.5)*1.91075e-4 +(pres**2)*8.50935e-5 +(pres**2)*sal*(-9.9348e-7) rhowc=999.842594 rhoz0=rhowc +sal*0.824493 -5.72466e-3*(sal**1.5) +4.8314e-4*(sal**2) end if rho_ocean=rhoz0/(1.0-pres/Kz) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'rho_ocean', rho_ocean, 'kg m-3' ) end if return end function rho_ocean
Function : | |||
sh_2_qv : | real | ||
sh : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
比湿から水蒸気混合比を計算する.
real function sh_2_qv( sh, dl ) ! 比湿から水蒸気混合比を計算する. use Thermo_Const implicit none real, intent(in) :: sh ! 比湿 [kg/kg] integer, intent(in), optional :: dl ! デバッグレベル sh_2_qv=sh/(1.0-sh) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'sh_2_qv', sh_2_qv, 'kg kg-1' ) end if return end function
Function : | |||
tetens : | real | ||
T : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
テテンの実験式を用いて飽和水蒸気圧を計算する.
real function tetens( T, dl ) ! テテンの実験式を用いて飽和水蒸気圧を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 大気の温度 [K] integer, intent(in), optional :: dl ! デバッグレベル real, parameter :: a=7.5, b=237.7, c=9.5, d=265.5 if(t<=t0)then tetens=e0*10.0**(c*(t-t0)/(t-t0+d)) else tetens=e0*10.0**(a*(t-t0)/(t-t0+b)) end if if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'tetens', tetens, 'Pa' ) end if return end function
Function : | |||
thetaP_2_T : | real | ||
theta : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
温位, 圧力から温度を計算する(乾燥大気として計算)
real function thetaP_2_T(theta,P, dl) ! 温位, 圧力から温度を計算する(乾燥大気として計算) use Thermo_Const implicit none real, intent(in) :: theta ! 温位 [K] real, intent(in) :: P ! 湿潤大気の全圧 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: kappa kappa=Rd/Cpd thetaP_2_T=theta*(P/p0)**kappa if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'thetaP_2_T', thetaP_2_T, 'K' ) end if return end function
Function : | |||
thetaT_2_P : | real | ||
theta : | real, intent(in)
| ||
T : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
温位, 温度から圧力を計算する(乾燥大気として計算)
real function thetaT_2_P(theta,T, dl) ! 温位, 温度から圧力を計算する(乾燥大気として計算) use Thermo_Const implicit none real, intent(in) :: theta ! 温位 [K] real, intent(in) :: T ! 温度 [T] integer, intent(in), optional :: dl ! デバッグレベル real :: kappa kappa=Cpd/Rd thetaT_2_P=p0*(T/theta)**kappa if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'thetaT_2_P', thetaT_2_P, 'Pa' ) end if return end function
Function : | |||
theta_dry : | real | ||
T : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
乾燥大気における温位を計算する ただし, 湿潤大気においても, 観測される全圧を P として計算することができ その結果は別関数 theta_moist の結果とそれほど変わらない.
real function theta_dry(T,P, dl) ! 乾燥大気における温位を計算する ! ただし, 湿潤大気においても, 観測される全圧を P として計算することができ ! その結果は別関数 theta_moist の結果とそれほど変わらない. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: P ! 乾燥大気の気圧(もしくは, 湿潤大気の全圧) [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: kappa kappa=Rd/Cpd theta_dry=T*(p0/P)**kappa if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'theta_dry', theta_dry, 'K' ) end if return end function
Function : | |||
theta_moist : | real | ||
T : | real, intent(in)
| ||
P : | real, intent(in)
| ||
qv : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
湿潤大気における温位を計算する
real function theta_moist(T,P,qv, dl) ! 湿潤大気における温位を計算する use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: P ! 湿潤大気の全圧 [Pa] real, intent(in) :: qv ! 混合比 [kg / kg] integer, intent(in), optional :: dl ! デバッグレベル real :: eps, kappa, CR eps=Rd/Rv kappa=Rd/Cpd CR=Cpv/Cpd kappa=kappa*((1.0+qv*CR)/(1.0+qv/eps)) ! kappa の値が上から上書きされていることに注意 theta_moist=T*(p0/P)**kappa if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'theta_moist', theta_moist, 'K' ) end if return end function
Function : | |||
thetae_Bolton : | real | ||
T : | real, intent(in)
| ||
qv : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
Bolton(1980) による手法を用いて相当温位を計算する. この相当温位は偽断熱過程での相当温位である. T_LCL を用いるので, そのための関数を使用する.
real function thetae_Bolton(T,qv,P, dl) ! Bolton(1980) による手法を用いて相当温位を計算する. ! この相当温位は偽断熱過程での相当温位である. ! T_LCL を用いるので, そのための関数を使用する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: qv ! 混合比 [kg / kg] real, intent(in) :: P ! 全圧 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: T_LCL, qvs real, parameter :: a=0.2854, b=0.28, c=3376.0, d=0.81 T_LCL=TqvP_2_TLCL(T,qv,P) qvs=TP_2_qvs(T_LCL,P) thetae_Bolton=T*((p0/P)**(a*(1.0-b*qvs))) *exp((c/T_LCL-2.54)*qvs*(1.0+d*qvs)) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'thetae_Bolton', thetae_Bolton, 'K' ) end if return end function
Function : | |||
thetae_Emanuel : | real | ||
T : | real, intent(in)
| ||
qv : | real, intent(in)
| ||
pres : | real, intent(in)
| ||
qo(:) : | real, intent(in), optional
| ||
dl : | integer, intent(in), optional
|
Emanuel (1994) の (4.5.11) で定義される相当温位を計算する.
real function thetae_Emanuel( T, qv, pres, qo, dl ) ! Emanuel (1994) の (4.5.11) で定義される相当温位を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: qv ! 水蒸気混合比 [kg/kg] real, intent(in) :: pres ! 圧力 [Pa] real, intent(in), optional :: qo(:) ! 水蒸気以外の水物質混合比 [kg/kg] integer, intent(in), optional :: dl ! デバッグレベル integer :: i, n real :: tmpq, calH, pdry, pow1, pow2, pow3, coe1, coe2, coe3, Cltmp, LHtmp if(present(qo))then n=size(qo) tmpq=qv do i=1,n tmpq=tmpq+qo(i) end do else tmpq=qv end if pdry=pres-qvP_2_e( qv, pres ) calH=qvTP_2_RH( qv, T, pres )*0.01 Cltmp=Cl( T ) LHtmp=LH( T ) pow1=Rd/(Cpd+Cltmp*tmpq) pow2=qv*Rv/(Cpd+Cltmp*tmpq) pow3=LHtmp*qv/((Cpd+Cltmp*tmpq)*T) coe1=(p0/pdry)**pow1 coe2=calH**pow2 coe3=exp(pow3) thetae_Emanuel=T*coe1*coe2*coe3 if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'thetae_Emanuel', thetae_Emanuel, 'K' ) end if return end function
Function : | |||
thetaes_Bolton : | real | ||
T : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
Bolton(1980) による手法を用いて飽和相当温位を計算する.
real function thetaes_Bolton(T,P, dl) ! Bolton(1980) による手法を用いて飽和相当温位を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: P ! 全圧 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: qvs real, parameter :: a=0.2854, b=0.28, c=3376.0, d=0.81 qvs=TP_2_qvs(T,P) thetaes_Bolton=T*((p0/P)**(a*(1.0-b*qvs))) *exp((c/T-2.54)*qvs*(1.0+d*qvs)) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'thetaes_Bolton', thetaes_Bolton, 'K' ) end if return end function
Function : | |||
thetal_Emanuel : | real | ||
T : | real, intent(in)
| ||
ql : | real, intent(in)
| ||
pres : | real, intent(in)
| ||
qo(:) : | real, intent(in), optional
| ||
dl : | integer, intent(in), optional
|
Emanuel (1994) の (4.5.15) で定義される液水温位を計算する.
real function thetal_Emanuel( T, ql, pres, qo, dl ) ! Emanuel (1994) の (4.5.15) で定義される液水温位を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: ql ! 液水混合比 [kg/kg] real, intent(in) :: pres ! 圧力 [Pa] real, intent(in), optional :: qo(:) ! 液水以外の水物質混合比(水蒸気含む) [kg/kg] integer, intent(in), optional :: dl ! デバッグレベル integer :: i, n real :: tmpq, pow1, pow2, pow3, coe1, coe2, coe3, epsi epsi=Rd/Rv if(present(qo))then n=size(qo) tmpq=ql do i=1,n tmpq=tmpq+qo(i) end do else tmpq=ql end if pow1=(Rd+tmpq*Rv)/(Cpd+tmpq*Cpv) pow2=(tmpq*Rv)/(Cpd+tmpq*Cpv) pow3=-LH( T )*ql/((Cpd+tmpq*Cpv)*T) coe1=((p0/pres)*(1.0-ql/(epsi+tmpq)))**pow1 coe2=(tmpq/(tmpq-ql))**pow2 coe3=exp(pow3) thetal_Emanuel=T*coe1*coe2*coe3 if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'thetal_Emanuel', thetal_Emanuel, 'K' ) end if return end function
Function : | |||
thetalv_Emanuel : | real | ||
T : | real, intent(in)
| ||
ql : | real, intent(in)
| ||
qv : | real, intent(in)
| ||
pres : | real, intent(in)
| ||
qo(:) : | real, intent(in), optional
| ||
dl : | integer, intent(in), optional
|
Emanuel (1994) の (4.5.18) で定義される液水仮温位を計算する.
real function thetalv_Emanuel( T, ql, qv, pres, qo, dl ) ! Emanuel (1994) の (4.5.18) で定義される液水仮温位を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: ql ! 液水混合比 [kg/kg] real, intent(in) :: qv ! 水蒸気混合比 [kg/kg] real, intent(in) :: pres ! 圧力 [Pa] real, intent(in), optional :: qo(:) ! 液水, 水蒸気以外の水物質混合比 [kg/kg] integer, intent(in), optional :: dl ! デバッグレベル integer :: i, n real :: tmpq, pow1, pow2, pow3, coe1, coe2, coe3, epsi, tmpv, tmpcoe epsi=Rd/Rv tmpv=qvT_2_Tv( qv, T ) if(present(qo))then n=size(qo) tmpq=ql+qv do i=1,n tmpq=tmpq+qo(i) end do else tmpq=ql+qv end if pow1=(Rd+tmpq*Rv)/(Cpd+tmpq*Cpv) pow2=(tmpq*Rv)/(Cpd+tmpq*Cpv) pow3=-LH( T )*ql/((Cpd+tmpq*Cpv)*T) tmpcoe=(p0/pres)**pow1 coe1=(1.0-ql/(epsi+tmpq))**(pow1-1.0) coe2=(tmpq/(tmpq-ql))**pow2 coe3=exp(pow3) thetalv_Emanuel=tmpv*tmpcoe*coe1*coe2*coe3 if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'thetalv_Emanuel', thetalv_Emanuel, 'K' ) end if return end function
Function : | |||
thetavqvP_2_T : | real | ||
ptv : | real, intent(in)
| ||
qv : | real, intent(in)
| ||
P : | real, intent(in)
| ||
dl : | integer, intent(in), optional
|
仮温位, 水蒸気混合比, 圧力から温度を計算する.
real function thetavqvP_2_T( ptv, qv, P, dl ) ! 仮温位, 水蒸気混合比, 圧力から温度を計算する. use Thermo_Const implicit none real, intent(in) :: ptv ! 仮温位 [K] real, intent(in) :: qv ! 水蒸気混合比 [kg / kg] real, intent(in) :: P ! 圧力 [Pa] integer, intent(in), optional :: dl ! デバッグレベル real :: kappa, Tv kappa=Rd/cpd Tv=ptv*exner_func_dry( P ) thetavqvP_2_T=qvTv_2_T( qv, Tv ) if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'thetavqvP_2_T', thetavqvP_2_T, 'K' ) end if return end function
Function : | |||
thetaw_Emanuel : | real | ||
T : | real, intent(in)
| ||
qv : | real, intent(in)
| ||
pres : | real, intent(in)
| ||
eps : | integer, intent(in), optional
| ||
dl : | integer, intent(in), optional
|
Emanuel (1994) の (4.7.10) で定義される湿球温位を計算する.
real function thetaw_Emanuel( T, qv, pres, eps, dl ) ! Emanuel (1994) の (4.7.10) で定義される湿球温位を計算する. use Thermo_Const implicit none real, intent(in) :: T ! 温度 [K] real, intent(in) :: qv ! 水蒸気混合比 [kg/kg] real, intent(in) :: pres ! 圧力 [Pa] integer, intent(in), optional :: eps ! 収束条件 (デフォルト = 1.e-6) integer, intent(in), optional :: dl ! デバッグレベル integer :: i, n real, parameter :: a=0.81, b=3376.0, c=2.54, theta1=100.0, theta2=600.0 real :: tmpa, tmpb, tmpc, fa, fb, fc, tmpthetae, thetaa, thetab, thetac real :: rast, err_max, tmp_err if(present(eps))then err_max=eps else err_max=1.0e-6 end if tmpthetae=thetae_Bolton( T, qv, pres ) rast=TP_2_qvs( T, pres ) tmp_err=err_max tmpa=rast*(1.0+a*rast)*(b/theta1-c)-log(tmpthetae/theta1) tmpb=rast*(1.0+a*rast)*(b/theta2-c)-log(tmpthetae/theta2) thetaa=theta1 thetab=theta2 do while (err_max<=tmp_err) thetac=0.5*(thetab+thetaa) tmpc=rast*(1.0+a*rast)*(b/thetac-c)-log(tmpthetae/thetac) if(tmpa*tmpc>0.0)then tmp_err=abs(tmpa-tmpc) tmpa=tmpc thetaa=thetac else tmp_err=abs(tmpb-tmpc) tmpb=tmpc thetab=thetac end if end do thetaw_Emanuel=thetac if(present(dl))then call debug_flag_r( dl, 'Thermo_Function', 'thetaw_Emanuel', thetaw_Emanuel, 'K' ) end if return end function