| Class | initialdata_takemi2007 |
| In: |
../src/env/initialdata_takemi2007.f90
|
| Subroutine : | |||
| z_Temp(kmin:kmax) : | real(DP), intent(out)
| ||
| z_Press(kmin:kmax) : | real(DP), intent(out)
| ||
| zf_MolFr(kmin:kmax, 1:ncmax) : | real(DP), intent(out)
|
subroutine initialdata_takemi2007_basic( z_Temp, z_Press, zf_MolFr )
!
!== 概要
! * deepconv の地球用のテスト計算としてTakemi(2007)の再現計算を
! するための湿度の基本場を作成する
! * 基本場の温度の式が温位で与えられているため, 温度に変換する必要がある
!
implicit none
real(DP), intent(out):: z_Press(kmin:kmax) !圧力
real(DP), intent(out):: z_Temp(kmin:kmax) !温度
real(DP), intent(out):: zf_MolFr(kmin:kmax, 1:ncmax) !モル比
real(DP) :: z_Hum(kmin:kmax) ! 相対湿度
real(DP) :: z_PTemp(kmin:kmax) ! 温位
real(DP) :: QMix
integer :: k
!-------------------------------------------
! 初期化
!
z_Temp = 1.0d-60
z_PTemp = 1.0d-60
z_Press = 1.0d-60
z_Hum = 0.0d0
zf_MolFr = 0.0d0
!----------------------------------------------
! 湿度
! 論文中の式 (2) より計算
!
do k = 1, nz
if (z_Z(k) <= AltTr) then
z_Hum(k) = 1.0d0 - 0.75d0 * (z_Z(k) / AltTr) ** 1.25
elseif (z_Z(k) > AltTr) then
z_Hum(k) = HumMin
end if
end do
! Fig.2b は明らかに相対湿度が 95% 程度で打ち止めになっているので,
! 上限値を設けてみた
!
where (z_Hum > 0.95d0)
z_Hum = 0.95d0
end where
! DRY ケースの場合.
! DRY 以外では, DryFact = 0.0 になっている.
! 相対湿度の下限値を下回らないよう調整している.
!
do k = 1, nz
if (amin < k .AND. k <= amax) then
z_Hum(k) = z_Hum(k) + DryFact
if (z_Hum(k) <= HumMin) then
z_Hum(k) = HumMin
end if
end if
end do
!----------------------------------------------
! 温位, 圧力, 温度
! 温位は, 論文中の式 (1) より計算
!
!
z_PTemp(1) = TempSfc + (PTempTr - TempSfc) * ((z_Z(1) / AltTr) ** 1.25)
z_Press(1) = PressSfc - (Grav * PressSfc * z_dz(1) * 5.0d-1) / (GasRDry * TempSfc)
z_Temp(1) = z_PTemp(1) * (z_Press(1) / PressBasis) ** (GasRDry / CpDry)
do k = 2, nz
if (k <= amax) then
z_PTemp(k) = TempSfc + (PTempTr - TempSfc) * ((z_Z(k) / AltTr) ** 1.25)
elseif (k > amax) then
z_PTemp(k) = z_PTemp(amax) * exp( Grav * (z_Z(k) - AltTr) / (CpDry * z_Temp(amax)))
end if
z_Press(k) = z_Press(k-1) - (Grav * z_Press(k-1) * z_dz(k-1)) / (GasRDry * z_Temp(k-1))
z_Temp(k) = z_PTemp(k) * ((z_Press(k) / PressBasis) ** (GasRDry / CpDry))
end do
!----------------------------------------------
! モル比
! 論文中には, in the lowest 1.5km depth で混合比の値を設定するという
! 記述があったが, Fig2b から判断するに, 式 (2) で与えられる相対湿度から
! 混合比を計算し, それが地表での混合比 (nml で与える) を超えたら,
! 地表での混合比と同じとしているのだろう.
!
do k = 1, nz
zf_MolFr(k,1) = SvapPress(SpcID, z_Temp(k)) * z_Hum(k) / z_Press(k)
QMix = zf_MolFr(k,1) / MolWtDry * MolWtWet(1)
if (QMix > QMixSfc) then
zf_MolFr(k,1) = QMixSfc * MolWtDry / MolWtWet(1)
end if
end do
end subroutine Initialdata_takemi2007_basic
| Subroutine : |
設定ファイルから出力ファイルに記載する情報を読み込む
This procedure input/output NAMELIST#initialdata_takemi2007_nml .
subroutine initialdata_takemi2007_init
!
!設定ファイルから出力ファイルに記載する情報を読み込む
!
!暗黙の型宣言禁止
implicit none
!内部変数
real(DP) :: Alt !高度
integer :: unit !設定ファイル用装置番号
integer :: k
integer :: ID_BasicZ = 0
integer :: ID_Wind = 0
integer, parameter :: ID_MidLat_Q10 = 1
integer, parameter :: ID_MidLat_Q12 = 2
integer, parameter :: ID_MidLat_Q14 = 3
integer, parameter :: ID_MidLat_Q16 = 4
integer, parameter :: ID_MidLat_Q16DRY1 = 5
integer, parameter :: ID_MidLat_Q16DRY2 = 6
integer, parameter :: ID_MidLat_Q18 = 7
integer, parameter :: ID_Tropic_Q18 = 8
integer, parameter :: ID_Tropic_Q18DRY1 = 9
integer, parameter :: ID_Tropic_Q18DRY2 = 10
integer, parameter :: ID_Tropic_Q18DRY3 = 11
integer, parameter :: ID_Wind_LowLevel = 1
integer, parameter :: ID_Wind_MiddleLevel = 2
integer, parameter :: ID_Wind_HighLevel = 3
character(STRING) :: FlagEnv = ""
character(STRING) :: FlagWind = ""
!設定ファイルから読み込む出力ファイル情報
NAMELIST /initialdata_takemi2007_nml/ FlagEnv, FlagWind, VelXSfc
!設定ファイルから出力ファイルに記載する情報を読み込む
call FileOpen(unit, file=namelist_filename, mode='r')
read(unit, NML=initialdata_takemi2007_nml)
close(unit)
! 確認. 地表面温度・圧力を指定するのは別モジュールなので.
!
if (myrank == 0) then
if ( PressBasis /= PressSfcTakemi .OR. PressSfc /= PressSfcTakemi .OR. TempSfc /= PTempSfcTakemi ) then
call MessageNotify( "E", "initaldata_takemi2007_init", "Constants are wrong. please PressSfc = 1.0d5, TempSfc = 300.0d0")
end if
end if
if (myrank == 0) then
call MessageNotify( "M", "initaldata_takemi2007_init", "VelXSfc= %f", d=(/VelXSfc/) )
end if
!基本場の選択
!
if (FlagEnv == "MidLat_Q10") then
ID_BasicZ = ID_MidLat_Q10
elseif (FlagEnv == "MidLat_Q12") then
ID_BasicZ = ID_MidLat_Q12
elseif (FlagEnv == "MidLat_Q14") then
ID_BasicZ = ID_MidLat_Q14
elseif (FlagEnv == "MidLat_Q16") then
ID_BasicZ = ID_MidLat_Q16
elseif (FlagEnv == "MidLat_Q16DRY1") then
ID_BasicZ = ID_MidLat_Q16DRY1
elseif (FlagEnv == "MidLat_Q16DRY2") then
ID_BasicZ = ID_MidLat_Q16DRY2
elseif (FlagEnv == "MidLat_Q18") then
ID_BasicZ = ID_MidLat_Q18
elseif (FlagEnv == "Tropic_Q18") then
ID_BasicZ = ID_Tropic_Q18
elseif (FlagEnv == "Tropic_Q18DRY1") then
ID_BasicZ = ID_Tropic_Q18DRY1
elseif (FlagEnv == "Tropic_Q18DRY2") then
ID_BasicZ = ID_Tropic_Q18DRY2
elseif (FlagEnv == "Tropic_Q18DRY3") then
ID_BasicZ = ID_Tropic_Q18DRY3
end if
! 速度場の選択
!
if (FlagWind == "LowLevel") then
ID_Wind = ID_Wind_LowLevel
elseif (FlagWind == "MiddleLevel") then
ID_Wind = ID_Wind_MiddleLevel
elseif (FlagWind == "HighLevel") then
ID_Wind = ID_Wind_HighLevel
end if
! 温位場
!
select case (ID_BasicZ)
case (ID_MidLat_Q10:ID_MidLat_Q18)
PTempTr = 343.0d0
case (ID_Tropic_Q18:ID_Tropic_Q18DRY3)
PTempTr = 358.0d0
end select
! 混合比
!
select case (ID_BasicZ)
case (ID_MidLat_Q10)
QMixSfc = 0.010d0
case (ID_MidLat_Q12)
QMixSfc = 0.012d0
case (ID_MidLat_Q14)
QMixSfc = 0.014d0
case (ID_MidLat_Q16:ID_MidLat_Q16DRY2)
QMixSfc = 0.016d0
case (ID_MidLat_Q18:ID_Tropic_Q18DRY3)
QMixSfc = 0.018d0
end select
! 湿度変化
!
select case (ID_BasicZ)
case (ID_MidLat_Q16DRY1)
DryFact = - 0.13d0
Alt = 2.5d3
case (ID_MidLat_Q16DRY2)
DryFact = - 0.30d0
Alt = 2.5d3
case (ID_Tropic_Q18DRY1)
DryFact = - 0.20d0
Alt = 2.5d3
case (ID_Tropic_Q18DRY2)
DryFact = - 0.20d0
Alt = 5.0d3
case (ID_Tropic_Q18DRY3)
DryFact = - 0.20d0
Alt = 7.5d3
end select
do k = 1, nz
if (z_Z(k) < AltTr .AND. AltTr <= z_Z(k+1)) then
amax = k
end if
if (z_Z(k) < Alt .AND. Alt <= z_Z(k+1)) then
amin = k
end if
end do
! 水平風速
!
select case (ID_Wind)
case (ID_Wind_LowLevel)
Alt1 = 0.0d0
Alt2 = 2.5d3
case (ID_Wind_MiddleLevel)
Alt1 = 2.5d3
Alt2 = 5.0d3
case (ID_Wind_HighLevel)
Alt1 = 5.0d3
Alt2 = 7.5d3
end select
end subroutine initialdata_takemi2007_init
| Subroutine : | |
| pyz_VelX(imin:imax,jmin:jmax,kmin:kmax) : | real(DP), intent(out) |
subroutine initialdata_takemi2007_wind(pyz_VelX)
!-------------------------------------------------------------!
! シアーの設定 (Takemi,2007) !
!-------------------------------------------------------------!
!
!= 概要
!* case "Takemi2007" での計算時に鉛直シアーのある風を与える時に使用する
!* 風の与え方には, 以下のようなバリエーションがある
! (1) シアーを与える高度を変える
! (2) シアーのある風の最大風速 (U_s) を変える
!
! (1) については, (a) 0 - 2.5 km, (b) 2.5 - 5.0 km, (c) 5.0 - 7.5 km の
! 三パターンがある
! (2) については, Takemi (2007) では熱帯場と中緯度場の温度場毎に
! 異なる値を設定している
!
! その強度(Us)は, 以下の通り
! <熱帯場> (1) 5 m/s, (2) 10 m/s, (3) 15 m/s
! <中緯度場> (1) 10 m/s, (2) 15 m/s, (3) 20 m/s
!
!* シアーの形の模式図 (Takemi, 2007) |
! /| 7.5 km
! / |
! / |
! / ←|
! | /| 5.0 km
! | / |
! |/ |
! / ←|
! | /| 2.5 km
! | / |
! |/ |
! / ←|
!---------------------------------+------------- 0.0 km
! Us (m/s)
!
implicit none
real(DP), intent(out) :: pyz_VelX(imin:imax,jmin:jmax,kmin:kmax)
integer :: k
!初期化
pyz_VelX = 0.0d0
do k = 1, nz
if (z_Z(k) <= Alt1) then
pyz_VelX(:,:,k) = - VelXSfc
elseif (z_Z(k) > Alt1 .AND. z_Z(k) <= Alt2) then
pyz_VelX(:,:,k) = - VelXSfc + (VelXSfc / (Alt2 - Alt1)) * (z_Z(k) - Alt1)
end if
end do
write(*,*) VelXSfc, Alt1, Alt2
end subroutine initialdata_takemi2007_wind