Class | WarmRainPrm_3d |
In: |
moist/warmrainprm_3d.f90
|
暖かい雨のバルク法を用いた, 水蒸気と雨, 雲と雨の混合比の変換係数を求める.
* 中島健介 (1994) で利用した定式をそのまま利用.
Subroutine : | |
cfgfile : | character(*), intent(in) |
This procedure input/output NAMELIST#warmrainprm .
subroutine WarmRainPrm_Init( cfgfile ) !暗黙の型宣言禁止 implicit none !入力変数 character(*), intent(in) :: cfgfile !内部変数 integer :: unit !装置番号 !----------------------------------------------------------- ! NAMELIST から情報を取得 !----------------------------------------------------------- ! NAMELIST から情報を取得 NAMELIST /warmrainprm/ FactorJ, AutoConvTime, MixRt_AutoConvCr call FileOpen(unit, file=cfgfile, mode='r') read(unit, NML=warmrainprm) close(unit) call MessageNotify( "M", "WarmRainPrm_Init", "FactorJ = %f", d=(/FactorJ/) ) call MessageNotify( "M", "WarmRainPrm_Init", "AutoConvTime = %f", d=(/AutoConvTime/) ) call MessageNotify( "M", "WarmRainPrm_Init", "MixRt_AutoConvCr = %f", d=(/MixRt_AutoConvCr/) ) end subroutine WarmRainPrm_Init
Function : | |||
xyz_Rain2GasHeat(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) : | real(DP) | ||
xyz_PotTemp(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) : | real(DP), intent(in)
| ||
xyz_Exner(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) : | real(DP), intent(in)
| ||
xyza_DelMixRt(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) : | real(DP), intent(in)
|
雨粒から蒸気への変換量を計算するためのルーチン
変換量および, 蒸気と雨粒の混合比は正の量なので, 計算の途中途中で 値が正になることを保証している. また, 元々存在する以上の雨粒が 蒸気に変換されないように, 元々の雨粒混合比を変換量の上限としている.
function xyz_Rain2GasHeat(xyz_PotTemp, xyz_Exner, xyza_DelMixRt) ! ! 雨粒から蒸気への変換量を計算するためのルーチン ! ! 変換量および, 蒸気と雨粒の混合比は正の量なので, 計算の途中途中で ! 値が正になることを保証している. また, 元々存在する以上の雨粒が ! 蒸気に変換されないように, 元々の雨粒混合比を変換量の上限としている. ! !暗黙の型宣言禁止 implicit none !変数定義 real(DP), intent(in) :: xyz_PotTemp(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !温位の擾乱成分 real(DP), intent(in) :: xyz_Exner(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !温度の擾乱成分 real(DP), intent(in) :: xyza_DelMixRt(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) !混合比の変化 real(DP) :: xyz_Rain2GasHeat(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) real(DP) :: xyza_LatentHeat(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) real(DP) :: xyz_TempAll(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) real(DP) :: xyz_ExnerAll(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) integer :: s !温度, 圧力, 混合比の全量を求める !擾乱成分と平均成分の足し算 xyz_ExnerAll = xyz_Exner + xyz_ExnerBasicZ xyz_TempAll = ( xyz_PotTemp + xyz_PotTempBasicZ ) * ( xyz_Exner + xyz_ExnerBasicZ ) xyza_LatentHeat = 0.0d0 !雨から蒸気への相変化に伴う発熱 do s = 1, CondNum xyza_LatentHeat(:,:,:,s) = xyz_LatentHeat( SpcWetID(IdxCR(s)), xyz_TempAll ) * xyza_DelMixRt(:,:,:,IdxCR(s)) / (xyz_ExnerAll * CpDry) end do xyz_Rain2GasHeat = sum( xyza_LatentHeat, 4 ) end function xyz_Rain2GasHeat
Function : | |||
xyz_Rain2GasHeatNH4SH(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) : | real(DP) | ||
xyz_Exner(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) : | real(DP), intent(in)
| ||
xyza_DelMixRt(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) : | real(DP), intent(in)
|
雨粒から蒸気への変換量を計算するためのルーチン
変換量および, 蒸気と雨粒の混合比は正の量なので, 計算の途中途中で 値が正になることを保証している. また, 元々存在する以上の雨粒が 蒸気に変換されないように, 元々の雨粒混合比を変換量の上限としている.
function xyz_Rain2GasHeatNH4SH(xyz_Exner, xyza_DelMixRt) ! ! 雨粒から蒸気への変換量を計算するためのルーチン ! ! 変換量および, 蒸気と雨粒の混合比は正の量なので, 計算の途中途中で ! 値が正になることを保証している. また, 元々存在する以上の雨粒が ! 蒸気に変換されないように, 元々の雨粒混合比を変換量の上限としている. ! !暗黙の型宣言禁止 implicit none !変数定義 real(DP), intent(in) :: xyza_DelMixRt(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) !混合比の変化量 real(DP), intent(in) :: xyz_Exner(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !温度の擾乱成分 real(DP) :: xyz_Rain2GasHeatNH4SH(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) ! real(DP) :: xyz_ExnerAll(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !圧力の全量を求める !擾乱成分と平均成分の足し算 xyz_ExnerAll = xyz_Exner + xyz_ExnerBasicZ !雨から蒸気への相変化に伴う発熱 xyz_Rain2GasHeatNH4SH = ReactHeatNH4SH * xyza_DelMixRt(:,:,:,IdxNH4SHr) / (xyz_ExnerAll * CpDry) end function xyz_Rain2GasHeatNH4SH
Function : | |||
xyza_Cloud2Rain(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) : | real(DP)
| ||
xyza_MixRt(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) : | real(DP), intent(in)
| ||
DelTime : | real(DP)
|
雲粒から雨粒への変換量を計算するためのルーチン 併合成長は Berry (1968) のパラメタリゼーションを利用し, 衝突合体成長は Kessler (1969) のパラメタリゼーションを利用する.
変換量および, 雲粒と雨粒の混合比は正の量なので, 計算の途中途中で 値が正になることを保証している. また, 元々存在する以上の雲粒が 雨粒に変換されないように, 元々の雲粒混合比を変換量の上限としている. 正の値を保証するために, 引数として時間刻みが必要となる. (AutoConv, Collect は時間刻み幅での積分値を計算)
このルーチンでは, 凝縮物質と反応生成物とを区別する必要が全くないので, ループを回す回数を LoopNum2 回としている.
function xyza_Cloud2Rain( xyza_MixRt, DelTime ) ! ! 雲粒から雨粒への変換量を計算するためのルーチン ! 併合成長は Berry (1968) のパラメタリゼーションを利用し, ! 衝突合体成長は Kessler (1969) のパラメタリゼーションを利用する. ! ! 変換量および, 雲粒と雨粒の混合比は正の量なので, 計算の途中途中で ! 値が正になることを保証している. また, 元々存在する以上の雲粒が ! 雨粒に変換されないように, 元々の雲粒混合比を変換量の上限としている. ! 正の値を保証するために, 引数として時間刻みが必要となる. ! (AutoConv, Collect は時間刻み幅での積分値を計算) ! ! このルーチンでは, 凝縮物質と反応生成物とを区別する必要が全くないので, ! ループを回す回数を LoopNum2 回としている. ! !暗黙の型宣言禁止 implicit none !変数定義 real(DP), intent(in) :: xyza_MixRt(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) !混合比の擾乱成分 real(DP) :: DelTime !時間刻み real(DP) :: xyza_Cloud2Rain(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) !雲から雨への変換量 real(DP) :: xyza_MixRtAll(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) !混合比の擾乱成分 + 平均成分 real(DP) :: xyz_AutoConv(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !飽和混合比 real(DP) :: xyz_Collect(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !規格化された潜熱 ! real(DP), parameter :: N0 = 5.0d7 ! real(DP), parameter :: D0 = 3.66d-1 integer :: s xyza_Cloud2Rain = 0.0d0 !混合比は正の値を保証 !移流拡散で負になることもあり得るので. xyza_MixRtAll = max( 0.0d0, xyza_MixRt + xyza_MixRtBasicZ ) do s = 1, CloudNum xyz_AutoConv = 0.0d0 xyz_Collect = 0.0d0 !併合成長 ! Kessler (1969) のパラメタリゼーション xyz_AutoConv = DelTime / AutoConvTime * max( 0.0d0, ( xyza_MixRtAll(:,:,:,IdxC(s)) - MixRt_AutoConvCr) ) ! ! Berry (1968) のパラメタリゼーション ! xyz_AutoConv = & ! & DelTime & ! & * xyz_DensBasicZ & ! & * ( xyza_MixRtAll(:,:,:,IdxC(s)) ** 3.0d0 ) * 1.0d6 & ! & / ( 60.0d0 & ! & * ( & ! & 2.0d0 * xyza_MixRtAll(:,,:,:,IdxC(s)) & ! & + 2.66d-8 * N0 / ( xyz_DensBasicZ * D0 ) & ! & ) & ! & ) !衝突合体成長 ! Kessler (1969) のパラメタリゼーション xyz_Collect = DelTime * 2.2d0 * FactorJ * xyza_MixRtAll(:,:,:,IdxC(s)) * ( xyza_MixRtAll(:,:,:,IdxR(s)) * xyz_DensBasicZ ) ** 0.875d0 !雲の変換量: 併合成長と合体衝突の和 ! 元々の変化量を上限値として設定する. 負の値となる. xyza_Cloud2Rain(:,:,:,IdxC(s)) = - min( xyza_MixRtAll(:,:,:,IdxC(s)), ( xyz_AutoConv + xyz_Collect ) ) !雨の変換量. 符号は雲の変換量とは反対. xyza_Cloud2Rain(:,:,:,IdxR(s)) = - xyza_Cloud2Rain(:,:,:,IdxC(s)) end do ! write(*,*) 'C2R: ', minval(xza_Cloud2Rain(:,:,:,1)), maxval(xza_Cloud2Rain(:,:,:,1)) ! write(*,*) 'C2R: ', minval(xza_Cloud2Rain(:,:,:,2)), maxval(xza_Cloud2Rain(:,:,:,2)) ! write(*,*) 'C2R: ', minval(xza_Cloud2Rain(:,:,:,3)), maxval(xza_Cloud2Rain(:,:,:,3)) end function xyza_Cloud2Rain
Function : | |||
xyza_FallRain(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) : | real(DP)
| ||
xyza_MixRt(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) : | real(DP), intent(in)
|
雨粒の落下による移流を求める.
function xyza_FallRain( xyza_MixRt ) ! ! 雨粒の落下による移流を求める. ! !暗黙の型宣言禁止 implicit none !変数定義 real(DP), intent(in) :: xyza_MixRt(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) !蒸気混合比(擾乱) real(DP) :: xyza_MixRtAll(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) !蒸気混合比(擾乱 + 平均場) real(DP) :: xyza_FallRain(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) !雨粒の落下効果 real(DP) :: xyz_VelZRain(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !雨粒落下速度 integer :: s xyza_MixRtAll = max( 0.0d0, xyza_MixRt + xyza_MixRtBasicZ ) xyza_FallRain = 0.0d0 xyz_VelZRain = 0.0d0 !落下による移流 ! Dens の avr を取ってから割ると, ゼロ割が生じるので注意 do s = 1, RainNum !雨粒終端速度 xyz_VelZRain = 12.2d0 * FactorJ * ( xyza_MixRtAll(:,:,:,IdxR(s)) ** 0.125d0 ) xyza_FallRain(:,:,:,IdxR(s)) = xyz_avr_xyr( xyr_dz_xyz(xyz_DensBasicZ * xyz_VelZRain * xyza_MixRtAll(:,:,:,IdxR(s)) ) ) / xyz_DensBasicZ end do call StoreMixRtRain( xyza_FallRain ) end function xyza_FallRain
Function : | |||
xyza_Rain2Gas(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) : | real(DP) | ||
xyz_Exner(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) : | real(DP), intent(in)
| ||
xyz_PotTemp(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) : | real(DP), intent(in)
| ||
xyza_MixRt(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) : | real(DP), intent(in)
| ||
DelTime : | real(DP)
|
雨粒から蒸気への変換量を計算するためのルーチン
変換量および, 蒸気と雨粒の混合比は正の量なので, 計算の途中途中で 値が正になることを保証している. また, 元々存在する以上の雨粒が 蒸気に変換されないように, 元々の雨粒混合比を変換量の上限としている.
木星の場合は, FactorJ で変換量を加速する.
function xyza_Rain2Gas(xyz_Exner, xyz_PotTemp, xyza_MixRt, DelTime) ! ! 雨粒から蒸気への変換量を計算するためのルーチン ! ! 変換量および, 蒸気と雨粒の混合比は正の量なので, 計算の途中途中で ! 値が正になることを保証している. また, 元々存在する以上の雨粒が ! 蒸気に変換されないように, 元々の雨粒混合比を変換量の上限としている. ! ! 木星の場合は, FactorJ で変換量を加速する. ! !暗黙の型宣言禁止 implicit none !変数定義 real(DP), intent(in) :: xyz_PotTemp(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !温位の擾乱成分 real(DP), intent(in) :: xyz_Exner(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !温度の擾乱成分 real(DP), intent(in) :: xyza_MixRt(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) !混合比の擾乱成分 real(DP) :: DelTime !時間刻み real(DP) :: xyza_Rain2Gas(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) ! real(DP) :: xyz_TempAll(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !温度の擾乱成分 + 平均成分 real(DP) :: xyz_PressAll(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !全圧 real(DP) :: xyza_MixRtAll(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) !混合比の擾乱成分 + 平均成分 real(DP) :: xyz_NonSaturate(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !未飽和度(飽和混合比と蒸気の混合比の差) integer :: s !温度, 圧力, 混合比の全量を求める !擾乱成分と平均成分の足し算 xyz_TempAll = ( xyz_PotTemp + xyz_PotTempBasicZ ) * ( xyz_Exner + xyz_ExnerBasicZ ) xyz_PressAll = PressBasis * ((xyz_Exner + xyz_ExnerBasicZ) ** (CpDry / GasRDry)) xyza_Rain2Gas = 0.0d0 !混合比は正の値であることを保証 !移流拡散計算で負になることがあり得るので. xyza_MixRtAll = max( 0.0d0, xyza_MixRt + xyza_MixRtBasicZ ) do s = 1, CondNum !飽和蒸気圧と混合比の差(飽和度)を計算. ! 雨から蒸気への変換量は飽和度に比例する. xyz_NonSaturate = max( 0.0d0, xyz_SvapPress(SpcWetID(IdxCC(s)), xyz_TempAll) * MolWtWet(IdxCG(s)) / ( MolWtDry * xyz_PressAll) - xyza_MixRtAll(:,:,:,IdxCG(s)) ) !雨の変換量 ! 元々の雨粒の混合比以上に蒸発が生じないように上限値を設定 xyza_Rain2Gas(:,:,:,IdxCR(s)) = - min( DelTime * 4.85d-2 * FactorJ * xyz_NonSaturate * ( xyza_MixRtAll(:,:,:,IdxCR(s)) * xyz_DensBasicZ )** 0.65d0, xyza_MixRtAll(:,:,:,IdxCR(s)) ) !蒸気の変換量 ! 雨粒の変換量とは符号が逆となる xyza_Rain2Gas(:,:,:,IdxCG(s)) = - xyza_Rain2Gas(:,:,:,IdxCR(s)) end do end function xyza_Rain2Gas
Function : | |||
xyza_Rain2GasNH4SH(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) : | real(DP) | ||
xyz_Exner(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) : | real(DP), intent(in)
| ||
xyz_PotTemp(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) : | real(DP), intent(in)
| ||
xyza_MixRt(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) : | real(DP), intent(in)
| ||
DelTime : | real(DP), intent(in)
|
雨粒から蒸気への変換量を計算するためのルーチン
変換量および, 蒸気と雨粒の混合比は正の量なので, 計算の途中途中で 値が正になることを保証している. また, 元々存在する以上の雨粒が 蒸気に変換されないように, 元々の雨粒混合比を変換量の上限としている.
function xyza_Rain2GasNH4SH(xyz_Exner, xyz_PotTemp, xyza_MixRt, DelTime) ! ! 雨粒から蒸気への変換量を計算するためのルーチン ! ! 変換量および, 蒸気と雨粒の混合比は正の量なので, 計算の途中途中で ! 値が正になることを保証している. また, 元々存在する以上の雨粒が ! 蒸気に変換されないように, 元々の雨粒混合比を変換量の上限としている. ! !暗黙の型宣言禁止 implicit none !変数定義 real(DP), intent(in) :: xyz_PotTemp(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !温位の擾乱成分 real(DP), intent(in) :: xyz_Exner(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !温度の擾乱成分 real(DP), intent(in) :: xyza_MixRt(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) !混合比の擾乱成分 real(DP), intent(in) :: DelTime !時間刻み real(DP) :: xyza_Rain2GasNH4SH(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) ! real(DP) :: xyz_TempAll(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !温度の擾乱成分 + 平均成分 real(DP) :: xyz_PressAll(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !圧力の擾乱成分 + 平均成分 real(DP) :: xyza_MixRtAll(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax, SpcNum) !混合比の擾乱成分 + 平均成分 real(DP) :: xyz_NonSaturate(DimXMin:DimXMax,DimYMin:DimYMax,DimZMin:DimZMax) !未飽和度(飽和混合比と蒸気の混合比の差) !温度, 圧力, 混合比の全量を求める !擾乱成分と平均成分の足し算 xyz_TempAll = ( xyz_PotTemp + xyz_PotTempBasicZ ) * ( xyz_Exner + xyz_ExnerBasicZ ) xyz_PressAll= PressBasis * ((xyz_Exner + xyz_ExnerBasicZ) ** (CpDry / GasRDry)) xyza_Rain2GasNH4SH = 0.0d0 !混合比は正の値であることを保証 !移流拡散計算で負になることがあり得るので. xyza_MixRtAll = max( 0.0d0, xyza_MixRt + xyza_MixRtBasicZ ) !飽和蒸気圧と混合比の差(飽和度)を計算. ! 雨から蒸気への変換量は飽和度に比例する. ! 未飽和度を求めたいので, マイナスをかけ算している ! (DelMixRtNH4SH は, NH4SH が増加する方向, すなわち飽和度を正としている) xyz_NonSaturate = max( 0.0d0, - xyz_DelMixRtNH4SH( xyz_TempAll, xyz_PressAll, xyza_MixRtAll(:,:,:,IdxNH3), xyza_MixRtAll(:,:,:,IdxH2S), MolWtWet(IdxNH3), MolWtWet(IdxH2S) ) ) !雨の変換量 ! 元々の雨粒の混合比以上に蒸発が生じないように上限値を設定 xyza_Rain2GasNH4SH(:,:,:,IdxNH4SHr) = - min( DelTime * 4.85d-2 * FactorJ * xyz_NonSaturate * ( xyza_MixRtAll(:,:,:,IdxNH4SHr) * xyz_DensBasicZ ) ** 0.65d0, xyza_MixRtAll(:,:,:,IdxNH4SHr) ) !蒸気の変換量 ! 雨粒の変換量とは符号が逆となる xyza_Rain2GasNH4SH(:,:,:,IdxNH3) = - xyza_Rain2GasNH4SH(:,:,:,IdxNH4SHr) * MolWtWet(IdxNH3) / MolWtWet(IdxNH4SHr) xyza_Rain2GasNH4SH(:,:,:,IdxH2S) = - xyza_Rain2GasNH4SH(:,:,:,IdxNH4SHr) * MolWtWet(IdxH2S) / MolWtWet(IdxNH4SHr) end function xyza_Rain2GasNH4SH