| Class | initialdata_Toon2002 |
| In: |
../src/env/initialdata_toon2002.f90
|
| Subroutine : | |||
| z_Temp(kmin:kmax) : | real(DP), intent(out)
| ||
| z_Press(kmin:kmax) : | real(DP), intent(out)
|
subroutine initialdata_toon2002_basic( z_Temp, z_Press )
implicit none
real(DP), intent(out):: z_Press(kmin:kmax) !圧力
real(DP), intent(out):: z_Temp(kmin:kmax) !温度
real(DP) :: TempLCL
real(DP) :: Temp_0, Temp_1
real(DP) :: Press_0, Press_1
real(DP) :: Weight1, Weight2
real(DP) :: LCL, LTP
integer :: k
! 乾燥断熱線, 湿潤断熱線, 等温線が交わる高度を計算し,
! 各領域で成り立つ式を用いて温度, 圧力を計算
! 乾燥断熱線と湿潤断熱線が交わる高度(LCL)を反復法で計算
!
Press_0 = PressSfc
Temp_0 = TempSfc
do
! 飽和温度 (press0 に対する): 最初は地表面での飽和温度.
! ln(p) = A - B/T
Temp_1 = AntB / (AntA - dlog(Press_0))
! 乾燥断熱的に決めた圧力
!
Press_1 = PressSfc * (Temp_1/TempSfc) **(CpDry / GasRDry)
! 絶対誤差が閾値より小さくなれば終了.
!
if (abs(Temp_1 - Temp_0) < epsilon(0.0d0)) then
LCL = (TempSfc * CpDry) / Grav * (1.0d0 - (Press_1 / PressSfc)**(GasRDry / CpDry))
TempLCL = temp_1
exit
else
Temp_0 = Temp_1
Press_0 = Press_1
end if
end do
! 湿潤断熱線と等温線が交わる高度(LTP)を計算
!
LTP = LCL + GasRDry * AntB / Grav * dlog(TempLCL / TempLTP)
! 温度圧力を決める.
!
z_Temp(1) = TempSfc - Grav * z_Z(1) / CpDry
z_Press(1) = PressSfc - (Grav * PressSfc * z_dz(1) * 5.0d-1) / (GasRDry * TempSfc)
do k = 2, nz
!重みつけの関数を用意. tanh を用いる
Weight1 = ( tanh( (z_Z(k) - LCL ) / Dhight ) + 1.0d0 ) * 5.0d-1
!重みつけの関数を用意. tanh を用いる
Weight2 = ( tanh( (z_Z(k) - LTP ) / Dhight ) + 1.0d0 ) * 5.0d-1
!乾燥断熱
if (z_z(k) < LCL) then
z_Temp(k) = TempSfc - Grav * z_Z(k) / CpDry
!湿潤断熱
elseif (z_z(k) >= LCL .AND. z_z(k) < LTP) then
Temp_0 = TempSfc - Grav * z_Z(k) / CpDry
Temp_1 = TempLCL * exp(-Grav * (z_Z(k) - LCL) / (GasRDry * AntB))
z_Temp(k) = Temp_0 * ( 1.0d0 - Weight1 ) + Temp_1 * Weight1
! z_Temp(k) = TempLCL * exp(-Grav * (z_Z(k) - LCL) / (GasRDry * AntB))
!等温
elseif (z_z(k) >= LTP) then
Temp_0 = TempLCL * exp(-Grav * (z_Z(k) - LCL) / (GasRDry * AntB))
z_Temp(k) = Temp_0 * ( 1.0d0 - Weight2 ) + TempLTP * Weight2
! z_Temp(k) = TempLTP
end if
end do
! 静水圧平衡から圧力を決める
!
do k = 2, nz
z_Press(k) = z_Press(k-1) - (Grav * z_Press(k-1) * z_dz(k-1)) / ( GasRDry * z_Temp(k-1) )
end do
end subroutine initialdata_toon2002_basic