program arare3d
!
! 非静力学モデル deepconv/arare 湿潤大気対流計算用主プログラム (三次元版)
!
! モジュール引用 use statement
!
! gtool5 関連
! gtool5 modules
!
use dc_types, only: STRING, DP
use dc_message, only: MessageNotify
use gtool_historyauto, only: HistoryAutoPut
! 初期設定モジュール
! Initialize module
!
use argset, only: argset_init
use fileset, only: fileset_init, InitFile
use timeset, only: timeset_init, DelTimeLong, DelTimeShort, TimeInt, NstepLong, NstepShort, NstepDisp
use xyz_base_module, only: x_X, y_Y, z_Z, xyz_avr_pqz, xyz_avr_xqz, xyz_avr_xyr
use gridset_3d, only: gridset_init, imin, imax, jmin, jmax, kmin, kmax, lm, fimin, fimax, fjmin, fjmax, fkmin, fkmax
use basicset_3d, only: basicset_init, SpcWetSymbol, xyza_MixRtBasicZ, xyz_DensBasicZ, xyz_EffMolWtBasicZ, xyz_PotTempBasicZ, xyz_TempBasicZ, xyz_PressBasicZ, xyz_VelSoundBasicZ, xyz_ExnerBasicZ
! MPI の初期化
! Initialize MPI wrapper
!
use mpi_wrapper, only : MPIWrapperInit, MPIWrapperFinalize, myrank
! 化学量計算モジュール
! Chemical calculation modules
!
use ChemCalc_3d, only: ChemCalc_init
use chemdata, only: chemdata_init
! 力学過程計算用関数モジュール
! Dynamical processes module
!
use DynFunc_3d, only: xyz_AdvScalar, xyza_AdvScalar, xyz_AdvKm, pyz_AdvVelX, xqz_AdvVelY, xyr_Buoy, xyr_AdvVelZ, pyz_GradPi, xqz_GradPi
use DynImpFunc_3d, only: xyz_Exner_init, xyz_Exner, xyr_GradPi
! 乱流拡散計算用モジュール
! Turbulent diffusion module
!
use Turbulence_3d, only: Turbulence_Init, xyz_BuoyKm, xyz_TurbScalar, xyza_TurbScalar, pyz_TurbVelX, xyr_TurbVelZ , xyz_ShearKm , xyz_DispKm, xyz_DispHeat , xqz_TurbVelY , EddyViscosity
! 境界からのフラックス計算用モジュール
! Surface flux module
!
use HeatFlux_3d, only: xyz_HeatFluxBulk, pyz_MomFluxBulk, xqz_MomFluxBulk
! 放射強制計算用モジュール
! Radiative forceing module
!
use Radiation_3d, only: Radiation_init, xyz_RadHeatConst, xyz_NewtonCool
! 湿潤過程計算用モジュール
! Moist processes modules
!
use composition, only: composition_init
use MoistAdjust_3d, only: MoistAdjustSvapPress, MoistAdjustNH4SH
use WarmRainPrm_3d, only: WarmRainPrm_Init, xyz_Rain2GasHeat, xyza_Rain2Gas, xyza_Rain2GasNH4SH, xyz_Rain2GasHeatNH4SH, xyza_Cloud2Rain, xyza_FallRain
use MoistBuoyancy_3d,only: MoistBuoy_Init, xyz_BuoyMoistKm, xyr_BuoyMolWt, xyr_BuoyDrag
use fillnegative_3d,only: FillNegative_init, xyza_FillNegative_xyza
! 数値拡散/摩擦計算用モジュール
! Numerical diffussion /dumping module
!
use NumDiffusion_3d,only: NumDiffusion_Init, xyz_NumDiffScalar, xyz_NumDiffKm, xyza_NumDiffScalar, pyz_NumDiffVelX, xqz_NumDiffVelY, xyr_NumDiffVelZ
use damping_3d, only: damping_init, DampSponge_xyz, DampSponge_xyr, DampSponge_pyz,DampSponge_xqz
! ファイル入出力モジュール
! File I/O module
!
use RestartFileIO_3d, only : ReStartFile_Open, ReStartFile_OutPut, ReStartFile_Close, ReStartFile_Get
use BasicZFileIO, only: BasicZFileOutput
use HistoryAutoFileIO_3d, only: HistoryFileAutoOpen, HistoryFileAutoClose
! 下請けモジュール
! Utility modules
!
use cflcheck_3d, only : CFLCheckTimeShort, CFLCheckTimeLongVelX, CFLCheckTimeLongVelY, CFLCheckTimeLongVelZ
use timefilter_3d, only : AsselinFilter
use xyz_bc_module, only : BoundaryXCyc_xyz, BoundaryYCyc_xyz, BoundaryZSym_xyz, BoundaryZCyc_xyz, BoundaryXCyc_pyz, BoundaryYCyc_pyz, BoundaryZSym_pyz, BoundaryZCyc_pyz, BoundaryXCyc_xqz, BoundaryYCyc_xqz, BoundaryZSym_xqz, BoundaryZCyc_xqz, BoundaryXCyc_xyr, BoundaryYCyc_xyr, BoundaryZSym_xyr, BoundaryZCyc_xyr, BoundaryZAsym_xyr
implicit none
! 内部変数
! Internal variables
!
character(80) :: cfgfile
! NAMELIST ファイル名 ; NAMELIST fine name
real(DP), allocatable :: pyz_VelXBl(:,:,:)
! $ u (t-\Delta t) $ 東西風 ; zonal wind
real(DP), allocatable :: pyz_VelXNl(:,:,:)
! $ u (t) $ 東西風 ; zonal wind
real(DP), allocatable :: xyz_VelXNl(:,:,:)
! $ u (t) $ 東西風 ; zonal wind
real(DP), allocatable :: pyz_VelXAl(:,:,:)
! $ u (t+\Delta t) $ 東西風 ; zonal wind
real(DP), allocatable :: pyz_VelXNs(:,:,:)
! $ u (\tau) $ 東西風 ; zonal wind
real(DP), allocatable :: pyz_VelXAs(:,:,:)
! $ u (\tau +\Delta \tau) $ 東西風 ; zonal wind
real(DP), allocatable :: xqz_VelYBl(:,:,:)
! $ v (t-\Delta t) $ 南北風 ; meridonal wind
real(DP), allocatable :: xqz_VelYNl(:,:,:)
! $ v (t) $ 南北風 ; meridonal wind
real(DP), allocatable :: xyz_VelYNl(:,:,:)
! $ v (t) $ 南北風 ; meridonal wind
real(DP), allocatable :: xqz_VelYAl(:,:,:)
! $ v (t+\Delta t) $ 南北風 ; meridonal wind
real(DP), allocatable :: xqz_VelYNs(:,:,:)
! $ v (\tau -\tau) $ 南北風 ; meridonal wind
real(DP), allocatable :: xqz_VelYAs(:,:,:)
! $ v (\tau) $ 南北風 ; meridonal wind
real(DP), allocatable :: xyr_VelZBl(:,:,:)
! $ w (t-\Delta t) $ 鉛直風 ; vertical wind
real(DP), allocatable :: xyr_VelZNl(:,:,:)
! $ w (t) $ 鉛直風 ; vertical wind
real(DP), allocatable :: xyz_VelZNl(:,:,:)
! $ w (t) $ 鉛直風 ; vertical wind
real(DP), allocatable :: xyr_VelZAl(:,:,:)
! $ w (t+\Delta t) $ 鉛直風 ; vertical wind
real(DP), allocatable :: xyr_VelZNs(:,:,:)
! $ w (\tau) $ 鉛直風 ; vertical wind
real(DP), allocatable :: xyr_VelZAs(:,:,:)
! $ w (\tau +\Delta \tau) 鉛直風 ; vertical wind
real(DP), allocatable :: xyz_ExnerBl(:,:,:)
! $ \pi (t-\Delta t) $ 圧力関数 ; Exner function
real(DP), allocatable :: xyz_ExnerNl(:,:,:)
! $ \pi (t) $ 圧力関数 ; Exner function
real(DP), allocatable :: xyz_ExnerAl(:,:,:)
! $ \pi (t+\Delta t) $ 圧力関数 ; Exner function
real(DP), allocatable :: xyz_ExnerNs(:,:,:)
! $ \pi (\tau -\Delta \tau) $ 圧力関数 ; Exner function
real(DP), allocatable :: xyz_ExnerAs(:,:,:)
! $ \pi (\tau) $ 圧力関数 ; Exner function
real(DP), allocatable :: xyz_PotTempBl(:,:,:)
! $ \theta (t-\Delta t) $ 温位 ; Potential temp.
real(DP), allocatable :: xyz_PotTempNl(:,:,:)
! $ \theta (t) $ 温位 ; Potential temp.
real(DP), allocatable :: xyz_PotTempAl(:,:,:)
! $ \theta (t+\Delta t) $ 温位 ; Potential temp.
real(DP), allocatable :: xyz_PotTempWork(:,:,:)
! 温位 $ \theta $ の作業配列 ; Work array
real(DP), allocatable :: xyz_KmBl(:,:,:)
! $ Km (t-\Delta t) $ 乱流拡散係数
! Turbulent diffusion coeff.
real(DP), allocatable :: xyz_KmNl(:,:,:)
! $ K_m (t) $ 乱流拡散係数
! Turbulent diffusion coeff.
real(DP), allocatable :: xyz_KmAl(:,:,:)
! $ K_m (t+\Delta t) $ 乱流拡散係数
! Turbulent diffusion coeff.
real(DP), allocatable :: xyz_KhBl(:,:,:)
! $ K_h (t-\Delta t) $ 乱流拡散係数
! Turbulent diffusion coeff.
real(DP), allocatable :: xyz_KhNl(:,:,:)
! $ K_h (t) $ 乱流拡散係数
! Turbulent diffusion coeff.
real(DP), allocatable :: xyz_KhAl(:,:,:)
! $ K_h (t+\Delta t) $ 乱流拡散係数
! Turbulent diffusion coeff.
real(DP), allocatable :: xyza_MixRtBl(:,:,:,:)
! $ q (t-\Delta t) $ 湿潤量の混合比
! Mixing ratio of moist variables.
real(DP), allocatable :: xyza_MixRtNl(:,:,:,:)
! $ q (t) $ 湿潤量の混合比
! Mixing ratio of moist variables
real(DP), allocatable :: xyza_MixRtAl(:,:,:,:) !
! $ q (t+\Delta t) $ 湿潤量の混合比
!Mixing ratio of moist variables
real(DP), allocatable :: xyza_MixRtWork(:,:,:,:)
! 湿潤量の作業配列
! Work array for mixing ratio.
real(DP) :: Time ! 時刻 ; Time
real(DP) :: ReStartTime(2) ! リスタートファイル出力時刻用配列
! Output time array for restart file
real(DP), allocatable :: DelTimeLFrog(:)
! リープフロッグスキーム用時間格子間隔
! Time interval for Leap-frog scheme
real(DP) :: DelTimeEuler ! オイラースキーム用時間格子
! Time interval for Eular scheme
integer :: NStepLFrog ! リープフロッグスキーム用時間ステップ数
! The number of time step for Leap-frog scheme
integer, allocatable :: NStepEuler(:)
! オイラースキーム用時間ステップ数
! The number of time step for Eular scheme
real(DP), allocatable :: pyz_VelXTendDynS(:,:,:)
real(DP), allocatable :: pyz_VelXTendDynL(:,:,:)
real(DP), allocatable :: pyz_VelXTendFlux(:,:,:)
real(DP), allocatable :: xqz_VelYTendDynS(:,:,:)
real(DP), allocatable :: xqz_VelYTendDynL(:,:,:)
real(DP), allocatable :: xqz_VelYTendFlux(:,:,:)
real(DP), allocatable :: xyr_VelZTendDynS(:,:,:)
real(DP), allocatable :: xyr_VelZTendDynL(:,:,:)
real(DP), allocatable :: xyz_KmTend(:,:,:)
real(DP), allocatable :: xyz_PotTempTendDyn(:,:,:)
real(DP), allocatable :: xyz_PotTempTendRad(:,:,:)
real(DP), allocatable :: xyz_PotTempTendFlux(:,:,:)
real(DP), allocatable :: xyza_MixRtTendDyn(:,:,:,:)
real(DP), allocatable :: xyza_MixRtTendFlux(:,:,:,:)
integer :: t, tau, t1, t2, l ! do ループ変数 ; do loop variable
logical :: sw_NH4SH = .false.
logical :: sw_moist = .false.
character(STRING) :: FlagTurbulence = ""
character(STRING) :: FlagRadiation = ""
character(STRING) :: FlagCloudMicroPhys = ""
character(STRING) :: FlagSurfaceHeating = ""
integer :: ID_FlagTurbulence = 0
integer, parameter:: ID_FlagTurbulence_Steady = 1
integer, parameter:: ID_FlagTurbulence_KW1978 = 2
integer :: ID_FlagRadiation = 0
integer, parameter:: ID_FlagRadiation_HeatConst = 1
integer, parameter:: ID_FlagRadiation_NewtonCooling = 2
integer :: ID_FlagSurfaceHeating = 0
integer, parameter:: ID_FlagSurfaceHeating_Diff = 1
integer, parameter:: ID_FlagSurfaceHeating_Bulk = 2
integer :: ID_FlagCloudMicroPhys = 0
integer, parameter:: ID_FlagCloudMicroPhys_K1969 = 1
!------------------------------------------
! 初期化手続き ; Initialize procedure
!
call MainInit
!------------------------------------------
! 時間積分 time integration
!
call MessageNotify( "M", "main", "Time Integration Start" )
t = 0
Time = 0.0d0
do while (time <= TimeInt)
! 時刻の設定
! Time setting.
!
t = t + 1
Time = Time + DelTimeLong
!------------------------------------
! 渦拡散係数の移流拡散
! Advection and diffusion of turbulent diffusion coefficient.
!
select case (ID_FlagTurbulence)
case (ID_FlagTurbulence_Steady)
! 乱流エネルギーを定常とした場合の渦拡散係数, 渦粘性係数を求める
!
call EddyViscosity( pyz_VelXNl, xqz_VelYNl, xyr_VelZNl, xyz_PotTempNl, xyz_KmNl, xyz_KmAl )
case (ID_FlagTurbulence_KW1978)
! 乱流エネルギーの時間発展を解く
!
call Tendency_EddyViscosity_KW1978( pyz_VelXNl, xqz_VelYNl, xyr_VelZNl, xyz_PotTempBl, xyz_ExnerBl, xyza_MixRtBl, xyz_KmTend )
! 時間発展
xyz_KmAl = xyz_KmBl + DelTimeLFrog(t) * xyz_KmTend
! 値の上限下限の設定
! * 値は正になることを保証する
! * 値の上限は 800 とする. 中島健介(1994, 学位論文)参照
!
! Upper and lower bound value are specified.
!
xyz_KmAl = max( 0.0d0, min( xyz_KmAl, 800.0d0 ) )
end select
! 境界条件 ; Boundary condition
!
call BoundaryXCyc_xyz( xyz_KmAl ) ! (inout)
call BoundaryYCyc_xyz( xyz_KmAl ) ! (inout)
call BoundaryZSym_xyz( xyz_KmAl ) ! (inout)
! スカラーに対する渦拡散係数の計算
! Specify turbulent diffusion coefficient for scalar variables.
!
xyz_KhAl = 3.0d0 * xyz_KmAl
!-----------------------------------------
! 温位の移流拡散の計算
! Advection and diffusion of potential temperature.
!
call Tendency_PotTemp_Dynamic( pyz_VelXNl, xqz_VelYNl, xyr_VelZNl, xyz_PotTempBl, xyz_PotTempNl, xyz_KmBl, xyz_KhBl, xyz_PotTempTendDyn )
! 物理過程: 放射強制
! Radiation of potential temperature
!
select case (ID_FlagRadiation)
case (ID_FlagRadiation_HeatConst)
! とある高度領域を加熱・冷却
call Tendency_PotTemp_Radiation_HeatConst( xyz_ExnerBl, xyz_PotTempTendRad )
case (ID_FlagRadiation_NewtonCooling)
! call Tendency_PotTemp_Radiation_NewtonCool( &
! & xyz_ExnerBl, & ! (in)
! & xyz_PotTempTendRad & ! (out)
! & )
end select
! 物理過程: 境界からの熱輸送
!!!! Flux of potential temperature from bottom boundary.
!
select case (ID_FlagSurfaceHeating)
case (ID_FlagSurfaceHeating_Diff)
! call Tendency_PotTemp_Flux_Diff( &
! & xyz_PotTempNl, & !(in)
! & xyz_PotTempTendFlux & !(out)
! & )
case (ID_FlagSurfaceHeating_Bulk)
! call Tendency_PotTemp_Flux_Bulk( &
! & xyz_PotTempNl, & !(in)
! & xyz_PotTempTendFlux & !(out)
! & )
end select
! 時間積分
! Time integration
!
xyz_PotTempAl = xyz_PotTempBl + DelTimeLFrog(t) * (xyz_PotTempTendDyn + xyz_PotTempTendRad + xyz_PotTempTendFlux)
! 境界条件 ; Boundary condition
!
call BoundaryXCyc_xyz( xyz_PotTempAl ) ! (inout)
call BoundaryYCyc_xyz( xyz_PotTempAl ) ! (inout)
call BoundaryZSym_xyz( xyz_PotTempAl ) ! (inout)
!---------------------------------------
! 凝結成分混合比の時間発展
!
! 凝縮成分混合比の移流拡散
! Advection and diffusion of vapor, cloud and rain mixing ratios.
!
if (sw_moist) then
call Tendency_MixRt_Dynamic( pyz_VelXNl, xqz_VelYNl, xyr_VelZNl, xyza_MixRtBl, xyza_MixRtNl, xyz_KhBl, xyza_MixRtTendDyn )
! 凝縮成分混合比の下部境界からのフラックス
! Flux of vapor, cloud and rain mixing ratios from bottom boundary.
!
select case (ID_FlagSurfaceHeating)
case (ID_FlagSurfaceHeating_Diff)
! call Tendency_MixRt_Flux_Diff( &
! & xyza_MixRtNl, & !(in)
! & xyza_MixRtTendFlux & !(out)
! & )
case (ID_FlagSurfaceHeating_Bulk)
call Tendency_MixRt_Flux_Bulk( xyza_MixRtNl, xyza_MixRtTendFlux )
end select
! 時間積分 Time Integration
!
xyza_MixRtAl = xyza_MixRtBl + DelTimeLFrog(t) * ( xyza_MixRtTendDyn + xyza_MixRtTendFlux )
! 境界条件 Boundary condition
!
do l = 1, lm
call BoundaryXCyc_xyz( xyza_MixRtAl(:,:,:,l) ) ! (inout)
call BoundaryYCyc_xyz( xyza_MixRtAl(:,:,:,l) ) ! (inout)
call BoundaryZSym_xyz( xyza_MixRtAl(:,:,:,l) ) ! (inout)
end do
! 移流によって負になった部分を埋める
! Negative values due to advection are corrected.
!
call Adjust_MixRt_FillNegative( DelTimeLFrog(t), xyza_MixRtAl )
! 凝結過程
!
select case (ID_FlagCloudMicroPhys)
case (ID_FlagCloudMicroPhys_K1969)
call Adjust_MixRt_Condensation_Kessler( DelTimeLFrog(t), xyz_ExnerNl, xyz_PotTempAl, xyza_MixRtAl )
end select
! 境界条件 Boundary condition
!
call BoundaryXCyc_xyz( xyz_PotTempAl ) ! (inout)
call BoundaryYCyc_xyz( xyz_PotTempAl ) ! (inout)
call BoundaryZSym_xyz( xyz_PotTempAl ) ! (inout)
do l = 1, lm
call BoundaryXCyc_xyz( xyza_MixRtAl(:,:,:,l) ) ! (inout)
call BoundaryYCyc_xyz( xyza_MixRtAl(:,:,:,l) ) ! (inout)
call BoundaryZSym_xyz( xyza_MixRtAl(:,:,:,l) ) ! (inout)
end do
end if
!-----------------------------------------
! 速度の移流拡散.
! Advection and diffusion of velocity components.
!
call Tendency_VelX_DynamicLong( pyz_VelXBl, pyz_VelXNl, xqz_VelYBl, xqz_VelYNl, xyr_VelZBl, xyr_VelZNl, xyz_KmBl, pyz_VelXTendDynL )
call Tendency_VelY_DynamicLong( pyz_VelXBl, pyz_VelXNl, xqz_VelYBl, xqz_VelYNl, xyr_VelZBl, xyr_VelZNl, xyz_KmBl, xqz_VelYTendDynL )
call Tendency_VelZ_DynamicLong( pyz_VelXBl, pyz_VelXNl, xqz_VelYBl, xqz_VelYNl, xyr_VelZBl, xyr_VelZNl, xyz_KmBl, xyz_PotTempNl, xyza_MixRtNl, xyr_VelZTendDynL )
! select case (ID_FlagSurfaceFlux)
! case (ID_FlagSurfaceFlux_Bulk)
! call Tendency_VelX_Flux_Bulk()
! pyz_MomFluxBulk( pyz_VelXBl )
! xqz_MomFluxBulk( xqz_VelYBl )
! end select
! 短い時間ステップの初期値作成.
! Initial values set up for time integration with short time step.
!
pyz_VelXNs = pyz_VelXBl
xqz_VelYNs = xqz_VelYBl
xyr_VelZNs = xyr_VelZBl
xyz_ExnerNs = xyz_ExnerBl
! 短い時間ステップの時間積分. オイラー法を利用.
! Time integration with short time step.
!
Euler: do tau = 1, NstepEuler(t)
! 速度 u の計算.
! Time integration horizontal velocity (u).
!
call Tendency_VelX_DynamicShort( pyz_VelXNs, xqz_VelYNs, xyr_VelZNs, xyz_ExnerNs, pyz_VelXTendDynS)
! 時間積分
!
pyz_VelXAs = pyz_VelXNs + DelTimeEuler * ( pyz_VelXTendDynL + pyz_VelXTendDynS )
! 境界条件 Boundary condition
!
call BoundaryXCyc_pyz( pyz_VelXAs ) ! (inout)
call BoundaryYCyc_pyz( pyz_VelXAs ) ! (inout)
call BoundaryZSym_pyz( pyz_VelXAs ) ! (inout)
! 速度 v の計算.
! Time integration horizontal velocity (v).
!
call Tendency_VelY_DynamicShort( pyz_VelXNs, xqz_VelYNs, xyr_VelZNs, xyz_ExnerNs, xqz_VelYTendDynS)
! 時間積分
!
xqz_VelYAs = xqz_VelYNs + DelTimeEuler * ( xqz_VelYTendDynL + xqz_VelYTendDynS )
! 境界条件 Boundary condition
!
call BoundaryXCyc_xqz( xqz_VelYAs ) ! (inout)
call BoundaryYCyc_xqz( xqz_VelYAs ) ! (inout)
call BoundaryZSym_xqz( xqz_VelYAs ) ! (inout)
! エクスナー関数の計算.
! Time integration exner function.
!
xyz_ExnerAs = xyz_Exner( xyr_VelZTendDynL, pyz_VelXNs, pyz_VelXAs, xqz_VelYNs, xqz_VelYAs, xyr_VelZNs, xyz_ExnerNs )
! 境界条件 Boundary condition
!
call BoundaryXCyc_xyz( xyz_ExnerAs ) ! (inout)
call BoundaryYCyc_xyz( xyz_ExnerAs ) ! (inout)
call BoundaryZSym_xyz( xyz_ExnerAs ) ! (inout)
! 速度 w の計算
! Time integration vertical velocity.
!
call Tendency_VelZ_DynamicShort( pyz_VelXNs, xqz_VelYNs, xyr_VelZNs, xyz_ExnerNs, xyz_ExnerAs, xyr_VelZTendDynS)
! 時間積分
!
xyr_VelZAs = xyr_VelZNs + DelTimeEuler * (xyr_VelZTendDynL + xyr_VelZTendDynS)
! 境界条件 Boundary condition
!
call BoundaryXCyc_xyr( xyr_VelZAs ) ! (inout)
call BoundaryYCyc_xyr( xyr_VelZAs ) ! (inout)
call BoundaryZAsym_xyr( xyr_VelZAs ) ! (inout)
! 短い時間ステップのループを回すための処置
! Renew prognostic variables for next short time step integration.
!
xyz_ExnerNs = xyz_ExnerAs
pyz_VelXNs = pyz_VelXAs
xqz_VelYNs = xqz_VelYAs
xyr_VelZNs = xyr_VelZAs
end do Euler
! 最終的な短い時間ステップでの値を長い時間ステップでの値とみなす
! Renew prognostic variables for next long time step integration.
!
xyz_ExnerAl = xyz_ExnerAs
pyz_VelXAl = pyz_VelXAs
xqz_VelYAl = xqz_VelYAs
xyr_VelZAl = xyr_VelZAs
! 時間フィルタ.
! Time filter.
!
call AsselinFilter( xyz_ExnerAl, xyz_ExnerNl, xyz_ExnerBl )
call AsselinFilter( pyz_VelXAl, pyz_VelXNl, pyz_VelXBl )
call AsselinFilter( xqz_VelYAl, xqz_VelYNl, xqz_VelYBl )
call AsselinFilter( xyr_VelZAl, xyr_VelZNl, xyr_VelZBl )
call AsselinFilter( xyz_PotTempAl, xyz_PotTempNl, xyz_PotTempBl )
call AsselinFilter( xyz_KmAl, xyz_KmNl, xyz_KmBl )
do l = 1, lm
call AsselinFilter( xyza_MixRtAl(:,:,:,l), xyza_MixRtNl(:,:,:,l), xyza_MixRtBl(:,:,:,l))
end do
! スポンジ層
! Numerical dumping.
!
call DampSponge_pyz( pyz_VelXAl, pyz_VelXBl, DelTimeLFrog(t) )
call DampSponge_xqz( xqz_VelYAl, xqz_VelYBl, DelTimeLFrog(t) )
call DampSponge_xyr( xyr_VelZAl, xyr_VelZBl, DelTimeLFrog(t) )
call DampSponge_xyz( xyz_ExnerAl, xyz_ExnerBl, DelTimeLFrog(t) )
call DampSponge_xyz( xyz_PotTempAl, xyz_PotTempBl, DelTimeLFrog(t) )
call DampSponge_xyz( xyz_KmAl, xyz_KmBl, DelTimeLFrog(t) )
! 長い時間ステップのループを回すための処置.
! Renew prognostic variables for next long time step integration.
!
xyz_PotTempBl = xyz_PotTempNl
xyza_MixRtBl = xyza_MixRtNl
xyz_ExnerBl = xyz_ExnerNl
pyz_VelXBl = pyz_VelXNl
xqz_VelYBl = xqz_VelYNl
xyr_VelZBl = xyr_VelZNl
xyz_KmBl = xyz_KmNl
xyz_KhBl = xyz_KhNl
xyz_PotTempNl = xyz_PotTempAl
xyza_MixRtNl = xyza_MixRtAl
xyz_ExnerNl = xyz_ExnerAl
pyz_VelXNl = pyz_VelXAl
xqz_VelYNl = xqz_VelYAl
xyr_VelZNl = xyr_VelZAl
xyz_KmNl = xyz_KmAl
xyz_KhNl = xyz_KhAl
! ヒストリーファイルへの出力.
! Out put to history file.
!
! call MessageNotify( "M", "main", "Time = %f", d=(/Time/) )
! 移流に対する CFL 条件のチェック
! CFL condtion check for advection
!
! call CFLCheckTimeLongVelX( &
! & pyz_VelXNl & ! (in)
! & )
! call CFLCheckTimeLongVelY( &
! & xqz_VelYNl & ! (in)
! & )
! call CFLCheckTimeLongVelZ( &
! & xyr_VelZNl & ! (in)
! & )
! ヒストリファイル出力.
! Out put to history file.
!
xyz_VelXNl = xyz_avr_pqz(pyz_VelXNl)
xyz_VelYNl = xyz_avr_xqz(xqz_VelYNl)
xyz_VelZNl = xyz_avr_xyr(xyr_VelZNl)
call HistoryAutoPut(Time, 'PotTemp', xyz_PotTempNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'Exner', xyz_ExnerNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'VelX', xyz_VelXNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'VelY', xyz_VelYNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'VelZ', xyz_VelZNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'Km', xyz_KmNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'Kh', xyz_KhNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
do l = 1, lm
call HistoryAutoPut(Time, trim(SpcWetSymbol(l)), xyza_MixRtNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax, l))
end do
end do
! 出力ファイルのクローズ
! Close out put files.
!
call HistoryFileAutoClose
!----------------------------------------------------
! リスタートファイルの作成
! Make restartfile.
!
call ReStartFile_Open( )
call ReStartFile_OutPut( Time - DelTimeLong, xyz_PotTempBl, xyz_ExnerBl, pyz_VelXBl, xqz_VelYBl, xyr_VelZBl, xyza_MixRtBl, xyz_KmBl, xyz_KhBl )
call ReStartFile_OutPut( Time, xyz_PotTempNl, xyz_ExnerNl, pyz_VelXNl, xqz_VelYNl, xyr_VelZNl, xyza_MixRtNl, xyz_KmNl, xyz_KhNl )
call ReStartFile_Close
!----------------------------------------------------
! MPI END
!
call MPIWrapperFinalize
contains
!-----------------------------------------------------------------------
subroutine VariableAllocate
!
!初期化として, 配列を定義し, 値としてゼロを代入する.
!
!暗黙の型宣言禁止
implicit none
!配列割り当て
allocate( pyz_VelXBl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( pyz_VelXNl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_VelXNl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( pyz_VelXAl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( pyz_VelXNs(imin:imax,jmin:jmax,kmin:kmax) )
allocate( pyz_VelXAs(imin:imax,jmin:jmax,kmin:kmax) )
pyz_VelXBl = 0.0d0
pyz_VelXNl = 0.0d0
pyz_VelXAl = 0.0d0
pyz_VelXNs = 0.0d0
pyz_VelXAs = 0.0d0
xyz_VelXNl = 0.0d0
allocate( xqz_VelYBl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xqz_VelYNl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_VelYNl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xqz_VelYAl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xqz_VelYNs(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xqz_VelYAs(imin:imax,jmin:jmax,kmin:kmax) )
xqz_VelYBl = 0.0d0
xqz_VelYNl = 0.0d0
xqz_VelYAl = 0.0d0
xqz_VelYNs = 0.0d0
xqz_VelYAs = 0.0d0
xyz_VelYNl = 0.0d0
allocate( xyr_VelZBl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyr_VelZNl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_VelZNl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyr_VelZAl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyr_VelZNs(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyr_VelZAs(imin:imax,jmin:jmax,kmin:kmax) )
xyr_VelZBl = 0.0d0
xyr_VelZNl = 0.0d0
xyr_VelZAl = 0.0d0
xyr_VelZNs = 0.0d0
xyr_VelZAs = 0.0d0
xyz_VelZNl = 0.0d0
allocate( xyz_ExnerBl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_ExnerNl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_ExnerAl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_ExnerNs(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_ExnerAs(imin:imax,jmin:jmax,kmin:kmax) )
xyz_ExnerBl = 0.0d0
xyz_ExnerNl = 0.0d0
xyz_ExnerAl = 0.0d0
xyz_ExnerNs = 0.0d0
xyz_ExnerAs = 0.0d0
allocate( xyz_PotTempBl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_PotTempNl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_PotTempAl(imin:imax,jmin:jmax,kmin:kmax) )
xyz_PotTempBl = 0.0d0
xyz_PotTempNl = 0.0d0
xyz_PotTempAl = 0.0d0
allocate( xyz_KmBl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_KmNl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_KmAl(imin:imax,jmin:jmax,kmin:kmax) )
xyz_KmBl = 0.0d0
xyz_KmNl = 0.0d0
xyz_KmAl = 0.0d0
allocate( xyz_KhBl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_KhNl(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_KhAl(imin:imax,jmin:jmax,kmin:kmax) )
xyz_KhBl = 0.0d0
xyz_KhNl = 0.0d0
xyz_KhAl = 0.0d0
allocate( xyza_MixRtBl(imin:imax,jmin:jmax,kmin:kmax,lm) )
allocate( xyza_MixRtNl(imin:imax,jmin:jmax,kmin:kmax,lm) )
allocate( xyza_MixRtAl(imin:imax,jmin:jmax,kmin:kmax,lm) )
xyza_MixRtBl = 0.0d0
xyza_MixRtNl = 0.0d0
xyza_MixRtAl = 0.0d0
allocate( DelTimeLFrog(NstepLong) )
allocate( NStepEuler(NStepLong) )
DelTimeEuler = 0.0d0
DelTimeLFrog = 0.0d0
NStepEuler = 0.0d0
NstepLFrog = 0.0d0
allocate( pyz_VelXTendDynS(imin:imax,jmin:jmax,kmin:kmax) )
allocate( pyz_VelXTendDynL(imin:imax,jmin:jmax,kmin:kmax) )
allocate( pyz_VelXTendFlux(imin:imax,jmin:jmax,kmin:kmax) )
pyz_VelXTendDynS = 0.0d0
pyz_VelXTendDynL = 0.0d0
pyz_VelXTendFlux = 0.0d0
allocate( xqz_VelYTendDynS(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xqz_VelYTendDynL(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xqz_VelYTendFlux(imin:imax,jmin:jmax,kmin:kmax) )
xqz_VelYTendDynS = 0.0d0
xqz_VelYTendDynL = 0.0d0
xqz_VelYTendFlux = 0.0d0
allocate( xyr_VelZTendDynS(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyr_VelZTendDynL(imin:imax,jmin:jmax,kmin:kmax) )
xyr_VelZTendDynS = 0.0d0
xyr_VelZTendDynL = 0.0d0
allocate( xyz_KmTend(imin:imax,jmin:jmax,kmin:kmax) )
xyz_KmTend = 0.0d0
allocate( xyz_PotTempTendDyn(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_PotTempTendRad(imin:imax,jmin:jmax,kmin:kmax) )
allocate( xyz_PotTempTendFlux(imin:imax,jmin:jmax,kmin:kmax) )
xyz_PotTempTendDyn = 0.0d0
xyz_PotTempTendRad = 0.0d0
xyz_PotTempTendFlux = 0.0d0
allocate( xyza_MixRtTendDyn(imin:imax,jmin:jmax,kmin:kmax,lm) )
allocate( xyza_MixRtTendFlux(imin:imax,jmin:jmax,kmin:kmax,lm) )
xyza_MixRtTendDyn = 0.0d0
xyza_MixRtTendFlux = 0.0d0
end subroutine VariableAllocate
!-----------------------------------------------------------------------
subroutine MainInit
implicit none
! MPI
!
call MPIWrapperInit
! NAMELIST ファイル名の読み込み
! Loading NAMELIST file.
!
call argset_init( cfgfile )
! Flag の設定
!
!
call deepconv_main_nml ( cfgfile )
! 化学定数の初期化
! Initialization of chemical constatns.
!
call chemdata_init( )
! 時間積分の初期化
! Initialization of time integration.
!
call timeset_init( cfgfile )
! 格子点情報の初期化
! Initialization of grid arrangement.
!
call gridset_init( cfgfile )
! 化学計算ルーチンの初期化
! Initialization of chemical routines.
!
call chemcalc_init( )
! 基本場の情報の初期化
! Initialization of basic state variables.
!
call basicset_init( cfgfile )
! I/O ファイル名の初期化
! Initialization of output file name.
!
call fileset_init( cfgfile )
! 湿潤過程共有変数の初期化
! Initialization of common variables for moist process.
!
if (sw_moist) call composition_init( )
! 内部変数の初期化
! Initialization of internal variables.
!
call VariableAllocate
! 初期値の代入
! * ReStartFile が設定されている場合にはファイルを読み込む.
! 設定されていない場合にはデフォルトの基本場と擾乱場を作る.
!
! Initial value set up.
! * Read restartfile if it is specified. If not, make default basic
! state and disturbance.
!
call MessageNotify( "M", "main", "Initial value setup." )
if (trim(InitFile) /= '') then
!基本場, 擾乱場の初期値を netCDF ファイルから取得する.
call ReStartFile_Get( ReStartTime, xyz_PotTempBl, xyz_ExnerBl, pyz_VelXBl, xqz_VelYBl, xyr_VelZBl, xyza_MixRtBl, xyz_KmBl, xyz_KhBl, xyz_PotTempNl, xyz_ExnerNl, pyz_VelXNl, xqz_VelYNl, xyr_VelZNl, xyza_MixRtNl, xyz_KmNl, xyz_KhNl )
else
call MessageNotify( "E", "main", "No Initial Data")
! * 1 ループ目だけは $ t $ の値を $ t-\Delta t$ の値と同じにする.
! 1 ステップ目はオイラー法で解く必要があるが, 1 ステップ目と
! それ以外のステップを別々にコーディングしたくない為
!
! Set up initial value of time = "t" variables.
!
! xyz_PotTempNl = xyz_PotTempBl
! xyz_ExnerNl = xyz_ExnerBl
! pyz_VelXNl = pyz_VelXBl
! xqz_VelYNl = xqz_VelYBl
! xyr_VelZNl = xyr_VelZBl
! xyza_MixRtNl = xyza_MixRtBl
! xyz_KmNl = xyz_KmBl
! xyz_KhNl = xyz_KhBl
end if
! 数値摩擦係数の初期化
! Initialization of numerical friction coefficient.
!
call Damping_Init( cfgfile )
! 数値拡散項の初期化
! Initialization of numerical diffusion term.
!
call NumDiffusion_Init( )
! 乱流拡散項の初期化
! Initialization of turbulent diffusion term.
!
call Turbulence_Init()
! 暖かい雨のパラメタリゼーションの初期化
! Initialization of warmrain parameterization.
!
call WarmRainPrm_Init( cfgfile )
! 負の湿潤量の補填計算の初期化
! Initialization of negative moist value correction.
!
call FillNegative_Init( xyza_MixRtBasicZ, xyz_DensBasicZ )
! 放射強制の初期化
! Initialization of radiative forcing.
!
call Radiation_Init( cfgfile )
! 湿潤気塊の浮力計算の初期化
! Initialization of moist buoyancy calculation.
!
if (sw_moist) call MoistBuoy_Init( )
! 圧力計算用係数行列の初期化
! Initialization of coefficient matrix for exner function calculation.
!
call xyz_Exner_Init() !陰解法の初期化
! 時刻とループ回数の初期化
! Initialization of time integration.
!
NstepLFrog = NstepLong
NstepEuler = NstepShort
DelTimeLFrog = DelTimeLong * 2.0d0
DelTimeEuler = DelTimeShort
! 計算開始時刻と時間格子間隔の初期化
! * ReStartFile が設定されている場合, ファイルから読み込んだ値を指定.
! * ReStartFile が設定されてない場合
! * 開始時刻は 0.0
! * 1 ステップ目の時間格子間隔を陽に指定
!
! Setup restart time and time interval.
! * Read restartfile if it is specified.
! * If not,
! * "t" is set to be 0.
! * Time intervals for 1st step are specified explicitly.
!
if ( trim(InitFile) /= '') then
Time = ReStartTime(2)
else
Time = 0.0d0
NstepEuler(1) = NstepShort /2
DelTimeLFrog(1) = DelTimeLong
end if
call MessageNotify( "M", "main", "NstepLong= %d", i=(/NstepLong/) )
call MessageNotify( "M", "main", "NstepEuler= %d", i=(/NstepEuler/) )
call MessageNotify( "M", "main", "DelTimeLFrog= %f", d=(/DelTimeLFrog/) )
call MessageNotify( "M", "main", "DelTimeEuler= %f", d=(/DelTimeEuler/) )
! ヒストリーファイルへの出力
! Out put to history file.
!
call BasicZFileOutput
! ヒストリーファイルへの出力
! Out put to history file.
!
! 開始時間の用意
!
if ( trim(InitFile) /= '') then
Time = ReStartTime(2)
elseif (Time == 0.0) then
Time = 0.0d0
else
stop
end if
! HistoryCreate
!
call HistoryFileAutoOpen(ReStartTime(2), cfgfile)
call HistoryAutoAddMain
call HistoryAutoAddFlux
call HistoryAutoAddBuoy
call HistoryAutoAddPotTemp
call HistoryAutoAddMom
call HistoryAutoAddMixRt
xyz_VelXNl = xyz_avr_pqz(pyz_VelXNl)
xyz_VelYNl = xyz_avr_xqz(xqz_VelYNl)
xyz_VelZNl = xyz_avr_xyr(xyr_VelZNl)
call HistoryAutoPut(Time, 'PotTemp', xyz_PotTempNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'Exner', xyz_ExnerNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'VelX', xyz_VelXNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'VelY', xyz_VelYNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'VelZ', xyz_VelZNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'Km', xyz_KmNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'Kh', xyz_KhNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
do l = 1, lm
call HistoryAutoPut(Time, trim(SpcWetSymbol(l)), xyza_MixRtNl(fimin:fimax, fjmin:fjmax, fkmin:fkmax, l))
end do
! 音波に対する CFL 条件のチェック
! CFL condtion check for sound wave.
!
call CFLCheckTimeShort( xyz_VelSoundBasicZ )
end subroutine MainInit
subroutine Tendency_EddyViscosity_KW1978(pyz_VelXNl, xqz_VelYNl, xyr_VelZNl, xyz_PotTempBl, xyz_ExnerBl, xyza_MixRtBl, xyz_KmTend)
! 乱流エネルギーの時間発展を解く. Klemp and Wilhelmson (1978)
!
implicit none
real(DP), intent(in) :: pyz_VelXNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xqz_VelYNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyr_VelZNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_PotTempBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_ExnerBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyza_MixRtBl(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP), intent(out) :: xyz_KmTend(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyz_Adv(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyz_Shr(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyz_Diff(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyz_Buoy(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyz_Disp(imin:imax, jmin:jmax, kmin:kmax)
xyz_Adv = xyz_AdvKm(xyz_KmNl, pyz_VelXNl, xqz_VelYNl, xyr_VelZNl)
if (sw_moist) then
xyz_Buoy = xyz_BuoyMoistKm(xyz_PotTempBl, xyz_ExnerBl, xyza_MixRtBl)
else
xyz_Buoy = xyz_BuoyKm(xyz_PotTempBl)
end if
xyz_Shr = xyz_ShearKm(xyz_KmBl, pyz_VelXBl, xqz_VelYBl, xyr_VelZBl)
xyz_Diff = xyz_NumDiffKm(xyz_KmBl)
xyz_Disp = xyz_DispKm(xyz_KmBl)
xyz_KmTend = xyz_Adv + xyz_Buoy + xyz_Shr + xyz_Diff + xyz_Disp
end subroutine Tendency_EddyViscosity_KW1978
subroutine Tendency_PotTemp_Dynamic( pyz_VelXNl, xqz_VelYNl, xyr_VelZNl, xyz_PotTempBl, xyz_PotTempNl, xyz_KmBl, xyz_KhBl, xyz_Dyn)
! 温位の移流拡散の計算
! Advection and diffusion of potential temperature.
!
implicit none
real(DP), intent(in) :: pyz_VelXNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xqz_VelYNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyr_VelZNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_PotTempBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_PotTempNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_KmBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_KhBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(out) :: xyz_Dyn(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyz_Adv(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyz_Diff(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyz_Turb(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyz_Disp(imin:imax, jmin:jmax, kmin:kmax)
xyz_Adv = xyz_AdvScalar( xyz_PotTempNl + xyz_PotTempBasicZ, pyz_VelXNl, xqz_VelYNl, xyr_VelZNl )
xyz_Turb = xyz_TurbScalar(xyz_PotTempBl + xyz_PotTempBasicZ, xyz_KhBl)
xyz_Diff = xyz_NumDiffScalar(xyz_PotTempBl)
xyz_Disp = xyz_DispHeat( xyz_KmBl )
xyz_Dyn = xyz_Adv + xyz_Turb + xyz_Diff + xyz_Disp
! Output
call HistoryAutoPut(Time, 'PotTempAdv', xyz_Adv(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'PotTempDiff', xyz_Diff(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'PotTempTurb', xyz_Turb(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
call HistoryAutoPut(Time, 'PotTempDisp', xyz_Disp(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
end subroutine Tendency_PotTemp_Dynamic
subroutine Tendency_PotTemp_Radiation_HeatConst(xyz_ExnerBl, xyz_Rad)
implicit none
real(DP), intent(in) :: xyz_ExnerBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(out) :: xyz_Rad(imin:imax, jmin:jmax, kmin:kmax)
xyz_Rad = xyz_RadHeatConst( xyz_ExnerBl )
call HistoryAutoPut(Time, 'PotTempRad', xyz_Rad(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
end subroutine Tendency_PotTemp_Radiation_HeatConst
subroutine TendencyPotTemp_Flux_Diff(xyz_PotTempNl, xyz_Flux)
implicit none
real(DP), intent(in) :: xyz_PotTempNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(out) :: xyz_Flux(imin:imax, jmin:jmax, kmin:kmax)
! xyz_Flux = xyz_HeatFluxDiff( xyz_PotTempNl )
call HistoryAutoPut(Time, 'PotTempFlux', xyz_Flux(fimin:fimax, fjmin:fjmax, fkmin:fkmax))
end subroutine TendencyPotTemp_Flux_Diff
subroutine Tendency_MixRt_Dynamic( pyz_VelXNl, xqz_VelYNl, xyr_VelZNl, xyza_MixRtBl, xyza_MixRtNl, xyz_KhBl, xyza_Dyn )
! 温位の移流拡散の計算
! Advection and diffusion of potential temperature.
!
implicit none
real(DP), intent(in) :: pyz_VelXNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xqz_VelYNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyr_VelZNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_KhBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyza_MixRtBl(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP), intent(in) :: xyza_MixRtNl(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP), intent(out) :: xyza_Dyn(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP) :: xyza_Adv(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP) :: xyza_Diff(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP) :: xyza_Turb(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP) :: xyza_Fall(imin:imax, jmin:jmax, kmin:kmax, lm)
integer :: l
xyza_Adv = xyza_AdvScalar(xyza_MixRtNl + xyza_MixRtBasicZ, pyz_VelXNl, xqz_VelYNl, xyr_VelZNl)
xyza_Turb = xyza_TurbScalar(xyza_MixRtBl + xyza_MixRtBasicZ, xyz_KhBl)
xyza_Diff = xyza_NumDiffScalar(xyza_MixRtBl)
xyza_Fall = xyza_FallRain(xyza_MixRtBl)
xyza_Dyn = xyza_Adv + xyza_Turb + xyza_Diff + xyza_Fall
! Output
do l = 1, lm
call HistoryAutoPut(Time, trim(SpcWetSymbol(l))//'_Adv', xyza_Adv(fimin:fimax, fjmin:fjmax, fkmin:fkmax, l))
call HistoryAutoPut(Time, trim(SpcWetSymbol(l))//'_Diff', xyza_Diff(fimin:fimax, fjmin:fjmax, fkmin:fkmax, l))
call HistoryAutoPut(Time, trim(SpcWetSymbol(l))//'_Turb', xyza_Turb(fimin:fimax, fjmin:fjmax, fkmin:fkmax, l))
call HistoryAutoPut(Time, trim(SpcWetSymbol(l))//'_Fall', xyza_Fall(fimin:fimax, fjmin:fjmax, fkmin:fkmax, l))
end do
end subroutine Tendency_MixRt_Dynamic
subroutine Tendency_MixRt_Flux_Diff(xyza_MixRtNl, xyza_Flux)
implicit none
real(DP), intent(in) :: xyza_MixRtNl(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP), intent(out) :: xyza_Flux(imin:imax, jmin:jmax, kmin:kmax, lm)
integer :: l
! xyza_Flux = xyza_MixRtFluxDiff(xyza_MixRtNl)
! Output
do l = 1, lm
call HistoryAutoPut(Time, trim(SpcWetSymbol(l))//'_Flux', xyza_Flux(fimin:fimax, fjmin:fjmax, fkmin:fkmax, l))
end do
end subroutine Tendency_MixRt_Flux_Diff
subroutine Tendency_MixRt_Flux_Bulk(xyza_MixRtNl, xyza_Flux)
implicit none
real(DP), intent(in) :: xyza_MixRtNl(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP), intent(out) :: xyza_Flux(imin:imax, jmin:jmax, kmin:kmax, lm)
integer :: l
! xyza_Flux = xyza_MixRtFluxBulk(xyza_MixRtNl)
! Output
do l = 1, lm
call HistoryAutoPut(Time, trim(SpcWetSymbol(l))//'_Flux', xyza_Flux(fimin:fimax, fjmin:fjmax, fkmin:fkmax, l))
end do
end subroutine Tendency_MixRt_Flux_Bulk
subroutine Adjust_MixRt_FillNegative(DelTime, xyza_MixRtAl)
implicit none
real(DP), intent(in), optional :: DelTime
real(DP), intent(inout) :: xyza_MixRtAl(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP) :: xyza_MixRtOrig(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP) :: xyza_MixRtWork(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP) :: xyza_Del(imin:imax, jmin:jmax, kmin:kmax, lm)
integer :: l
! 初期値を保管 Store Initial Value
!
xyza_MixRtOrig = xyza_MixRtAl
! 移流によって負になった部分を埋める
! Negative values due to advection are corrected.
!
xyza_MixRtWork = xyza_MixRtAl
xyza_MixRtAl = xyza_FillNegative_xyza( xyza_MixRtWork )
! 埋め切れなかった部分をゼロにする.
! Negative values mixing ratios are corrected.
!
xyza_MixRtWork = xyza_MixRtAl
xyza_MixRtAl = max( - xyza_MixRtBasicZ, xyza_MixRtWork )
! 埋めた/削った量を保管
! Adjustion value is stored.
!
xyza_Del = xyza_MixRtAl - xyza_MixRtOrig
! Output
if (present(DelTime)) then
do l = 1, lm
call HistoryAutoPut(Time, trim(SpcWetSymbol(l))//'_Fill', xyza_Del(fimin:fimax, fjmin:fjmax, fkmin:fkmax, l)/ DelTime)
end do
end if
end subroutine Adjust_MixRt_FillNegative
subroutine Adjust_MixRt_Condensation_Kessler(DelTime, xyz_ExnerNl, xyz_PotTempAl, xyza_MixRtAl)
implicit none
real(DP), intent(in) :: DelTime
real(DP), intent(in) :: xyz_ExnerNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(inout) :: xyz_PotTempAl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(inout) :: xyza_MixRtAl(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP) :: xyz_PotTempOrig(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyz_PotTempWork(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyz_DelPotTemp(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyz_Del(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyza_MixRtOrig(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP) :: xyza_MixRtWork(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP) :: xyza_DelMixRt(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP) :: xyza_Del(imin:imax, jmin:jmax, kmin:kmax, lm)
integer :: l
! 初期値を保管 Store Initial Value
!
xyz_PotTempOrig = xyz_PotTempAl
xyza_MixRtOrig = xyza_MixRtAl
! 暖かい雨のパラメタリゼーション.
! * 雲<-->雨 の変換を行う.
!
! Warm rain parameterization.
! * Conversion from cloud to rain.
!これまでの値を作業配列に保管
! Previous values are stored to work area.
!
xyza_MixRtWork = xyza_MixRtAl
!雨への変化量を計算
! Conversion values are calculated.
!
xyza_MixRtAl = xyza_MixRtWork + xyza_Cloud2Rain( xyza_MixRtAl, DelTime )
! 境界条件 Boundary condition
!
do l = 1, lm
call BoundaryXCyc_xyz( xyza_MixRtAl(:,:,:,l) ) ! (inout)
call BoundaryYCyc_xyz( xyza_MixRtAl(:,:,:,l) ) ! (inout)
call BoundaryZSym_xyz( xyza_MixRtAl(:,:,:,l) ) ! (inout)
end do
! 湿潤飽和調節
! * 蒸気<-->雲の変換を行う.
!
! Moist adjustment.
! * Conversion from vapor to cloud.
! ! これまでの値を作業配列に保管
! ! Previous values are stored to work area.
! !
! xyz_PotTempWork = xyz_PotTempAl
! xyza_MixRtWork = xyza_MixRtAl
! 湿潤調節法を適用
! Moist adjustment is applied.
!
call MoistAdjustSvapPress( xyz_ExnerNl, xyz_PotTempAl, xyza_MixRtAl )
if (sw_NH4SH) then
call MoistAdjustNH4SH( xyz_ExnerNl, xyz_PotTempAl, xyza_MixRtAl )
end if
! 境界条件 Boundary condition
!
call BoundaryXCyc_xyz( xyz_PotTempAl ) ! (inout)
call BoundaryYCyc_xyz( xyz_PotTempAl ) ! (inout)
call BoundaryZSym_xyz( xyz_PotTempAl ) ! (inout)
do l = 1, lm
call BoundaryXCyc_xyz( xyza_MixRtAl(:,:,:,l) )
call BoundaryYCyc_xyz( xyza_MixRtAl(:,:,:,l) )
call BoundaryZSym_xyz( xyza_MixRtAl(:,:,:,l) )
end do
! 暖かい雨のパラメタリゼーション.
! * 蒸気<-->雨 の変換を行う
!
! Warm rain parameterization.
! * Conversion from rain to vapor.
!これまでの値を作業配列に保管
! Previous values are stored to work area.
!
xyz_PotTempWork = xyz_PotTempAl
xyza_MixRtWork = xyza_MixRtAl
! 雨から蒸気への混合比変化を求める
! * 温位の計算において, 混合比変化が必要となるため,
! 混合比変化を 1 つの配列として用意する.
!
! Conversion values are calculated.
!
if (sw_NH4SH) then
xyza_DelMixRt = ( + xyza_Rain2Gas( xyz_ExnerNl, xyz_PotTempAl, xyza_MixRtAl, DelTime ) + xyza_Rain2GasNH4SH( xyz_ExnerNl, xyz_PotTempAl, xyza_MixRtAl, DelTime ) )
else
xyza_DelMixRt = ( + xyza_Rain2Gas( xyz_ExnerNl, xyz_PotTempAl, xyza_MixRtAl, DelTime ) )
end if
! 温位の計算. 雨から蒸気への変換に伴う潜熱・反応熱を追加.
!
!
if (sw_NH4SH) then
xyz_DelPotTemp = + ( + xyz_Rain2GasHeat( xyz_PotTempAl, xyz_ExnerNl, xyza_DelMixRt ) + xyz_Rain2GasHeatNH4SH(xyz_ExnerNl, xyza_DelMixRt) )
else
xyz_DelPotTemp = xyz_Rain2GasHeat( xyz_PotTempAl, xyz_ExnerNl, xyza_DelMixRt )
end if
! 温位と混合比の計算. 雨から蒸気への変換分を追加
!
!
xyz_PotTempAl = xyz_PotTempWork + xyz_DelPotTemp
xyza_MixRtAl = xyza_MixRtWork + xyza_DelMixRt
! 差分を用意
!
!
xyz_Del = xyz_PotTempAl - xyz_PotTempOrig
xyza_Del = xyza_MixRtAl - xyza_MixRtOrig
!値の保管
!
!
call HistoryAutoPut(Time, 'PotTempCond', xyz_Del(fimin:fimax, fjmin:fjmax, fkmin:fkmax) / DelTime)
do l = 1, lm
call HistoryAutoPut(Time, trim(SpcWetSymbol(l))//'_Cond', xyza_Del(fimin:fimax, fjmin:fjmax, fkmin:fkmax, l) / DelTime)
end do
end subroutine Adjust_MixRt_Condensation_Kessler
subroutine Tendency_VelX_DynamicLong( pyz_VelXBl, pyz_VelXNl, xqz_VelYBl, xqz_VelYNl, xyr_VelZBl, xyr_VelZNl, xyz_KmBl, pyz_Dyn)
implicit none
real(DP), intent(in) :: pyz_VelXBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: pyz_VelXNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xqz_VelYBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xqz_VelYNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyr_VelZBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyr_VelZNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_KmBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(out) :: pyz_Dyn(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: pyz_Adv(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: pyz_Diff(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: pyz_Turb(imin:imax, jmin:jmax, kmin:kmax)
pyz_Adv = pyz_AdvVelX(pyz_VelXNl, xqz_VelYNl, xyr_VelZNl)
pyz_Diff = pyz_NumDiffVelX(pyz_VelXBl)
pyz_Turb = pyz_TurbVelX(xyz_KmBl,pyz_VelXBl, xqz_VelYBl, xyr_VelZBl)
pyz_Dyn = pyz_Adv + pyz_Diff + pyz_Turb
end subroutine Tendency_VelX_DynamicLong
subroutine Tendency_VelX_DynamicShort( pyz_VelXNs, xqz_VelYNs, xyr_VelZNs, xyz_ExnerNs, pyz_Dyn)
implicit none
real(DP), intent(in) :: pyz_VelXNs(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xqz_VelYNs(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyr_VelZNs(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_ExnerNs(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(out) :: pyz_Dyn(imin:imax, jmin:jmax, kmin:kmax)
! real(DP) :: pyz_PGrd(imin:imax, jmin:jmax, kmin:kmax)
pyz_Dyn = - pyz_GradPi(xyz_ExnerNs, pyz_VelXNs, xqz_VelYNs, xyr_VelZNs)
end subroutine Tendency_VelX_DynamicShort
subroutine Tendency_VelY_DynamicLong( pyz_VelXBl, pyz_VelXNl, xqz_VelYBl, xqz_VelYNl, xyr_VelZBl, xyr_VelZNl, xyz_KmBl, xqz_Dyn)
implicit none
real(DP), intent(in) :: pyz_VelXBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: pyz_VelXNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xqz_VelYBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xqz_VelYNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyr_VelZBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyr_VelZNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_KmBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(out) :: xqz_Dyn(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xqz_Adv(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xqz_Diff(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xqz_Turb(imin:imax, jmin:jmax, kmin:kmax)
if (jmin == jmax) return
xqz_Adv = xqz_AdvVelY(pyz_VelXNl, xqz_VelYNl, xyr_VelZNl)
xqz_Diff = xqz_NumDiffVelY(xqz_VelYBl)
xqz_Turb = xqz_TurbVelY(xyz_KmBl, pyz_VelXBl, xqz_VelYBl, xyr_VelZBl)
xqz_Dyn = xqz_Adv + xqz_Diff + xqz_Turb
end subroutine Tendency_VelY_DynamicLong
subroutine Tendency_VelY_DynamicShort( pyz_VelXNs, xqz_VelYNs, xyr_VelZNs, xyz_ExnerNs, xqz_Dyn)
implicit none
real(DP), intent(in) :: pyz_VelXNs(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xqz_VelYNs(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyr_VelZNs(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_ExnerNs(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(out) :: xqz_Dyn(imin:imax, jmin:jmax, kmin:kmax)
! real(DP) :: pyz_PGrd(imin:imax, jmin:jmax, kmin:kmax)
if (jmin == jmax) return
xqz_Dyn = - xqz_GradPi(xyz_ExnerNs, pyz_VelXNs, xqz_VelYNs, xyr_VelZNs)
end subroutine Tendency_VelY_DynamicShort
subroutine Tendency_VelZ_DynamicLong( pyz_VelXBl, pyz_VelXNl, xqz_VelYBl, xqz_VelYNl, xyr_VelZBl, xyr_VelZNl, xyz_KmBl, xyz_PotTempNl, xyza_MixRtNl, xyr_Dyn)
implicit none
real(DP), intent(in) :: pyz_VelXBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: pyz_VelXNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xqz_VelYBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xqz_VelYNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyr_VelZBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyr_VelZNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_KmBl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_PotTempNl(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyza_MixRtNl(imin:imax, jmin:jmax, kmin:kmax, lm)
real(DP), intent(out) :: xyr_Dyn(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyr_Adv(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyr_Diff(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyr_Turb(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyr_BuoyT(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyr_BuoyM(imin:imax, jmin:jmax, kmin:kmax)
real(DP) :: xyr_BuoyD(imin:imax, jmin:jmax, kmin:kmax)
xyr_Adv = xyr_AdvVelZ(pyz_VelXNl, xqz_VelYNl, xyr_VelZNl)
xyr_Diff = xyr_NumDiffVelZ(xyr_VelZBl)
xyr_Turb = xyr_TurbVelZ(xyz_KmBl, pyz_VelXBl, xqz_VelYBl, xyr_VelZBl)
xyr_BuoyT = xyr_Buoy(xyz_PotTempNl)
if (sw_moist) then
xyr_BuoyM = xyr_BuoyMolWt(xyza_MixRtNl)
xyr_BuoyD = xyr_BuoyDrag(xyza_MixRtNl)
else
xyr_BuoyM = 0.0d0
xyr_BuoyD = 0.0d0
end if
xyr_Dyn = xyr_Adv + xyr_Diff + xyr_Turb + xyr_BuoyT + xyr_BuoyM + xyr_BuoyD
end subroutine Tendency_VelZ_DynamicLong
subroutine Tendency_VelZ_DynamicShort( pyz_VelXNs, xqz_VelYNs, xyr_VelZNs, xyz_ExnerNs, xyz_ExnerAs, xyr_Dyn)
implicit none
real(DP), intent(in) :: pyz_VelXNs(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xqz_VelYNs(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyr_VelZNs(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_ExnerNs(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(in) :: xyz_ExnerAs(imin:imax, jmin:jmax, kmin:kmax)
real(DP), intent(out) :: xyr_Dyn(imin:imax, jmin:jmax, kmin:kmax)
! real(DP) :: xyr_PGrd(imin:imax, jmin:jmax, kmin:kmax)
xyr_Dyn = - xyr_GradPi(xyz_ExnerAs,xyz_ExnerNs, pyz_VelXNs, xqz_VelYNs, xyr_VelZNs)
end subroutine Tendency_VelZ_DynamicShort
!-----------------------------------------------------------------------
subroutine HistoryAutoAddMain
!
! 予報変数の出力
!
use gtool_historyauto, only: HistoryAutoAddVariable
use gridset_3d, only: lm
implicit none
integer :: l
!無次元圧力の擾乱
call HistoryAutoAddVariable( varname='Exner', dims=(/'x','y','z','t'/), longname='disturbunce of nondimensional pressure', units=' ', xtype='double' )
!温位の擾乱
call HistoryAutoAddVariable( varname='PotTemp', dims=(/'x','y','z','t'/), longname='disturbunce of potential temperature', units='K', xtype='double' )
!水平速度
call HistoryAutoAddVariable( varname='VelX', dims=(/'x','y','z','t'/), longname='zonal velocity', units='m.s-1', xtype='double' )
!水平速度
call HistoryAutoAddVariable( varname='VelY', dims=(/'x','y','z','t'/), longname='zonal velocity', units='m.s-1', xtype='double' )
!鉛直速度
call HistoryAutoAddVariable( varname='VelZ', dims=(/'x','y','z','t'/), longname='vertical velocity', units='m.s-1', xtype='double' )
!渦粘性係数(運動量)
call HistoryAutoAddVariable( varname='Km', dims=(/'x','y','z','t'/), longname='turbulet diffusion coefficient', units='m2.s-1', xtype='double' )
!渦粘性係数(熱)
call HistoryAutoAddVariable( varname='Kh', dims=(/'x','y','z','t'/), longname='turbulet diffusion coefficient for heat', units='m2.s-1', xtype='double')
!混合比
do l = 1, lm
call HistoryAutoAddVariable( varname=trim(SpcWetSymbol(l)), dims=(/'x','y','z','t'/), longname=trim(SpcWetSymbol(l))//' Mixing Ratio', units='kg.kg-1', xtype='double')
end do
end subroutine HistoryAutoAddMain
subroutine HistoryAutoAddFlux
use gtool_historyauto, only: HistoryAutoAddVariable
implicit none
!地表面フラックス
call HistoryAutoAddVariable( varname='MixRtFluxBulk', dims=(/'x','y','z','t'/), longname='flux of mixing ratio of vapor from surface', units='kg.kg-1.s-1', xtype='double')
!地表面フラックス(熱)
call HistoryAutoAddVariable( varname='HeatFluxBulk', dims=(/'x','y','z','t'/), longname='flux of heating from surface', units='K.s-1', xtype='double')
!地表面フラックス(運動量)
call HistoryAutoAddVariable( varname='MomFluxBulk', dims=(/'x','y','z','t'/), longname='flux of momentum from surface', units='kg.m.s-1', xtype='double')
end subroutine HistoryAutoAddFlux
subroutine HistoryAutoAddBuoy
use gtool_historyauto, only: HistoryAutoAddVariable
implicit none
call HistoryAutoAddVariable( varname='BuoyTemp', dims=(/'x','y','z','t'/), longname='Buoyancy (Temp)', units='s-2', xtype='double')
call HistoryAutoAddVariable( varname='BuoyMolWt', dims=(/'x','y','z','t'/), longname='Buoyancy (MolWt)', units='s-2', xtype='double' )
call HistoryAutoAddVariable( varname='BuoyDrag', dims=(/'x','y','z','t'/), longname='Buoyance (Drag)', units='s-2', xtype='double' )
end subroutine HistoryAutoAddBuoy
subroutine HistoryAutoAddPotTemp
use gtool_historyauto, only: HistoryAutoAddVariable
implicit none
call HistoryAutoAddVariable( varname='PotTempCond', dims=(/'x','y','z','t'/), longname='Latent heat term of potential temperature', units='K.s-1', xtype='double')
call HistoryAutoAddVariable( varname='PotTempDamp', dims=(/'x','y','z','t'/), longname='Newtonian Cooling term of potential temperature', units='K.s-1"', xtype='double')
end subroutine HistoryAutoAddPotTemp
subroutine HistoryAutoAddMom
use gtool_historyauto, only: HistoryAutoAddVariable
implicit none
call HistoryAutoAddVariable( varname='Mom_Adv', dims=(/'x','y','z','t'/), longname='Advection term of momentum in x direction', units='kg.m..s-2"', xtype='double')
call HistoryAutoAddVariable( varname='Mom_Turb', dims=(/'x','y','z','t'/), longname='Turblence term of momentum in x direction', units='kg.m..s-2"', xtype='double')
call HistoryAutoAddVariable( varname='Mom_Diff', dims=(/'x','y','z','t'/), longname='Numerical diffusion term of momentum in x direction', units='kg.m..s-2"', xtype='double')
call HistoryAutoAddVariable( varname='Mom_Flux', dims=(/'x','y','z','t'/), longname='Flux term of momentum in x direction', units='kg.m..s-2"', xtype='double')
end subroutine HistoryAutoAddMom
subroutine HistoryAutoAddMixRt
use gtool_historyauto, only: HistoryAutoAddVariable
use gridset_3d, only: lm
implicit none
integer :: l
do l = 1, lm
call HistoryAutoAddVariable( varname=trim(SpcWetSymbol(l))//'_Adv', dims=(/'x','y','z','t'/), longname='Advection term of ' //trim(SpcWetSymbol(l))//' mixing ratio', units='kg.kg-1.s-1', xtype='double')
call HistoryAutoAddVariable( varname=trim(SpcWetSymbol(l))//'_Diff', dims=(/'x','y','z','t'/), longname='Diffusion term of ' //trim(SpcWetSymbol(l))//' mixing ratio', units='kg.kg-1.s-1', xtype='double')
call HistoryAutoAddVariable( varname=trim(SpcWetSymbol(l))//'_Fall', dims=(/'x','y','z','t'/), longname='Fall Rain term of ' //trim(SpcWetSymbol(l))//' mixing ratio', units='kg.kg-1.s-1', xtype='double')
call HistoryAutoAddVariable( varname=trim(SpcWetSymbol(l))//'_Fill', dims=(/'x','y','z','t'/), longname='Filling Negative term of ' //trim(SpcWetSymbol(l))//' mixing ratio', units='kg.kg-1.s-1', xtype='double')
call HistoryAutoAddVariable( varname=trim(SpcWetSymbol(l))//'_Cond', dims=(/'x','y','z','t'/), longname='Condensation term of ' //trim(SpcWetSymbol(l))//' mixing ratio', units='kg.kg-1.s-1', xtype='double')
end do
end subroutine HistoryAutoAddMixRt
subroutine deepconv_main_nml ( cfgfile )
use dc_message, only: MessageNotify
use dc_iounit, only : FileOpen
implicit none
character(*), intent(in) :: cfgfile ! nml file
integer :: unit !装置番号
NAMELIST /deepconv_main_nml / sw_moist, sw_NH4SH, FlagTurbulence, FlagRadiation, FlagCloudMicroPhys, FlagSurfaceHeating
call FileOpen(unit, file=cfgfile, mode='r')
read(unit, NML=deepconv_main_nml)
close(unit)
if (FlagTurbulence == "Steady") then
ID_FlagTurbulence = ID_FlagTurbulence_Steady
elseif (FlagTurbulence == "KW1978") then
ID_FlagTurbulence = ID_FlagTurbulence_KW1978
end if
if (FlagRadiation == "HeatConst") then
ID_FlagRadiation = ID_FlagRadiation_HeatConst
elseif (FlagRadiation == "NewtonCooling") then
ID_FlagRadiation = ID_FlagRadiation_NewtonCooling
end if
if (FlagSurfaceHeating == "Diff") then
ID_FlagSurfaceHeating = ID_FlagSurfaceHeating_Diff
elseif (FlagSurfaceHeating == "Bulk") then
ID_FlagSurfaceHeating = ID_FlagSurfaceHeating_Bulk
end if
if (sw_moist) then
if (FlagCloudMicroPhys == "K1969") then
ID_FlagCloudMicroPhys = ID_FlagCloudMicroPhys_K1969
end if
end if
! call MessageNotify( "M", "main", "sw_moist = %c", c1=sw_moist)
! call MessageNotify( "M", "main", "sw_NH4SH = %c", c1=sw_NH4SH)
call MessageNotify( "M", "main", "FlagTurbulence = %c", c1=trim(FlagTurbulence))
call MessageNotify( "M", "main", "ID_FlagTurbulence = %i", i=(/ID_FlagTurbulence/))
call MessageNotify( "M", "main", "FlagRadiation = %c", c1=trim(FlagRadiation))
call MessageNotify( "M", "main", "ID_FlagRadiation = %i", i=(/ID_FlagRadiation/))
call MessageNotify( "M", "main", "FlagSurfaceHeating = %c", c1=trim(FlagSurfaceHeating))
call MessageNotify( "M", "main", "ID_FlagSurfaceHeating = %i", i=(/ID_FlagSurfaceHeating/))
call MessageNotify( "M", "main", "FlagCloudMicroPhys = %c", c1=trim(FlagCloudMicroPhys))
call MessageNotify( "M", "main", "ID_FlagCloudMicroPhys = %i", i=(/ID_FlagCloudMicroPhys/))
end subroutine deepconv_main_nml
end program arare3d