Path: | main/dcpam_main.f90 |
Last Update: | 2015-07-27 16:56:28 +0900 |
Authors: | Yasuhiro Morikawa, Satoshi Noda, Yoshiyuki O. Takahashi |
Version: | $Id: dcpam_main.f90,v 1.67 2015/03/11 04:54:54 yot Exp $ |
Tag Name: | $Name: $ |
Copyright: | Copyright (C) GFD Dennou Club, 2008-2010. All rights reserved. |
License: | See COPYRIGHT |
Main Program : |
Note that Japanese and English are described in parallel.
モデルの使い方については チュートリアル を 参照してください.
See Tutorial for usage of the model.
This procedure input/output NAMELIST#dcpam_main_nml .
program dcpam_main ! ! <b>Note that Japanese and English are described in parallel.</b> ! ! モデルの使い方については {チュートリアル}[link:../../../doc/tutorial/rakuraku/] を ! 参照してください. ! ! See {Tutorial}[link:../../../doc/tutorial/rakuraku/index.htm.en] for usage of the ! model. ! ! モジュール引用 ; USE statements ! ! 力学過程 (スペクトル法, Arakawa and Suarez (1983)) ! Dynamical process (Spectral method, Arakawa and Suarez (1983)) ! use dynamics_hspl_vas83, only: DynamicsHsplVAS83 ! 物理過程のみの計算のための力学過程 ! A dynamics for calculation with physical processes only ! use dynamics_physicsonly, only: DynamicsPhysicsOnly ! ! Dynamical process for TWP-ICE experiment ! use dynamics_twpice_scm_exp, only : DynamicsTWPICESCMExp ! Held and Suarez (1994) による強制と散逸 ! Forcing and dissipation suggested by Held and Suarez (1994) ! use held_suarez_1994, only: HS94Forcing ! 簡単金星計算のための強制 ! forcing for simple Venus calculation ! use yt2003_forcing, only: YT2003Forcing ! Schneider and Liu (2009) による鉛直混合課程 ! Vertical diffusion by Schneider and Liu (2009) ! use sl09_diffusion, only : SL09Diffusion ! 放射フラックス (GFD 電脳倶楽部開発の放射モデル) ! Radiation flux (radiation model developed by GFD Dennou Club) ! use rad_DennouAGCM, only: RadDennouAGCMFlux ! 放射関連ルーチン ! Routines for radiation calculation ! use rad_utils, only : RadDTempDt, RadFluxOutput ! 地球大気向け放射モデル Ver. 2 ! radiation model for the Earth's atmosphere Ver. 2 ! use rad_Earth_V2, only: RadEarthV2Flux ! wrapper of RRTMG ! wrapper of RRTMG ! use rad_rrtmg_wrapper, only: RadRRTMGWrapperFlux ! 火星大気向け放射モデル Ver. 1 ! radiation model for the Mars' atmosphere Ver. 1 ! use rad_Mars_V1, only: RadMarsV1Flux !!$ ! (火星大気向け) Non-LTE 放射モデル !!$ ! Non-NLTE radiation model (for the Mars' atmosphere) !!$ ! !!$ use rad_15m_NLTE, only: rad15mNLTEMergeHR ! 火星計算用近赤外加熱率計算 ! Calculation of near infrared heating rate in the case of Mars ! use rad_Mars_NIR, only : RadMarsNIRINOUT ! Schneider and Liu (2009) の放射モデル ! Radiation model by Schneider and Liu (2009) ! use rad_SL09, only : RadSL09Flux ! 簡単放射モデル ! Simple radiation model ! use rad_simple, only : RadSimpleFlux ! 何もしない放射モデル ! radiation model with no absorption and no scattering ! use rad_none, only : RadNoneFlux ! 鉛直拡散フラックス ! Vertical diffusion flux ! use vdiffusion_my, only: VDiffusionMY25, VDiffusion, VDiffusionOutput use vdiffusion_my, only: VDiffusionMY251DWrapper3D use vdiffusion_my, only: VDiffusionMY25GBT94 ! JMA 乱流混合モジュール ! JMA turbulent mixing module ! use vdiffusion_jma_my_wrapper, only : VDiffusionJMAMYWrapper3D ! 地下における熱の鉛直拡散 ! Vertical diffusion of heat under the ground ! use subsurface_diffusion_heat, only: SubsurfaceDiffusion ! Gravity wave drag by McFarlane (1987) ! Gravity wave drag by McFarlane (1987) ! use gwd_m1987, only : GWDM1987 ! 積雲パラメタリゼーション (対流調節) ! Cumulus parameterization (convection adjust) ! use moist_conv_adjust, only: MoistConvAdjust ! Relaxed Arakawa-Schubert scheme ! Relaxed Arakawa-Schubert scheme ! use relaxed_arakawa_schubert, only : RAS use relaxed_arakawa_schubert, only : RAS1DWrapper3D use relaxed_arakawa_schubert, only : RASWithIce1DWrapper3DWrapper ! 大規模凝結 (非対流性凝結) ! Large scale condensation ! use lscond, only: LScaleCond use lscond, only: LScaleCond1D3DWrapper use lscond, only: LScaleCondLL911D3DWrapper ! 大規模凝結 (非対流性凝結) (Le Treut and Li, 1991) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! !!$ use lscond_LL91, only : LScaleCondLL91 ! != Saturation adjustment ! use saturation_adjust, only : SaturationAdjust ! 地表面フラックス ! Surface flux use surface_flux_bulk, only: SurfaceFlux, SurfaceFluxOutput ! ! set dust flux ! !!$ use set_dust_flux, only : SetDustFlux ! 下部境界フラックス ! Lower boundary flux ! use lb_flux_simple, only : LBFluxSimple ! 乾燥対流調節 ! Dry convective adjustment ! use dry_conv_adjust, only: DryConvAdjust ! 質量の補正 ! Mass fixer ! use mass_fixer, only: MassFixerColumn ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! use auxiliary, only: AuxVars ! 陰解法による時間積分のためのルーチン ! Routines for time integration with implicit scheme ! use phy_implicit_utils, only : PhyImplEvalRadLFluxA ! 陰解法のための行列処理 (一部の物理過程用) ! Matrices handling for implicit scheme (for a part of physical processes) ! use phy_implicit, only: PhyImplTendency ! 陰解法のための行列処理 (一部の物理過程用) ! Matrices handling for implicit scheme (for a part of physical processes) ! !!$ use phy_implicit_sdh, only: & !!$ & PhyImplSDHSetMethodFromMatthews, & !!$ & PhyImplSDHTendency, & !!$ & PhyImplSDHCorSOTempBySnowMelt !!$ ! 陰解法のための行列処理 (一部の物理過程用) !!$ ! Matrices handling for implicit scheme (for a part of physical processes) !!$ ! !!$ use phy_implicit_sdh_V2, only: & !!$ & PhyImplSDHV2SetMethodMatthews, & !!$ & PhyImplSDHV2Tendency, & !!$ & PhyImplSDHV2CorSOTempBySnowMelt ! 陰解法のための行列処理 (一部の物理過程用) ! Matrices handling for implicit scheme (for a part of physical processes) ! use phy_implicit_sdh_V3, only: PhyImplSDHV3SetMethodMatthews, PhyImplSDHV3Tendency, PhyImplSDHV3CorSOTempBySnowMelt ! 陰解法による時間積分 (大気のみ / 惑星表面温度・土壌温度計算なし) ! Time integration by using implicit scheme in case without calculation of surface and soil temperature ! use phy_implicit_atmonly, only : PhyImplAtmOnlyTendency ! 地面温度の時間積分・地表面放射補正 ! Time integration of surface temperature, correction of flux on surface ! use intg_surftemp, only: IntegralSurfTemp ! バケツモデル ! Bucket model ! use Bucket_Model, only : BucketSetFlagOceanFromMatthews, BucketModEvapAndLatentHeatFlux, BucketIntegration, BucketPRCPAdjust ! タイムフィルター (Asselin, 1972) ! Time filter (Asselin, 1972) ! use timefilter_asselin1972, only: TimeFilter, TimeFilterSurfVars ! 時間フィルター (Williams, 2009) ! Time filter (Williams, 2009) ! use timefilter_williams2009, only: TimeFilterWilliams2009, TimeFilterWilliams2009SurfVars ! 時刻管理 ! Time control ! use timeset, only: TimesetProgress, TimeB, TimeN, TimeA, EndTime, DelTime ! $ \Delta t $ [s] ! リスタートデータ入出力 ! Restart data input/output ! use restart_file_io, only: RestartFileOutPut ! 地表面温度リスタートデータ入出力 ! Restart data of surface temperature input/output ! use restart_surftemp_io, only: RestartSurfTempOutPut ! 惑星表面特性の設定 ! Setting of surface properties ! use surface_properties, only: SetSurfaceProperties ! 雪, 氷の割合 ! snow/ice fraction ! use snowice_frac, only : CalcSnowFrac ! ヒストリデータ出力 ! History data output ! use gtool_historyauto, only: HistoryAutoPut, HistoryAutoAllVarFix ! 組成に関わる配列の設定 ! Settings of array for atmospheric composition ! use composition, only: ncmax, a_QMixName, a_QMixLongName, IndexH2OVap, IndexH2OLiq, IndexH2OSol, IndexTKE, CompositionInqIndex ! 格子点設定 ! Grid points settings ! use gridset, only: imax, jmax, kmax ! 鉛直層数. ! Number of vertical level ! 物理定数設定 ! Physical constants settings ! use constants, only: LatentHeat , LatentHeatFusion, Grav ! $ g $ [m s-2]. ! 重力加速度. ! Gravitational acceleration ! ! use dc_message, only: MessageNotify ! 種別型パラメタ ! Kind type parameter ! use dc_types, only: DP, STRING, TOKEN ! キーワード. Keywords. ! 雲なしモデル ! No cloud model ! use cloud_none, only : CloudNone, CloudNoneWithIce ! 簡単雲モデル ! Simple cloud ! use cloud_simple, only: CloudSimple, CloudSimpleWithIce, CloudSimpleCalcCloudCover, CloudSimpleDivideWatAndIce, CloudSimpleCalcPRCPKeyLLTemp3D ! Tiedtke (1993) に基づく雲モデル ! Cloud model based on Tiedtke (1993) ! use cloud_T1993base, only : CloudT1993baseWithIce ! 火星 H2O 雲モデル ! Mars H2O cloud model ! use cloud_mars_h2o, only : CloudMarsH2O ! 重力沈降過程 ! Gravitational sedimentation process ! use grav_sed, only : GravSed ! 主成分相変化 ! Phase change of atmospheric major component ! use major_comp_phase_change, only : MajorCompPhaseChangeInAtm, MajorCompPhaseChangeOnGround ! 予報変数の値の確認 ! Check values of prognostic variables ! use check_prog_vars, only: CheckProgVars ! Output frequently used variables ! Output frequently used variables ! use output_freq_used_vars, only : OutputFreqUsedVars ! 宣言文 ; Declaration statements ! implicit none character(*), parameter:: prog_name = 'dcpam_main' ! 主プログラム名. ! Main program name ! 予報変数 (ステップ $ t-\Delta t $ , $ t $ , $ t+\Delta t $ ) ! Prediction variables (Step $ t-\Delta t $ , $ t $ , $ t+\Delta t $ ) ! real(DP), allocatable:: xyz_UB (:,:,:) ! $ u (t-\Delta t) $ . 東西風速. Eastward wind (m s-1) real(DP), allocatable:: xyz_VB (:,:,:) ! $ v (t-\Delta t) $ . 南北風速. Northward wind (m s-1) real(DP), allocatable:: xyz_TempB (:,:,:) ! $ T (t-\Delta t) $ . 温度. Temperature (K) real(DP), allocatable:: xyzf_QMixB(:,:,:,:) ! $ q (t-\Delta t) $ . 混合比. Mass mixing ratio of constituents (1) real(DP), allocatable:: xy_PsB (:,:) ! $ p_s (t-\Delta t) $ . 地表面気圧. Surface pressure (Pa) real(DP), allocatable:: xyz_UN (:,:,:) ! $ u (t) $ . 東西風速. Eastward wind (m s-1) real(DP), allocatable:: xyz_VN (:,:,:) ! $ v (t) $ . 南北風速. Northward wind (m s-1) real(DP), allocatable:: xyz_TempN (:,:,:) ! $ T (t) $ . 温度. Temperature (K) real(DP), allocatable:: xyzf_QMixN(:,:,:,:) ! $ q (t) $ . 混合比. Mass mixing ratio of constituents (1) real(DP), allocatable:: xy_PsN (:,:) ! $ p_s (t) $ . 地表面気圧. Surface pressure (Pa) real(DP), allocatable:: xyz_UA (:,:,:) ! $ u (t+\Delta t) $ . 東西風速. Eastward wind (m s-1) real(DP), allocatable:: xyz_VA (:,:,:) ! $ v (t+\Delta t) $ . 南北風速. Northward wind (m s-1) real(DP), allocatable:: xyz_TempA (:,:,:) ! $ T (t+\Delta t) $ . 温度. Temperature (K) real(DP), allocatable:: xyzf_QMixA(:,:,:,:) ! $ q (t+\Delta t) $ . 混合比. Mass mixing ratio of constituents (1) real(DP), allocatable:: xy_PsA (:,:) ! $ p_s (t+\Delta t) $ . 地表面気圧. Surface pressure (Pa) real(DP), allocatable:: xy_SurfMajCompIceB (:,:) ! $ M_mcs (t-\Delta t) $ . (kg m-2) ! Surface major component ice amount (kg m-2) real(DP), allocatable:: xy_SoilMoistB (:,:) ! $ M_ws (t-\Delta t) $ . 土壌水分 (kg m-2) ! Soil moisture (kg m-2) real(DP), allocatable:: xy_SurfSnowB (:,:) ! $ M_ss (t-\Delta t) $ . 積雪量 (kg m-2) ! Surface snow amount (kg m-2) real(DP), allocatable:: xy_SurfMajCompIceN (:,:) ! $ M_mcs (t) $ . (kg m-2) ! Surface major component ice amount (kg m-2) real(DP), allocatable:: xy_SoilMoistN (:,:) ! $ M_ws (t) $ . 土壌水分 (kg m-2) ! Soil moisture (kg m-2) real(DP), allocatable:: xy_SurfSnowN (:,:) ! $ M_ss (t) $ . 積雪量 (kg m-2) ! Surface snow amount (kg m-2) real(DP), allocatable:: xy_SurfMajCompIceA (:,:) ! $ M_mcs (t+\Delta t) $ . (kg m-2) ! Surface major component ice amount (kg m-2) real(DP), allocatable:: xy_SoilMoistA (:,:) ! $ M_ws (t+\Delta t) $ . 土壌水分 (kg m-2) ! Soil moisture (kg m-2) real(DP), allocatable:: xy_SurfSnowA (:,:) ! $ M_ss (t+\Delta t) $ . 積雪量 (kg m-2) ! Surface snow amount (kg m-2) ! 診断変数, 他 ! Diagnostic variables, etc. ! real(DP), allocatable:: xyz_DUDt (:,:,:) ! $ \DP{u}{t} $ . 東西風速変化 (m s-2) ! Eastward wind tendency (m s-2) real(DP), allocatable:: xyz_DVDt (:,:,:) ! $ \DP{v}{t} $ . 南北風速変化 (m s-2) ! Northward wind tendency (m s-2) real(DP), allocatable:: xyz_DTempDt (:,:,:) ! $ \DP{T}{t} $ . 温度変化 (K s-1) ! Temperature tendency (K s-1) real(DP), allocatable:: xyzf_DQMixDt(:,:,:,:) ! $ \DP{q}{t} $ . 混合比変化 (s-1) ! Mass mixing ratio tendency (s-1) real(DP), allocatable:: xyz_DTurKinEneDt(:,:,:) ! ! Turbulent kinetic energy tendency (m2 s-3) real(DP), allocatable:: xy_SurfHeight (:,:) ! $ z_s $ . 地表面高度 (m) ! Surface height (m) real(DP), allocatable:: xy_SurfHeightStd (:,:) ! ! Surface height standard deviation(m) real(DP), allocatable:: xy_SurfTemp (:,:) ! 地表面温度 (K) ! Surface temperature (K) real(DP), allocatable:: xyz_SoilTemp(:,:,:) ! 土壌温度 (K) ! Soil temperature (K) real(DP), allocatable:: xy_SurfAlbedo (:,:) ! 地表アルベド (1) ! Surface albedo (1) real(DP), allocatable:: xy_SurfHumidCoef (:,:) ! 地表湿潤度 (1) ! Surface humidity coefficient (1) real(DP), allocatable:: xy_SurfRoughLenMom (:,:) ! 地表粗度長 (m) ! Surface rough length for momentum (m) real(DP), allocatable:: xy_SurfRoughLenHeat(:,:) ! 地表粗度長 (m) ! Surface rough length for heat (m) real(DP), allocatable:: xy_SurfHeatCapacity (:,:) ! 地表熱容量 (J m-2 K-1) ! Surface heat capacity (J m-2 K-1) real(DP), allocatable:: xy_SeaIceConc(:,:) ! 海氷密度 (0 <= xy_SeaIceConc <= 1) (1) ! Sea ice concentration (0 <= xy_SeaIceConc <= 1) (1) integer , allocatable:: xy_SurfCond (:,:) ! 惑星表面状態 (0: 固定, 1: 可変) (1) ! Surface condition (0: fixed, 1: variable) (1) integer , allocatable:: xy_SurfType (:,:) ! 惑星表面タイプ (土地利用, Matthews 分布) (1) ! Surface type (land use type classified by Matthews) (1) real(DP), allocatable:: xy_DeepSubSurfHeatFlux (:,:) ! 地中熱フラックス (W m-2) ! "Deep subsurface heat flux" (W m-2) ! Heat flux at the bottom of surface/soil layer. real(DP), allocatable:: xy_SoilHeatCap (:,:) ! 土壌熱容量 (J K-1 kg-1) ! Specific heat of soil (J K-1 kg-1) real(DP), allocatable:: xy_SoilHeatDiffCoef (:,:) ! 土壌熱伝導係数 (J m-3 K-1) ! Heat conduction coefficient of soil (J m-3 K-1) real(DP), allocatable:: xy_SnowFrac(:,:) ! ! Snow fraction (1) !!$ logical , allocatable:: xy_FlagMatthewsLand(:,:) !!$ ! !!$ ! Flag for land grid point based on Matthews integer , allocatable:: xy_PhyImplSDHIndexCalcMethod(:,:) ! ! Index for calculation method used in PhyImplSDHTendency logical , allocatable:: xy_BucketFlagOceanGrid(:,:) ! ! Flag for ocean grid point used in bucket model real(DP), allocatable:: xyr_Temp (:,:,:) ! $ \hat{T} $ . 温度 (半整数レベル) (K) ! Temperature (half level) (K) real(DP), allocatable:: xyz_VirTemp (:,:,:) ! $ T_v $ . 仮温度 (K) ! Virtual temperature (K) real(DP), allocatable:: xyr_VirTemp (:,:,:) ! $ \hat{T}_v $ . 仮温度 (半整数レベル) (K) ! Virtual temperature (half level) (K) real(DP), allocatable:: xy_SurfVirTemp (:,:) ! $ \hat{T}_{v,s} $ . 仮温度 (惑星表面) (K) ! Virtual temperature (surface) (K) real(DP), allocatable:: xyz_Press (:,:,:) ! $ p $ . 気圧 (整数レベル) (Pa) ! Air pressure (full level) (Pa) real(DP), allocatable:: xyr_Press (:,:,:) ! $ \hat{p} $ . 気圧 (半整数レベル) (Pa) ! Air pressure (half level) (Pa) real(DP), allocatable:: xyz_Height (:,:,:) ! 高度 (整数レベル) (m) ! Height (full level) (m) real(DP), allocatable:: xyr_Height (:,:,:) ! 高度 (半整数レベル) (m) ! Height (half level) (m) real(DP), allocatable:: xyz_Exner (:,:,:) ! Exner 関数 (整数レベル) (1) ! Exner function (full level) (1) real(DP), allocatable:: xyr_Exner (:,:,:) ! Exner 関数 (半整数レベル) (1) ! Exner function (half level) (1) real(DP), allocatable:: xyr_RadLUwFlux (:,:,:) ! 長波フラックス (W m-2) ! Upward longwave flux (W m-2) real(DP), allocatable:: xyr_RadLDwFlux (:,:,:) ! 長波フラックス (W m-2) ! Downward longwave flux (W m-2) real(DP), allocatable:: xyr_RadLFlux (:,:,:) real(DP), allocatable:: xyr_RadLFluxA (:,:,:) ! 陰解法で解いた地表面熱収支と整合的な $ t+\Delta t $ に ! おける長波フラックスの計算 ! * ここで計算された値が直接次のステップ $ t $ における ! 長波フラックスとして用いられるわけではない ! * 現在の時間ステップにおける長波放射加熱率の計算に使 ! われる ! ! Evaluate longwave flux at $ t+\Delta t $ consistent ! with surface energy balance solved with implicit method ! * The evaluated value is not used directly as Longwave ! flux at next step $ t $. ! * The evaluated value is used to calculate long wave ! radiative heating rate in the current time step. real(DP), allocatable:: xyr_RadSFlux (:,:,:) real(DP), allocatable:: xyr_RadSUwFlux (:,:,:) ! 短波 (日射) フラックス (W m-2) ! Upward shortwave flux (W m-2) real(DP), allocatable:: xyr_RadSDwFlux (:,:,:) ! 短波 (日射) フラックス (W m-2) ! Downward shortwave flux (W m-2) real(DP), allocatable:: xyra_DelRadLFlux (:,:,:,:) ! 長波地表温度変化 (W m-2) real(DP), allocatable:: xyra_DelRadLUwFlux (:,:,:,:) ! 長波地表温度変化 (W m-2) ! real(DP), allocatable:: xyra_DelRadLDwFlux (:,:,:,:) ! 長波地表温度変化 (W m-2) ! real(DP), allocatable:: xyr_MomFluxX (:,:,:) ! 東西方向運動量フラックス ! Eastward momentum flux real(DP), allocatable:: xyr_MomFluxY (:,:,:) ! 南北方向運動量フラックス. ! Northward momentum flux real(DP), allocatable:: xyr_HeatFlux (:,:,:) ! 熱フラックス. ! Heat flux real(DP), allocatable:: xyrf_QMixFlux(:,:,:,:) ! 成分質量フラックス. ! Mass flux of compositions real(DP), allocatable:: xy_SurfMomFluxX (:,:) ! 惑星表面東西方向運動量フラックス ! Eastward momentum flux at surface real(DP), allocatable:: xy_SurfMomFluxY (:,:) ! 惑星表面南北方向運動量フラックス. ! Northward momentum flux at surface real(DP), allocatable:: xy_SurfHeatFlux (:,:) ! 惑星表面熱フラックス. ! Heat flux at surface real(DP), allocatable:: xyf_SurfQMixFlux(:,:,:) ! 惑星表面成分質量フラックス. ! Mass flux of compositions at surface real(DP), allocatable:: xy_SurfH2OVapFluxA(:,:) ! 惑星表面水蒸気フラックス. ! Water vapor flux at the surface real(DP), allocatable:: xy_SurfLatentHeatFluxA(:,:) ! 惑星表面潜熱フラックス. ! Latent heat flux at the surface ! NOTE: ! Only if the evaporation of liquid water is considered, a variable, ! xy_SurfLatentHeatFlux is not required, since a latent heat flux ! at the surface is equal to water mass flux times latent heat. ! But, if the evaporation of snow is considered, that is not the case ! and a variable for the latent heat flux is required in addition to ! that for the water mass flux. ! real(DP), allocatable:: xyr_SoilHeatFlux (:,:,:) ! 土壌中の熱フラックス (W m-2) ! Heat flux in sub-surface soil (W m-2) real(DP), allocatable:: xyr_VelDiffCoef (:,:,:) ! 拡散係数:運動量. ! Diffusion coefficient: velocity real(DP), allocatable:: xyr_TempDiffCoef (:,:,:) ! 拡散係数:温度. ! Transfer coefficient: temperature real(DP), allocatable:: xyr_QMixDiffCoef (:,:,:) ! 拡散係数:比湿. ! Diffusion coefficient: specific humidity real(DP), allocatable:: xy_SurfVelTransCoef (:,:) ! 輸送係数:運動量. ! Diffusion coefficient: velocity real(DP), allocatable:: xy_SurfTempTransCoef (:,:) ! 輸送係数:温度. ! Transfer coefficient: temperature real(DP), allocatable:: xy_SurfQVapTransCoef (:,:) ! 輸送係数:水蒸気 ! Transfer coefficient: water vapor real(DP), allocatable:: xyr_SoilTempTransCoef (:,:,:) ! 輸送係数:土壌温度. ! Transfer coefficient: soil temperature real(DP), allocatable:: xy_SurfMOLength(:,:) ! ! Monin-Obukov length real(DP), allocatable:: xy_DSurfTempDt (:,:) ! 地表面温度変化率. ! Surface temperature tendency real(DP), allocatable:: xyz_DSoilTempDt (:,:,:) ! $ \DP{Tg}{t} $ . 土壌温度変化 (K s-1) ! Temperature tendency (K s-1) real(DP), allocatable:: xy_DPsDt (:,:) ! (Pa s-1) ! Surface pressure tendency (Pa s-1) real(DP), allocatable:: xy_DSurfMajCompIceDt (:,:) ! (kg m-2 s-1) ! Surface major component ice tendency (kg m-2 s-1) real(DP), allocatable:: xy_DSoilMoistDt (:,:) ! 土壌水分時間変化率 (kg m-2 s-1) ! Soil temperature tendency (kg m-2 s-1) real(DP), allocatable:: xy_DSurfSnowDt (:,:) ! 積雪時間変化率 (kg m-2 s-1) ! Surface snow amount tendency (kg m-2 s-1) real(DP), allocatable:: xyz_DTempDtVDiff(:,:,:) ! 鉛直拡散による加熱率 (K s-1) ! Temperature tendency due to vertical diffusion (K s-1) real(DP), allocatable:: xyz_DTempDtRadL (:,:,:) ! 長波加熱率. ! Temperature tendency with longwave real(DP), allocatable:: xyz_DTempDtRadS (:,:,:) ! 短波加熱率. ! Temperature tendency with shortwave real(DP), allocatable:: xyz_DUDtGWD (:,:,:) ! $ \DP{u}{t} $ . 東西風速変化 (m s-2) ! Eastward wind tendency by gravity wave drag (m s-2) real(DP), allocatable:: xyz_DVDtGWD (:,:,:) ! $ \DP{v}{t} $ . 南北風速変化 (m s-2) ! Northward wind tendency by gravity wave drag (m s-2) real(DP), allocatable:: xyz_OMG (:,:,:) ! Vertical velocity in pressure coordinate real(DP), allocatable:: xy_Rain (:,:) ! 降水量. ! Precipitation real(DP), allocatable:: xy_RainCumulus (:,:) ! ! Rain due to moist convection real(DP), allocatable:: xy_RainLsc (:,:) ! ! Rain due to non-convective condensation real(DP), allocatable:: xy_Snow (:,:) ! ! Snow fall real(DP), allocatable:: xy_SnowCumulus (:,:) ! ! Snow fall due to moist convection real(DP), allocatable:: xy_SnowLsc (:,:) ! ! Snow fall due to non-convective condensation real(DP), allocatable:: xyz_DTempDtCum(:,:,:) real(DP), allocatable:: xyz_DQVapDtCum(:,:,:) real(DP), allocatable:: xyz_DQH2OLiqDtCum(:,:,:) ! Production rate of cloud water in the layer ! due to condensation in cumulus convection ! parameterization (kg kg-1) real(DP), allocatable:: xyz_DQH2OSolDtCum(:,:,:) ! Production rate of cloud ice in the layer ! due to condensation in cumulus convection ! parameterization (kg kg-1) real(DP), allocatable:: xyz_DUDtCum(:,:,:) real(DP), allocatable:: xyz_DVDtCum(:,:,:) real(DP), allocatable:: xyz_MoistConvDetTend (:,:,:) real(DP), allocatable:: xyz_MoistConvSubsidMassFlux(:,:,:) real(DP), allocatable:: xyz_DQH2OLiqDtLSC(:,:,:) ! Production rate of cloud water in the layer ! due to condensation in large scale condensation ! (kg kg-1) real(DP), allocatable:: xyz_DQH2OSolDtLSC(:,:,:) ! Production rate of cloud ice in the layer ! due to condensation in large scale condensation ! (kg kg-1) real(DP), allocatable:: xyz_QH2OLiqforRad(:,:,:) ! Array for liquid water for radiation calculation ! (kg kg-1) real(DP), allocatable:: xyz_QH2OSolforRad(:,:,:) ! Array for solid water (ice) for radiation calculation ! (kg kg-1) real(DP), allocatable:: xyz_CloudCoverforRad(:,:,:) ! Cloud cover (cloud fraction) real(DP), allocatable:: xy_SurfDustGravSedFlux(:,:) ! 作業変数 ! Work variables ! integer :: IDDynMode ! 使用する力学過程 ! Dynamics used for an experiment ! integer, parameter:: IDDynModeHSPLVAS83 = 0 integer, parameter:: IDDynModeNoHorAdv = 1 integer, parameter:: IDDynModeTWPICE = 2 integer :: IDPhysMode ! 使用する物理過程 ! Physics used for an experiment ! integer, parameter:: IDPhysModeNoPhysics = 0 integer, parameter:: IDPhysModeFullPhysics = 1 integer, parameter:: IDPhysModeHS94 = 2 integer, parameter:: IDPhysModeVenusSimple = 3 integer, parameter:: IDPhysModeJupiterSimple = 4 integer, parameter:: IDPhysModeJupiterSimpleV2 = 5 integer :: IDPhyTendMethod ! 物理過程による変化率の計算方法 ! Method calculating physics tendency ! integer, parameter:: IDPhyTendMethodImp1LayModel = 10 integer, parameter:: IDPhyTendMethodImpSoilModel = 11 integer, parameter:: IDPhyTendMethodImpAtmOnly = 12 integer :: IDRadMethod ! 放射過程の計算方法 ! Method for radiation ! integer, parameter:: IDRadMethodDennouAGCM = 20 integer, parameter:: IDRadMethodEarthV2 = 21 integer, parameter:: IDRadMethodMarsV1 = 22 integer, parameter:: IDRadMethodSL09 = 23 !!$ integer, parameter:: IDRadMethodVenusSimple = 24 integer, parameter:: IDRadMethodSimple = 25 integer, parameter:: IDRadMethodRRTMG = 26 integer, parameter:: IDRadMethodNone = 27 integer :: IDSfcFluxMethod ! ! Method for surface flux evaluation ! integer, parameter:: IDSfcFluxMethodL82 = 90 integer, parameter:: IDSfcFluxMethodBH91B94 = 91 integer :: IDVDiffMethod ! ! Method for vertical diffusion ! integer, parameter:: IDVDiffMethodMY2 = 80 integer, parameter:: IDVDiffMethodMY25 = 81 integer, parameter:: IDVDiffMethodJMA = 82 integer :: IDMCMethod ! 湿潤対流の計算方法 ! Method for moist convection integer, parameter:: IDMCMethodNone = 30 integer, parameter:: IDMCMethodMCA = 31 integer, parameter:: IDMCMethodRAS = 32 integer, parameter:: IDMCMethodRASWithIce = 33 integer :: IDLSCMethod ! 大規模凝結 (非対流性凝結) の計算方法 ! Method for large scale condensation ! (non-convective condensation) ! integer, parameter:: IDLSCMethodNone = 40 integer, parameter:: IDLSCMethodM65 = 41 integer, parameter:: IDLSCMethodLL91 = 42 integer, parameter:: IDLSCMethodSatAdjM65 = 43 integer, parameter:: IDLSCMethodM65WithIce = 44 integer, parameter:: IDLSCMethodLL91WithIce = 45 integer :: IDCloudMethod ! 雲の計算方法 ! Method for cloud ! integer, parameter:: IDCloudMethodNone = 50 integer, parameter:: IDCloudMethodSimple = 51 integer, parameter:: IDCloudMethodSimpleWithIce = 52 integer, parameter:: IDCloudMethodT1993WithIce = 53 integer, parameter:: IDCloudMethodMarsH2OCloud = 54 integer :: IDSfcMoistMethod ! 惑星表面水分の計算方法 ! Method for surface moisture calculation ! integer, parameter:: IDSfcMoistMethodNone = 60 integer, parameter:: IDSfcMoistMethodBucket = 61 integer :: IDDCMethod ! 乾燥対流の計算方法 ! Method for dry convection ! integer, parameter:: IDDCMethodNone = 70 integer, parameter:: IDDCMethodDCA = 71 integer :: IDGWDMethod ! ! Method for gravity wave drag ! integer, parameter:: IDGWDMethodNone = 80 integer, parameter:: IDGWDMethodM1987 = 81 logical:: firstloop = .true. ! 初回のループであることを示すフラグ. ! Flag implying first loop logical:: flag_initial ! 内部サブルーチン MainInit で設定されます. ! リスタートデータを読み込む場合には, ! .false. が, 初期値データを読み込む場合には ! .true. が設定されます. ! ! This variable is set in an internal ! subroutine "MainInit". ! If restart data is loaded, .false. is set. ! On the other hand, if initial data is loaded, ! .true. is set. integer:: n ! 組成方向に回る DO ループ用作業変数 ! Work variables for DO loop in dimension of constituents integer:: i integer:: j integer:: k ! 実行文 ; Executable statement ! ! 主プログラムの初期化 (内部サブルーチン) ! Initialization for the main program (Internal subroutine) ! call MainInit ! 時間積分 ! Time integration ! loop_time : do while ( TimeB < EndTime ) ! 地表面高度の設定 ! Set surface height ! call SetSurfaceProperties( xy_SurfHeight = xy_SurfHeight ) select case ( IDPhysMode ) case ( IDPhysModeNoPhysics ) xyz_DUDt = 0.0_DP xyz_DVDt = 0.0_DP xyz_DTempDt = 0.0_DP xy_DPsDt = 0.0_DP xyzf_DQMixDt = 0.0_DP case ( IDPhysModeHS94 ) ! Held and Suarez (1994) による強制と散逸 ! Forcing and dissipation suggested by Held and Suarez (1994) ! call HS94Forcing( xyz_UB, xyz_VB, xyz_TempB, xy_PsB, xyz_DUDt, xyz_DVDt, xyz_DTempDt ) ! (out) xy_DPsDt = 0.0_DP xyzf_DQMixDt = 0.0_DP case ( IDPhysModeVenusSimple ) ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! call AuxVars( xy_PsB, xyz_TempB, xyzf_QMixB(:,:,:,IndexH2OVap), xyr_Temp, xyz_VirTemp, xyr_VirTemp, xyr_Press = xyr_Press, xyz_Press = xyz_Press, xy_SurfHeight = xy_SurfHeight, xyz_Height = xyz_Height, xyr_Height = xyr_Height, xyz_Exner = xyz_Exner, xyr_Exner = xyr_Exner ) ! 簡単金星計算のための強制 ! forcing for simple Venus calculation ! call YT2003Forcing( xy_SurfHeight, xyz_UB, xyz_VB, xyz_TempB, xyz_VirTemp, xyr_VirTemp, xy_PsB, xyz_Press, xyr_Press, xyr_Temp, xyz_Height, xyr_Height, xyz_Exner, xyr_Exner, xyz_DUDt, xyz_DVDt, xyz_DTempDt ) xy_DPsDt = 0.0_DP xyzf_DQMixDt = 0.0_DP case ( IDPhysModeJupiterSimple ) ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! call AuxVars( xy_PsB, xyz_TempB, xyzf_QMixB(:,:,:,IndexH2OVap), xyr_VirTemp = xyr_VirTemp, xyr_Press = xyr_Press, xyz_Press = xyz_Press, xyz_Exner = xyz_Exner, xy_SurfHeight = xy_SurfHeight, xyz_Height = xyz_Height ) ! Schneider and Liu (2009) による鉛直混合課程 ! Vertical diffusion by Schneider and Liu (2009) ! call SL09Diffusion( xy_SurfHeight, xyz_Height, xyz_UB, xyz_VB, xyzf_QMixB, xyr_Press, xyr_VirTemp, xyz_DUDt, xyz_DVDt, xyz_DTempDtVDiff, xyzf_DQMixDt ) ! Schneider and Liu (2009) の放射モデル ! Radiation model by Schneider and Liu (2009) ! call RadSL09Flux( xyr_Press, xyz_Press, xyz_TempB, xyr_RadSUwFlux, xyr_RadSDwFlux, xyr_RadLUwFlux, xyr_RadLDwFlux, xyra_DelRadLUwFlux, xyra_DelRadLDwFlux ) ! Net flux is calculated. ! xyr_RadSFlux = xyr_RadSUwFlux - xyr_RadSDwFlux xyr_RadLFlux = xyr_RadLUwFlux - xyr_RadLDwFlux xyra_DelRadLFlux = xyra_DelRadLUwFlux - xyra_DelRadLDwFlux ! 放射による温度変化率 ! Temperature tendency with radiation ! call RadDTempDt( xyr_RadLFlux, xyr_RadSFlux, xyr_Press, xyz_DTempDtRadL, xyz_DTempDtRadS ) ! (out) xyr_RadLDwFlux = 0.0_DP xyra_DelRadLDwFlux = 0.0_DP ! 非断熱加熱率の総和の計算 ! Sum all diabatic heating rates ! xyz_DTempDt = xyz_DTempDtVDiff + xyz_DTempDtRadL + xyz_DTempDtRadS xy_DPsDt = 0.0_DP case ( IDPhysModeJupiterSimpleV2 ) ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! call AuxVars( xy_PsB, xyz_TempB, xyzf_QMixB(:,:,:,IndexH2OVap), xyr_VirTemp = xyr_VirTemp, xyr_Press = xyr_Press, xyz_Press = xyz_Press, xy_SurfHeight = xy_SurfHeight, xyz_Height = xyz_Height, xyz_Exner = xyz_Exner, xyr_Exner = xyr_Exner ) xyr_MomFluxX (:,:,1:kmax) = 0.0_DP xyr_MomFluxY (:,:,1:kmax) = 0.0_DP xyr_HeatFlux (:,:,1:kmax) = 0.0_DP xyrf_QMixFlux(:,:,1:kmax,:) = 0.0_DP xyr_VelDiffCoef = 0.0_DP xyr_TempDiffCoef = 0.0_DP xyr_QMixDiffCoef = 0.0_DP ! 下部境界フラックス ! Lower boundary flux ! call LBFluxSimple( xyz_UB, xyz_VB, xyz_TempB, xyr_VirTemp, xyzf_QMixB, xyr_Press, xy_SurfHeight, xyz_Height, xyz_Exner, xyr_Exner, xyr_MomFluxX(:,:,0:0), xyr_MomFluxY(:,:,0:0), xyr_HeatFlux(:,:,0:0), xyrf_QMixFlux(:,:,0:0,:), xy_SurfVelTransCoef, xy_SurfTempTransCoef, xy_SurfQVapTransCoef ) call PhyImplAtmOnlyTendency( xyr_MomFluxX, xyr_MomFluxY, xyr_HeatFlux, xyrf_QMixFlux, xyr_Press, xyz_Exner, xyr_Exner, xyr_VirTemp, xyz_Height, xyr_VelDiffCoef, xyr_TempDiffCoef, xyr_QMixDiffCoef, xy_SurfVelTransCoef, xy_SurfTempTransCoef, xy_SurfQVapTransCoef, xyz_DUDt, xyz_DVDt, xyz_DTempDtVDiff, xyzf_DQMixDt ) xy_DPsDt = 0.0_DP ! Schneider and Liu (2009) の放射モデル ! Radiation model by Schneider and Liu (2009) ! call RadSL09Flux( xyr_Press, xyz_Press, xyz_TempB, xyr_RadSUwFlux, xyr_RadSDwFlux, xyr_RadLUwFlux, xyr_RadLDwFlux, xyra_DelRadLUwFlux, xyra_DelRadLDwFlux ) ! Net flux is calculated. ! xyr_RadSFlux = xyr_RadSUwFlux - xyr_RadSDwFlux xyr_RadLFlux = xyr_RadLUwFlux - xyr_RadLDwFlux xyra_DelRadLFlux = xyra_DelRadLUwFlux - xyra_DelRadLDwFlux ! 放射による温度変化率 ! Temperature tendency with radiation ! call RadDTempDt( xyr_RadLFlux, xyr_RadSFlux, xyr_Press, xyz_DTempDtRadL, xyz_DTempDtRadS ) ! (out) xyr_RadLDwFlux = 0.0_DP xyra_DelRadLDwFlux = 0.0_DP ! 非断熱加熱率の総和の計算 ! Sum all diabatic heating rates ! xyz_DTempDt = xyz_DTempDtVDiff + xyz_DTempDtRadL + xyz_DTempDtRadS case ( IDPhysModeFullPhysics ) ! 地表面条件の設定 ! Configure surface conditions ! call SetSurfaceProperties( xy_SurfMajCompIceB, xy_SoilMoistB, xy_SurfSnowB, xy_SurfTemp = xy_SurfTemp, xy_SurfAlbedo = xy_SurfAlbedo, xy_SurfHumidCoef = xy_SurfHumidCoef, xy_SurfRoughLenMom = xy_SurfRoughLenMom, xy_SurfRoughLenHeat = xy_SurfRoughLenHeat, xy_SurfHeatCapacity = xy_SurfHeatCapacity, xy_DeepSubSurfHeatFlux = xy_DeepSubSurfHeatFlux, xy_SurfCond = xy_SurfCond, xy_SurfType = xy_SurfType, xy_SeaIceConc = xy_SeaIceConc, xy_SoilHeatCap = xy_SoilHeatCap, xy_SoilHeatDiffCoef = xy_SoilHeatDiffCoef, xy_SurfHeightStd = xy_SurfHeightStd ) ! 雪, 氷の割合 ! snow/ice fraction ! call CalcSnowFrac( xy_SurfSnowB, xy_SnowFrac ) ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! call AuxVars( xy_PsB, xyz_TempB, xyzf_QMixB(:,:,:,IndexH2OVap), xyr_Temp, xyz_VirTemp, xyr_VirTemp, xy_SurfVirTemp, xyr_Press = xyr_Press, xyz_Press = xyz_Press, xy_SurfHeight = xy_SurfHeight, xy_SurfTemp = xy_SurfTemp, xyz_Height = xyz_Height, xyr_Height = xyr_Height, xyz_Exner = xyz_Exner, xyr_Exner = xyr_Exner ) select case ( IDRadMethod ) case ( IDRadMethodDennouAGCM ) ! 放射フラックス (GFD 電脳倶楽部開発の放射モデル) ! Radiation flux (radiation model developed by GFD Dennou Club) ! call RadDennouAGCMFlux( xyz_TempB, xyzf_QMixB(:,:,:,IndexH2OVap), xyr_Press, xy_SurfTemp, xy_SurfAlbedo, xyr_RadSUwFlux, xyr_RadSDwFlux, xyr_RadLUwFlux, xyr_RadLDwFlux, xyra_DelRadLUwFlux, xyra_DelRadLDwFlux ) case ( IDRadMethodEarthV2 ) if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if ! ! Cloud model ! select case ( IDCloudMethod ) case ( IDCloudMethodNone ) xyz_QH2OLiqforRad = xyzf_QMixB(:,:,:,IndexH2OLiq) xyz_QH2OSolforRad = 0.0_DP case ( IDCloudMethodSimple ) xyz_QH2OLiqforRad = xyzf_QMixB(:,:,:,IndexH2OLiq) xyz_QH2OSolforRad = 0.0_DP case ( IDCloudMethodSimpleWithIce ) if ( IndexH2OSol <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OSol))//' is not found.' ) end if xyz_QH2OLiqforRad = xyzf_QMixB(:,:,:,IndexH2OLiq) xyz_QH2OSolforRad = xyzf_QMixB(:,:,:,IndexH2OSol) case ( IDCloudMethodT1993WithIce ) if ( IndexH2OSol <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OSol))//' is not found.' ) end if xyz_QH2OLiqforRad = xyzf_QMixB(:,:,:,IndexH2OLiq) xyz_QH2OSolforRad = xyzf_QMixB(:,:,:,IndexH2OSol) end select !!$ call CloudSimpleDivideWatAndIce( & !!$ & xyz_TempB, & ! (in ) !!$ & xyzf_QMixB(:,:,:,IndexH2OLiq), & ! (in ) !!$ & xyz_QH2OLiqforRad, xyz_QH2OSolforRad & ! (out) !!$ & ) ! Cloud cover is calculated. ! select case ( IDCloudMethod ) case ( IDCloudMethodNone ) xyz_CloudCoverforRad = 1.0_DP case ( IDCloudMethodSimple ) call CloudSimpleCalcCloudCover( xyz_Press, xyz_TempB, xyzf_QMixB(:,:,:,IndexH2OVap), xyz_CloudCoverforRad ) case ( IDCloudMethodSimpleWithIce ) call CloudSimpleCalcCloudCover( xyz_Press, xyz_TempB, xyzf_QMixB(:,:,:,IndexH2OVap), xyz_CloudCoverforRad ) case ( IDCloudMethodT1993WithIce ) xyz_CloudCoverforRad = xyzf_QMixB(:,:,:,CompositionInqIndex( 'CloudCover' )) end select call RadEarthV2Flux( xy_SurfAlbedo, xyz_Press, xyr_Press, xyz_TempB, xyzf_QMixB(:,:,:,IndexH2OVap), xyz_QH2OLiqforRad, xyz_QH2OSolforRad, xyz_CloudCoverforRad, xy_SurfTemp, xyr_RadSUwFlux, xyr_RadSDwFlux, xyr_RadLUwFlux, xyr_RadLDwFlux, xyra_DelRadLUwFlux, xyra_DelRadLDwFlux ) case ( IDRadMethodRRTMG ) if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if ! ! Cloud model ! select case ( IDCloudMethod ) case ( IDCloudMethodNone ) xyz_QH2OLiqforRad = xyzf_QMixB(:,:,:,IndexH2OLiq) xyz_QH2OSolforRad = 0.0_DP case ( IDCloudMethodSimple ) xyz_QH2OLiqforRad = xyzf_QMixB(:,:,:,IndexH2OLiq) xyz_QH2OSolforRad = 0.0_DP case ( IDCloudMethodSimpleWithIce ) if ( IndexH2OSol <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OSol))//' is not found.' ) end if xyz_QH2OLiqforRad = xyzf_QMixB(:,:,:,IndexH2OLiq) xyz_QH2OSolforRad = xyzf_QMixB(:,:,:,IndexH2OSol) case ( IDCloudMethodT1993WithIce ) if ( IndexH2OSol <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OSol))//' is not found.' ) end if xyz_QH2OLiqforRad = xyzf_QMixB(:,:,:,IndexH2OLiq) xyz_QH2OSolforRad = xyzf_QMixB(:,:,:,IndexH2OSol) end select ! Cloud cover is calculated. ! select case ( IDCloudMethod ) case ( IDCloudMethodNone ) xyz_CloudCoverforRad = 1.0_DP case ( IDCloudMethodSimple ) call CloudSimpleCalcCloudCover( xyz_Press, xyz_TempB, xyzf_QMixB(:,:,:,IndexH2OVap), xyz_CloudCoverforRad ) case ( IDCloudMethodSimpleWithIce ) call CloudSimpleCalcCloudCover( xyz_Press, xyz_TempB, xyzf_QMixB(:,:,:,IndexH2OVap), xyz_CloudCoverforRad ) case ( IDCloudMethodT1993WithIce ) xyz_CloudCoverforRad = xyzf_QMixB(:,:,:,CompositionInqIndex( 'CloudCover' )) end select ! wrapper of RRTMG ! wrapper of RRTMG ! call RadRRTMGWrapperFlux( xy_SurfAlbedo, xyz_Press, xyr_Press, xyz_TempB, xyr_Temp, xyzf_QMixB(:,:,:,IndexH2OVap), xyz_QH2OLiqforRad, xyz_QH2OSolforRad, xyz_CloudCoverforRad, xy_SurfTemp, xyr_RadSUwFlux, xyr_RadSDwFlux, xyr_RadLUwFlux, xyr_RadLDwFlux, xyra_DelRadLUwFlux, xyra_DelRadLDwFlux ) case ( IDRadMethodMarsV1 ) if ( CompositionInqIndex( 'QDust' ) <= 0 ) then call MessageNotify( 'E', prog_name, 'QDust is not found.' ) end if call RadMarsV1Flux( xy_SurfType, xy_SurfMajCompIceB, xy_SurfAlbedo, xyz_Press, xyr_Press, xyz_TempB, xyr_Temp, xy_SurfTemp, xyzf_QMixB(:,:,:,CompositionInqIndex( 'QDust' )), xyr_RadSUwFlux, xyr_RadSDwFlux, xyr_RadLUwFlux, xyr_RadLDwFlux, xyra_DelRadLUwFlux, xyra_DelRadLDwFlux ) case ( IDRadMethodSL09 ) ! Schneider and Liu (2009) の放射モデル ! Radiation model by Schneider and Liu (2009) ! call RadSL09Flux( xyr_Press, xyz_Press, xyz_TempB, xyr_RadSUwFlux, xyr_RadSDwFlux, xyr_RadLUwFlux, xyr_RadLDwFlux, xyra_DelRadLUwFlux, xyra_DelRadLDwFlux ) case ( IDRadMethodSimple ) ! 簡単放射モデル ! Simple radiation model ! call RadSimpleFlux( xy_SurfAlbedo, xy_SurfTemp, xyr_Press, xyz_Press, xyz_TempB, xyzf_QMixB(:,:,:,IndexH2OVap), xyr_RadSUwFlux, xyr_RadSDwFlux, xyr_RadLUwFlux, xyr_RadLDwFlux, xyra_DelRadLUwFlux, xyra_DelRadLDwFlux ) case ( IDRadMethodNone ) ! 何もしない放射モデル ! radiation model with no absorption and no scattering ! call RadNoneFlux( xy_SurfAlbedo, xy_SurfTemp, xyr_RadSUwFlux, xyr_RadSDwFlux, xyr_RadLUwFlux, xyr_RadLDwFlux, xyra_DelRadLUwFlux, xyra_DelRadLDwFlux ) end select ! Net flux is calculated. ! xyr_RadSFlux = xyr_RadSUwFlux - xyr_RadSDwFlux xyr_RadLFlux = xyr_RadLUwFlux - xyr_RadLDwFlux xyra_DelRadLFlux = xyra_DelRadLUwFlux - xyra_DelRadLDwFlux ! 地表面フラックス ! Surface flux ! select case ( IDSfcFluxMethod ) case ( IDSfcFluxMethodL82 ) call SurfaceFlux( 'L82', xyz_UB, xyz_VB, xyz_TempB, xyr_Temp, xyz_VirTemp, xyr_VirTemp, xy_SurfVirTemp, xyzf_QMixB, xyr_Press, xy_SurfHeight, xyz_Height, xyz_Exner, xyr_Exner, xy_SurfTemp, xy_SurfHumidCoef, xy_SurfRoughLenMom, xy_SurfRoughLenHeat, xy_SnowFrac, xy_SurfMomFluxX, xy_SurfMomFluxY, xy_SurfHeatFlux, xyf_SurfQMixFlux, xy_SurfVelTransCoef, xy_SurfTempTransCoef, xy_SurfQVapTransCoef, xy_SurfMOLength ) case ( IDSfcFluxMethodBH91B94 ) call SurfaceFlux( 'BH91B94', xyz_UB, xyz_VB, xyz_TempB, xyr_Temp, xyz_VirTemp, xyr_VirTemp, xy_SurfVirTemp, xyzf_QMixB, xyr_Press, xy_SurfHeight, xyz_Height, xyz_Exner, xyr_Exner, xy_SurfTemp, xy_SurfHumidCoef, xy_SurfRoughLenMom, xy_SurfRoughLenHeat, xy_SnowFrac, xy_SurfMomFluxX, xy_SurfMomFluxY, xy_SurfHeatFlux, xyf_SurfQMixFlux, xy_SurfVelTransCoef, xy_SurfTempTransCoef, xy_SurfQVapTransCoef, xy_SurfMOLength ) end select ! ! set dust flux ! This is ad hoc treatment now (yot, 2013/09/28) ! !!$ if ( CompositionInqIndex('QDust') > 0 ) then !!$ call SetDustFlux( & !!$ & xyf_SurfQMixFlux(:,:,CompositionInqIndex('QDust')) & ! (out) !!$ & ) !!$ end if ! 鉛直拡散フラックス ! Vertical diffusion flux ! select case ( IDVDiffMethod ) case ( IDVDiffMethodMY2 ) call VDiffusion( xyz_UB, xyz_VB, xyzf_QMixB, xyz_TempB, xyr_Temp, xyz_VirTemp, xyr_VirTemp, xyr_Press, xy_SurfHeight, xyz_Height, xyr_Height, xyz_Exner, xyr_Exner, xyr_MomFluxX, xyr_MomFluxY, xyr_HeatFlux, xyrf_QMixFlux, xyr_VelDiffCoef, xyr_TempDiffCoef, xyr_QMixDiffCoef ) case ( IDVDiffMethodMY25 ) if ( IndexTKE <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexTKE))//' is not found.' ) end if call VDiffusionMY25( xyz_UB, xyz_VB, xyzf_QMixB, xyz_TempB, xyr_Temp, xyz_VirTemp, xyr_VirTemp, xyr_Press, xy_SurfHeight, xyz_Height, xyr_Height, xyz_Exner, xyr_Exner, xyzf_QMixB(:,:,:,IndexTKE), xy_SurfMomFluxX, xy_SurfMomFluxY, xyr_MomFluxX, xyr_MomFluxY, xyr_HeatFlux, xyrf_QMixFlux, xyr_VelDiffCoef, xyr_TempDiffCoef, xyr_QMixDiffCoef, xyz_DTurKinEneDt ) case ( IDVDiffMethodJMA ) if ( IndexTKE <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexTKE))//' is not found.' ) end if ! JMA 乱流混合モジュール ! JMA turbulent mixing module ! call VDiffusionJMAMYWrapper3D( xyz_UB, xyz_VB, xyzf_QMixB, xyz_TempB, xyr_Temp, xyz_VirTemp, xyr_VirTemp, xyz_Press, xyr_Press, xy_SurfHeight, xyz_Height, xyr_Height, xyz_Exner, xyr_Exner, xy_SurfMOLength, xyzf_QMixB(:,:,:,IndexTKE), xy_SurfMomFluxX, xy_SurfMomFluxY, xy_SurfHeatFlux, xyf_SurfQMixFlux, xyr_MomFluxX, xyr_MomFluxY, xyr_HeatFlux, xyrf_QMixFlux, xyr_VelDiffCoef, xyr_TempDiffCoef, xyr_QMixDiffCoef, xyz_DTurKinEneDt ) end select xyr_MomFluxX (:,:,0) = xy_SurfMomFluxX xyr_MomFluxY (:,:,0) = xy_SurfMomFluxY xyr_HeatFlux (:,:,0) = xy_SurfHeatFlux xyrf_QMixFlux(:,:,0,:) = xyf_SurfQMixFlux ! 一部の物理過程の時間変化率の計算 (陰解法) ! Calculate tendency by a part of physical processes (implicit) ! select case ( IDPhyTendMethod ) case ( IDPhyTendMethodImp1LayModel ) call PhyImplTendency( xyr_MomFluxX, xyr_MomFluxY, xyr_HeatFlux, xyrf_QMixFlux, xyr_RadSFlux, xyr_RadLFlux, xy_DeepSubSurfHeatFlux, xy_SurfTemp, xy_SurfHumidCoef, xy_SurfCond, xy_SurfHeatCapacity, xyra_DelRadLFlux, xyr_Press, xyz_Exner, xyr_Exner, xyr_VirTemp, xyz_Height, xyr_VelDiffCoef, xyr_TempDiffCoef, xyr_QMixDiffCoef, xy_SurfVelTransCoef, xy_SurfTempTransCoef, xy_SurfQVapTransCoef, xyz_DUDt, xyz_DVDt, xyz_DTempDtVDiff, xyzf_DQMixDt, xy_DSurfTempDt ) xy_SurfH2OVapFluxA = 0.0_DP xy_SurfLatentHeatFluxA = 0.0_DP xyz_DSoilTempDt = 0.0_DP xy_DPsDt = 0.0_DP xy_DSurfMajCompIceDt = 0.0_DP xy_DSoilMoistDt = 0.0_DP xy_DSurfSnowDt = 0.0_DP case ( IDPhyTendMethodImpSoilModel ) ! 地下における熱の鉛直拡散 ! Vertical diffusion of heat under the ground ! !!$ call SubsurfaceDiffusionFlagLandMatthews( & !!$ & xy_SurfType, & ! (in) !!$ & xy_FlagMatthewsLand & ! (out) !!$ & ) call SubsurfaceDiffusion( xy_DeepSubSurfHeatFlux, xy_SoilHeatCap, xy_SoilHeatDiffCoef, xy_SurfTemp, xyz_SoilTemp, xy_SurfSnowB, xyr_SoilTempTransCoef, xyr_SoilHeatFlux ) ! This value is not correct, if snow evaporates. ! If a bucket model is used, this surface latent heat flux is ! corrected in BucketModEvapAndLatentHeatFlux by the use of surface ! moisture and surface snow amount. ! !!$ xy_SurfLatentHeatFluxA = LatentHeat * xyrf_QMixFlux(:,:,0,IndexH2OVap) !!$ select case ( IDSfcMoistMethod ) !!$ case ( IDSfcMoistMethodBucket ) !!$ ! バケツモデルのための地表面フラックス修正 !!$ ! Modification of surface flux for bucket model !!$ ! !!$ call BucketSetFlagOceanFromMatthews( & !!$ & xy_SurfType, & ! (in) !!$ & xy_BucketFlagOceanGrid & ! (out) !!$ & ) !!$ call BucketModEvapAndLatentHeatFlux( & !!$ & xy_BucketFlagOceanGrid, xy_SoilMoistB, xy_SurfSnowB, & ! (in ) !!$ & xyrf_QMixFlux(:,:,0,IndexH2OVap), xy_SurfLatentHeatFluxA & ! (inout) !!$ & ) !!$ end select !!$ call PhyImplSDHSetMethodFromMatthews( & !!$ & xy_SurfType, xy_SeaIceConc, & ! (in) !!$ & xy_PhyImplSDHIndexCalcMethod & ! (out) !!$ & ) !!$ call PhyImplSDHTendency( & !!$ & xy_PhyImplSDHIndexCalcMethod, & ! (in) !!$ & xyr_MomFluxX, xyr_MomFluxY, xyr_HeatFlux, xyrf_QMixFlux, & ! (in) !!$ & xy_SurfLatentHeatFluxA, & ! (in) !!$ & xyr_SoilHeatFlux, & ! (in) !!$ & xyr_RadSFlux, xyr_RadLFlux, & ! (in) !!$ & xy_DeepSubSurfHeatFlux, & ! (in) !!$ & xy_SurfTemp, xyz_SoilTemp, & ! (in) !!$ & xy_SurfHumidCoef, & ! (in) !!$ & xy_SurfHeatCapacity, & ! (in) !!$ & xy_SoilHeatCap, xy_SoilHeatDiffCoef, & ! (in) !!$ & xyra_DelRadLFlux, & ! (in) !!$ & xyr_Press, xyz_Exner, xyr_Exner, & ! (in) !!$ & xyr_VelTransCoef, xyr_TempTransCoef, & ! (in) !!$ & xyr_QMixTransCoef, & ! (in) !!$ & xy_SurfVelTransCoef, xy_SurfTempTransCoef, & ! (in) !!$ & xy_SurfQVapTransCoef, & ! (in) !!$ & xyr_SoilTempTransCoef, & ! (in) !!$ & xy_SurfMajCompIceB, & ! (in) !!$ & xy_SurfSnowB, & ! (in) !!$ & xyz_DUDt, xyz_DVDt, xyz_DTempDtVDiff, xyzf_DQMixDt, & ! (out) !!$ & xy_DSurfTempDt, & ! (out) !!$ & xyz_DSoilTempDt, & ! (out) !!$ & xy_DPsDt, xy_DSurfMajCompIceDt, & ! (out) !!$ & xy_DSoilMoistDt, & ! (out) !!$ & xy_DSurfSnowDt & ! (out) !!$ & ) !!$ ! This is temporal treatment. !!$ xy_SurfH2OVapFluxA = xyrf_QMixFlux(:,:,0,IndexH2OVap) !!$ call PhyImplSDHV2SetMethodMatthews( & !!$ & xy_SurfType, xy_SeaIceConc, & ! (in) !!$ & xy_PhyImplSDHIndexCalcMethod & ! (out) !!$ & ) !!$ select case ( IDSfcMoistMethod ) !!$ case ( IDSfcMoistMethodBucket ) !!$ call BucketSetFlagOceanFromMatthews( & !!$ & xy_SurfType, & ! (in) !!$ & xy_BucketFlagOceanGrid & ! (out) !!$ & ) !!$ case default !!$ xy_BucketFlagOceanGrid = .true. !!$ end select !!$ call PhyImplSDHV2Tendency( & !!$ & xy_PhyImplSDHIndexCalcMethod, xy_BucketFlagOceanGrid, & ! (in) !!$ & xy_SnowFrac, & ! (in) !!$ & xyr_MomFluxX, xyr_MomFluxY, xyr_HeatFlux, xyrf_QMixFlux, & ! (in) !!$ & xy_SurfH2OVapFluxA, xy_SurfLatentHeatFluxA, & ! (out) !!$ & xyr_SoilHeatFlux, & ! (in) !!$ & xyr_RadSFlux, xyr_RadLFlux, & ! (in) !!$ & xy_DeepSubSurfHeatFlux, & ! (in) !!$ & xyz_TempB, xy_SurfTemp, xyz_SoilTemp, & ! (in) !!$ & xyzf_QMixB, & ! (in) !!$ & xy_SurfHumidCoef, & ! (in) !!$ & xy_SurfHeatCapacity, & ! (in) !!$ & xy_SoilHeatCap, xy_SoilHeatDiffCoef, & ! (in) !!$ & xyra_DelRadLFlux, & ! (in) !!$ & xyr_Press, xyz_Exner, xyr_Exner, & ! (in) !!$ & xyr_VirTemp, xyz_Height, & ! (in) !!$ & xyr_VelDiffCoef, xyr_TempDiffCoef, xyr_QMixDiffCoef, & ! (in) !!$ & xy_SurfVelTransCoef, xy_SurfTempTransCoef, & ! (in) !!$ & xy_SurfQVapTransCoef, & ! (in) !!$ & xyr_SoilTempTransCoef, & ! (in) !!$ & xy_SurfMajCompIceB, & ! (in) !!$ & xy_SoilMoistB, xy_SurfSnowB, & ! (in) !!$ & xyz_DUDt, xyz_DVDt, xyz_DTempDtVDiff, xyzf_DQMixDt, & ! (out) !!$ & xy_DSurfTempDt, & ! (out) !!$ & xyz_DSoilTempDt, & ! (out) !!$ & xy_DPsDt, xy_DSurfMajCompIceDt, & ! (out) !!$ & xy_DSoilMoistDt, & ! (out) !!$ & xy_DSurfSnowDt & ! (out) !!$ & ) call PhyImplSDHV3SetMethodMatthews( xy_SurfCond, xy_SurfType, xy_SeaIceConc, xy_PhyImplSDHIndexCalcMethod ) select case ( IDSfcMoistMethod ) case ( IDSfcMoistMethodBucket ) call BucketSetFlagOceanFromMatthews( xy_SurfType, xy_BucketFlagOceanGrid ) case default xy_BucketFlagOceanGrid = .true. end select call PhyImplSDHV3Tendency( xy_PhyImplSDHIndexCalcMethod, xy_BucketFlagOceanGrid, xy_SnowFrac, xyr_MomFluxX, xyr_MomFluxY, xyr_HeatFlux, xyrf_QMixFlux, xy_SurfH2OVapFluxA, xy_SurfLatentHeatFluxA, xyr_SoilHeatFlux, xyr_RadSFlux, xyr_RadLFlux, xy_DeepSubSurfHeatFlux, xyz_TempB, xy_SurfTemp, xyz_SoilTemp, xyzf_QMixB, xy_SurfHumidCoef, xy_SoilHeatCap, xy_SoilHeatDiffCoef, xyra_DelRadLFlux, xyr_Press, xyz_Exner, xyr_Exner, xyr_VirTemp, xyz_Height, xyr_VelDiffCoef, xyr_TempDiffCoef, xyr_QMixDiffCoef, xy_SurfVelTransCoef, xy_SurfTempTransCoef, xy_SurfQVapTransCoef, xyr_SoilTempTransCoef, xy_SurfMajCompIceB, xy_SoilMoistB, xy_SurfSnowB, xyz_DUDt, xyz_DVDt, xyz_DTempDtVDiff, xyzf_DQMixDt, xy_DSurfTempDt, xyz_DSoilTempDt, xy_DPsDt, xy_DSurfMajCompIceDt, xy_DSoilMoistDt, xy_DSurfSnowDt ) case ( IDPhyTendMethodImpAtmOnly ) call PhyImplAtmOnlyTendency( xyr_MomFluxX, xyr_MomFluxY, xyr_HeatFlux, xyrf_QMixFlux, xyr_Press, xyz_Exner, xyr_Exner, xyr_VirTemp, xyz_Height, xyr_VelDiffCoef, xyr_TempDiffCoef, xyr_QMixDiffCoef, xy_SurfVelTransCoef, xy_SurfTempTransCoef, xy_SurfQVapTransCoef, xyz_DUDt, xyz_DVDt, xyz_DTempDtVDiff, xyzf_DQMixDt ) xy_DSurfTempDt = 0.0_DP xyz_DSoilTempDt = 0.0_DP xy_DPsDt = 0.0_DP xy_DSurfMajCompIceDt = 0.0_DP xy_DSoilMoistDt = 0.0_DP xy_DSurfSnowDt = 0.0_DP xy_SurfH2OVapFluxA = 0.0_DP xy_SurfLatentHeatFluxA = 0.0_DP end select ! Overwrite tendency of turbulent kinetic energy ! select case ( IDVDiffMethod ) case ( IDVDiffMethodMY25, IDVDiffMethodJMA ) if ( IndexTKE <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexTKE))//' is not found.' ) end if xyzf_DQMixDt(:,:,:,IndexTKE) = xyz_DTurKinEneDt end select ! Gravity wave drag ! Gravity wave drag ! select case ( IDGWDMethod ) case ( IDGWDMethodNone ) xyz_DUDtGWD = 0.0_DP xyz_DVDtGWD = 0.0_DP case ( IDGWDMethodM1987 ) ! Gravity wave drag by McFarlane (1987) ! Gravity wave drag by McFarlane (1987) ! call GWDM1987( xyz_UB, xyz_VB, xyz_TempB, xyz_Press, xyr_Press, xyz_Exner, xyz_Height, xy_SurfHeight, xy_SurfHeightStd, xyz_DUDtGWD, xyz_DVDtGWD ) xyz_DUDt = xyz_DUDt + xyz_DUDtGWD xyz_DVDt = xyz_DVDt + xyz_DVDtGWD end select ! 陰解法で解いた地表面熱収支と整合的な $ t+\Delta t $ における長波 ! フラックスの計算 ! * ここで計算された値が直接次のステップ $ t $ における長波フラックス ! として ! * 用いられるわけではない ! * 現在の時間ステップにおける長波放射加熱率の計算に使われる ! ! Evaluate longwave flux at $ t+\Delta t $ consistent with surface ! energy balance solved with implicit method ! * The evaluated value is not used directly as Longwave flux at next ! step $t$. ! * The evaluated value is used to calculate long wave radiative ! heating rate ! in the current time step. ! call PhyImplEvalRadLFluxA( xyr_RadLFlux, xyz_DTempDtVDiff, xy_DSurfTempDt, xyra_DelRadLFlux, xyr_RadLFluxA ) ! (out) ! 放射による温度変化率 ! Temperature tendency with radiation ! call RadDTempDt( xyr_RadLFluxA, xyr_RadSFlux, xyr_Press, xyz_DTempDtRadL, xyz_DTempDtRadS ) ! (out) !!$ select case ( IDRadMethod ) !!$ case ( IDRadMethodMarsV1 ) !!$ ! (火星大気向け) Non-LTE 放射モデル !!$ ! Non-NLTE radiation model (for the Mars' atmosphere) !!$ ! !!$ call rad15mNLTEMergeHR( & !!$ & xyz_Press, xyz_TempB, xyz_VirTemp, & !!$ & xyz_DTempDtRadL & !!$ & ) !!$ end select ! 非断熱加熱率の総和の計算 ! Sum all diabatic heating rates ! xyz_DTempDt = xyz_DTempDtVDiff + xyz_DTempDtRadL + xyz_DTempDtRadS select case ( IDRadMethod ) case ( IDRadMethodMarsV1 ) ! 火星計算用近赤外加熱率計算 ! Calculation of near infrared heating rate in the case of Mars ! call RadMarsNIRINOUT( xyz_Press, xyz_DTempDt ) end select ! 鉛直拡散フラックスの出力 ! * 出力のみのサブルーチンであり, 計算には影響しない ! ! Output Vertical diffusion fluxes ! * This subroutine works for output only, ! so it does not influence a calculation. ! call VDiffusionOutput( xyr_MomFluxX, xyr_MomFluxY, xyr_HeatFlux, xyrf_QMixFlux, xyz_DUDt, xyz_DVDt, xyz_DTempDtVDiff, xyzf_DQMixDt, xyr_Press, xyz_Exner, xyr_Exner, xyr_VirTemp, xyz_Height, xyr_VelDiffCoef, xyr_TempDiffCoef, xyr_QMixDiffCoef ) ! 地表面フラックスの出力 ! * 出力のみのサブルーチンであり, 計算には影響しない ! ! Output surface fluxes ! * This subroutine works for output only, ! so it does not influence a calculation. ! call SurfaceFluxOutput( xy_SnowFrac, xyr_MomFluxX, xyr_MomFluxY, xyr_HeatFlux, xyrf_QMixFlux, xy_SurfH2OVapFluxA, xy_SurfLatentHeatFluxA, xyz_DUDt, xyz_DVDt, xyz_DTempDtVDiff, xyzf_DQMixDt, xy_SurfTemp, xy_DSurfTempDt, xyr_Press, xyz_Exner, xyr_Exner, xy_SurfHumidCoef, xy_SurfVelTransCoef, xy_SurfTempTransCoef, xy_SurfQVapTransCoef ) ! 放射フラックスの出力 ! * 出力のみのサブルーチンであり, 計算には影響しない ! ! Output radiation fluxes ! * This subroutine works for output only, ! so it does not influence a calculation. ! call RadFluxOutput( xyr_RadSUwFlux, xyr_RadSDwFlux, xyr_RadLUwFlux, xyr_RadLDwFlux, xyra_DelRadLUwFlux, xyra_DelRadLDwFlux, xy_DSurfTempDt, xyz_DTempDtVDiff ) end select ! 力学過程 ! Dynamical core ! select case ( IDDynMode ) case ( IDDynModeHSPLVAS83 ) call DynamicsHSplVAS83( xyz_UB, xyz_VB, xyz_TempB, xyzf_QMixB, xy_PsB, xyz_UN, xyz_VN, xyz_TempN, xyzf_QMixN, xy_PsN, xyz_DUDt, xyz_DVDt, xyz_DTempDt, xyzf_DQMixDt, xy_SurfHeight, xyz_UA, xyz_VA, xyz_TempA, xyzf_QMixA, xy_PsA, xyz_ArgOMG = xyz_OMG ) case ( IDDynModeNoHorAdv ) call DynamicsPhysicsOnly( xyz_Exner, xy_SurfHeight, xyz_Height, xyz_DUDt, xyz_DVDt, xyz_DTempDt, xyzf_DQMixDt, xy_PsB, xyz_UB, xyz_VB, xyz_TempB, xyzf_QMixB, xy_PsN, xyz_UN, xyz_VN, xyz_TempN, xyzf_QMixN, xy_PsA, xyz_UA, xyz_VA, xyz_TempA, xyzf_QMixA ) xyz_OMG = 0.0_DP case ( IDDynModeTWPICE ) ! ! Dynamical process for TWP-ICE experiment ! call DynamicsTWPICESCMExp( TimeN, xyz_Press, xyz_Exner, xyz_Height, xyz_DUDt, xyz_DVDt, xyz_DTempDt, xyzf_DQMixDt, xy_PsB, xyz_UB, xyz_VB, xyz_TempB, xyzf_QMixB, xy_PsA, xyz_UA, xyz_VA, xyz_TempA, xyzf_QMixA ) xyz_OMG = 0.0_DP end select ! 地面温度・土壌温度・土壌水分・積雪量の積分 ! Time integration of surface temperature, soil temperature, soil ! moisture, and surface snow amount ! select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) ! 地面温度・土壌温度の時間積分 ! Time integration of surface temperature and soil temperature ! call IntegralSurfTemp( xy_DSurfTempDt, xyz_DSoilTempDt, xy_SurfTemp , xyz_SoilTemp ) select case ( IDSfcMoistMethod ) case ( IDSfcMoistMethodNone ) xy_SoilMoistA = xy_SoilMoistB xy_SurfSnowA = xy_SurfSnowB case ( IDSfcMoistMethodBucket ) ! 土壌水分・地面積雪量の時間積分 ! Time integration of soil moisture and snow amount ! call BucketSetFlagOceanFromMatthews( xy_SurfType, xy_BucketFlagOceanGrid ) call BucketIntegration( xy_BucketFlagOceanGrid, xy_DSoilMoistDt, xy_DSurfSnowDt, xy_SoilMoistB, xy_SurfSnowB, xy_SoilMoistA, xy_SurfSnowA ) end select xy_SurfMajCompIceA = xy_SurfMajCompIceB !!$ call MajorCompPhaseChangeOnGround( & !!$ & xy_DPsDt, xy_DSurfMajCompIceDt, & ! (in) !!$ & xy_PsA, xyzf_QMixA, xy_SurfMajCompIceA & ! (inout) !!$ & ) call MajorCompPhaseChangeOnGround( xy_DPsDt, xy_DSurfMajCompIceDt, xy_PsA, xyzf_QMixA, xyz_UA, xyz_VA, xy_SurfMajCompIceA ) case default !!$ xy_SurfMajCompIceA = xy_SurfMajCompIceB + xy_DSurfMajCompIceDt * ( 2.0_DP * DelTime ) !!$ xy_SurfMajCompIceA = xy_SurfMajCompIceA + xy_DSurfMajCompIceDt * ( 2.0_DP * DelTime ) ! ! Surface pressure is adjusted, here. ! xy_PsA = xy_PsA + xy_DPsDt * ( 2.0_DP * DelTime ) end select select case ( IDPhysMode ) case ( IDPhysModeJupiterSimple ) ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! call AuxVars( xy_PsA, xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyz_Press = xyz_Press, xyr_Press = xyr_Press ) select case ( IDDCMethod ) case ( IDDCMethodDCA ) ! 乾燥対流調節 ! Dry convective adjustment ! call DryConvAdjust( xyz_TempA, xyz_UA, xyz_VA, xyzf_QMixA, xyz_Press, xyr_Press ) end select case ( IDPhysModeJupiterSimpleV2 ) ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! call AuxVars( xy_PsA, xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyz_Press = xyz_Press, xyr_Press = xyr_Press ) ! 湿潤対流調節 ! Moist convective adjustment ! call MoistConvAdjust( xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyz_Press, xyr_Press, xyz_DQH2OLiqDtCum ) ! 大規模凝結 (非対流性凝結) (Manabe, 1965) ! Large scale condensation (non-convective condensation) ! (Manabe, 1965) ! call LScaleCond( xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyz_Press, xyr_Press, xyz_DQH2OLiqDtLSC ) call CloudSimpleCalcPRCPKeyLLTemp3D( xyr_Press, xyz_Press, xyz_DQH2OLiqDtCum, xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xy_RainCumulus, xy_SnowCumulus ) call CloudSimpleCalcPRCPKeyLLTemp3D( xyr_Press, xyz_Press, xyz_DQH2OLiqDtLsc, xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xy_RainLsc, xy_SnowLsc ) xy_Rain = xy_RainCumulus + xy_RainLsc xy_Snow = xy_SnowCumulus + xy_SnowLsc select case ( IDDCMethod ) case ( IDDCMethodDCA ) ! 乾燥対流調節 ! Dry convective adjustment ! call DryConvAdjust( xyz_TempA, xyz_UA, xyz_VA, xyzf_QMixA, xyz_Press, xyr_Press ) end select ! 成分の質量の補正 ! Fix masses of constituents ! call MassFixerColumn( xyr_Press, xyzf_QMixA ) case ( IDPhysModeFullPhysics ) ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! call AuxVars( xy_PsA, xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyr_Press = xyr_Press, xyz_Press = xyz_Press, xyz_Exner = xyz_Exner, xyr_Exner = xyr_Exner, xy_SurfHeight = xy_SurfHeight, xyr_Height = xyr_Height, xyz_Height = xyz_Height ) ! 積雲パラメタリゼーション ! Cumulus parameterization ! select case ( IDMCMethod ) case ( IDMCMethodNone ) xyz_DQH2OLiqDtCum = 0.0_DP xyz_DQH2OSolDtCum = 0.0_DP xyz_MoistConvDetTend = 0.0_DP xyz_MoistConvSubsidMassFlux = 0.0_DP xy_RainCumulus = 0.0_DP xy_SnowCumulus = 0.0_DP case ( IDMCMethodMCA ) if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if ! 湿潤対流調節 ! Moist convective adjustment ! call MoistConvAdjust( xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyz_Press, xyr_Press, xyz_DQH2OLiqDtCum ) ! It would be better that lines below are included in ! MoistConvAdjust subroutine. xyzf_QMixA(:,:,:,IndexH2OLiq) = xyzf_QMixA(:,:,:,IndexH2OLiq) + xyz_DQH2OLiqDtCum * 2.0_DP * DelTime xyz_DQH2OLiqDtCum = 0.0_DP xyz_DQH2OSolDtCum = 0.0_DP xyz_MoistConvDetTend = 0.0_DP xyz_MoistConvSubsidMassFlux = 0.0_DP xy_RainCumulus = 0.0_DP xy_SnowCumulus = 0.0_DP case ( IDMCMethodRAS ) if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if ! Relaxed Arakawa-Schubert scheme ! Relaxed Arakawa-Schubert scheme ! call RAS( xy_SurfTemp, xyz_Press, xyr_Press, xyz_Exner, xyr_Exner, xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyz_DQH2OLiqDtCum, xyz_MoistConvDetTend, xyz_MoistConvSubsidMassFlux ) ! It would be better that lines below are included in ! RAS subroutine. xyzf_QMixA(:,:,:,IndexH2OLiq) = xyzf_QMixA(:,:,:,IndexH2OLiq) + xyz_DQH2OLiqDtCum * 2.0_DP * DelTime xyz_DQH2OLiqDtCum = 0.0_DP xyz_DQH2OSolDtCum = 0.0_DP xy_RainCumulus = 0.0_DP xy_SnowCumulus = 0.0_DP case ( IDMCMethodRASWithIce ) ! Relaxed Arakawa-Schubert scheme ! Relaxed Arakawa-Schubert scheme ! if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if if ( IndexH2OSol <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OSol))//' is not found.' ) end if ! It should be noted that H2OLiq and H2OSol have updated. ! But, DQH2OLiqDtCum and DQH2OSolDtCum are not zero, so those ! will be set zero below. call RASWithIce1DWrapper3DWrapper( xy_SurfTemp, xyz_Press, xyr_Press, xyz_Exner, xyr_Exner, xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyzf_QMixA(:,:,:,IndexH2OLiq), xyzf_QMixA(:,:,:,IndexH2OSol), xyz_UA, xyz_VA, xyz_DTempDtCum, xyz_DQVapDtCum, xyz_DQH2OLiqDtCum, xyz_DQH2OSolDtCum, xyz_DUDtCum, xyz_DVDtCum, xy_RainCumulus, xy_SnowCumulus, xyz_MoistConvDetTend, xyz_MoistConvSubsidMassFlux ) xyz_TempA = xyz_TempA + xyz_DTempDtCum * ( 2.0_DP * DelTime ) xyzf_QMixA(:,:,:,IndexH2OVap) = xyzf_QMixA(:,:,:,IndexH2OVap) + xyz_DQVapDtCum * ( 2.0_DP * DelTime ) xyzf_QMixA(:,:,:,IndexH2OLiq) = xyzf_QMixA(:,:,:,IndexH2OLiq) + xyz_DQH2OLiqDtCum * ( 2.0_DP * DelTime ) xyzf_QMixA(:,:,:,IndexH2OSol) = xyzf_QMixA(:,:,:,IndexH2OSol) + xyz_DQH2OSolDtCum * ( 2.0_DP * DelTime ) xyz_UA = xyz_UA + xyz_DUDtCum * ( 2.0_DP * DelTime ) xyz_VA = xyz_VA + xyz_DVDtCum * ( 2.0_DP * DelTime ) ! 成分の質量の補正 ! Fix masses of constituents ! call MassFixerColumn( xyr_Press, xyzf_QMixA ) xyz_DTempDtCum = 0.0_DP xyz_DQVapDtCum = 0.0_DP xyz_DQH2OLiqDtCum = 0.0_DP xyz_DQH2OSolDtCum = 0.0_DP xyz_DUDtCum = 0.0_DP xyz_DVDtCum = 0.0_DP end select ! 大規模凝結 (非対流性凝結) ! Large scale condensation ! select case ( IDLSCMethod ) case ( IDLSCMethodNone ) xyz_DQH2OLiqDtLSC = 0.0_DP xyz_DQH2OSolDtLSC = 0.0_DP case ( IDLSCMethodM65 ) ! 大規模凝結 (非対流性凝結) (Manabe, 1965) ! Large scale condensation (non-convective condensation) ! (Manabe, 1965) ! call LScaleCond( xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyz_Press, xyr_Press, xyz_DQH2OLiqDtLSC ) ! It would be better that lines below are included in LScaleCond ! subroutine. if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if xyzf_QMixA(:,:,:,IndexH2OLiq) = xyzf_QMixA(:,:,:,IndexH2OLiq) + xyz_DQH2OLiqDtLSC * 2.0_DP * DelTime xyz_DQH2OLiqDtLSC = 0.0_DP xyz_DQH2OSolDtLSC = 0.0_DP !!$ case ( IDLSCMethodLL91 ) !!$ ! 大規模凝結 (非対流性凝結) (Le Treut and Li, 1991) !!$ ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) !!$ ! !!$ call LScaleCondLL91( & !!$ & xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), & ! (inout) !!$ & xyz_DTempDtCond, xyz_DQVapDtCond, & ! (inout) !!$ & xyz_Press, xyr_Press, & ! (in) !!$ & xyz_DQH2OLiqDtLSC & ! (out) !!$ & ) case ( IDLSCMethodSatAdjM65 ) ! != Saturation adjustment ! if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if call SaturationAdjust( xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyzf_QMixA(:,:,:,IndexH2OLiq), xyz_Press, xyr_Press, xyz_DQH2OLiqDtLSC ) case ( IDLSCMethodM65WithIce ) if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if if ( IndexH2OSol <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OSol))//' is not found.' ) end if ! 大規模凝結 (非対流性凝結) (Manabe, 1965) ! Large scale condensation (non-convective condensation) ! (Manabe, 1965) ! ! It should be noted that H2OLiq and H2OSol have updated in above ! subroutine. call LScaleCond1D3DWrapper( xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyzf_QMixA(:,:,:,IndexH2OLiq), xyzf_QMixA(:,:,:,IndexH2OSol), xyz_Press, xyr_Press, xyz_DQH2OLiqDtLSC, xyz_DQH2OSolDtLSC ) ! Temporal treatment xyz_DQH2OLiqDtLSC = 0.0_DP xyz_DQH2OSolDtLSC = 0.0_DP case ( IDLSCMethodLL91WithIce ) if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if if ( IndexH2OSol <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OSol))//' is not found.' ) end if ! 大規模凝結 (非対流性凝結) (Le Treut and Li, 1991) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! ! It should be noted that H2OLiq and H2OSol have updated in above ! subroutine. call LScaleCondLL911D3DWrapper( xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyzf_QMixA(:,:,:,IndexH2OLiq), xyzf_QMixA(:,:,:,IndexH2OSol), xyz_Press, xyr_Press, xyz_DQH2OLiqDtLSC, xyz_DQH2OSolDtLSC ) ! Temporal treatment xyz_DQH2OLiqDtLSC = 0.0_DP xyz_DQH2OSolDtLSC = 0.0_DP end select ! ! Cloud model ! select case ( IDCloudMethod ) case ( IDCloudMethodNone ) ! 雲なしモデル ! No cloud model ! if ( IndexH2OSol <= 0 ) then if ( IndexH2OLiq <= 0 ) then xy_RainLsc = 0.0_DP xy_SnowLsc = 0.0_DP else call CloudNone( xyr_Press, xyz_Press, xyzf_QMixA(:,:,:,IndexH2OLiq) / ( 2.0_DP * DelTime ), xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xy_RainLsc ) xyzf_QMixA(:,:,:,IndexH2OLiq) = 0.0_DP xy_SnowLsc = 0.0_DP end if else call CloudNoneWithIce( xyr_Press, xyz_Press, xyzf_QMixA(:,:,:,IndexH2OLiq) / ( 2.0_DP * DelTime ), xyzf_QMixA(:,:,:,IndexH2OSol) / ( 2.0_DP * DelTime ), xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xy_RainLsc, xy_SnowLsc ) xyzf_QMixA(:,:,:,IndexH2OLiq) = 0.0_DP xyzf_QMixA(:,:,:,IndexH2OSol) = 0.0_DP end if case ( IDCloudMethodSimple ) if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if ! Update cloud water ! call CloudSimple( xyr_Press, xyz_Press, xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyzf_QMixA(:,:,:,IndexH2OLiq), xy_RainLsc, xy_SnowLsc ) case ( IDCloudMethodSimpleWithIce ) if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if if ( IndexH2OSol <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OSol))//' is not found.' ) end if ! Update cloud water ! call CloudSimpleWithIce( xyr_Press, xyz_Press, xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyzf_QMixA(:,:,:,IndexH2OLiq), xyzf_QMixA(:,:,:,IndexH2OSol), xy_RainLsc, xy_SnowLsc ) !!$ call PhyImplSDHV2SetMethodMatthews( & !!$ & xy_SurfType, xy_SeaIceConc, & ! (in) !!$ & xy_PhyImplSDHIndexCalcMethod & ! (out) !!$ & ) !!$ call PhyImplSDHV2CorSOTempBySnowMelt( & !!$ & xy_PhyImplSDHIndexCalcMethod, & ! (in ) !!$ & xy_Snow, & ! (in ) !!$ & xy_SurfTemp & ! (inout) !!$ & ) case ( IDCloudMethodT1993WithIce ) if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if if ( IndexH2OSol <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OSol))//' is not found.' ) end if if ( CompositionInqIndex( 'CloudCover' ) <= 0 ) then call MessageNotify( 'E', prog_name, 'CloudCover is not found.' ) end if ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! call AuxVars( xy_PsA, xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyr_Press = xyr_Press, xyz_Press = xyz_Press, xyz_VirTemp = xyz_VirTemp ) ! Tiedtke (1993) に基づく雲モデル ! Cloud model based on Tiedtke (1993) ! call CloudT1993baseWithIce( xyz_Press, xyr_Press, xyz_VirTemp, xyz_DQH2OLiqDtCum, xyz_DQH2OSolDtCum, xyz_MoistConvDetTend, xyz_OMG, xyz_MoistConvSubsidMassFlux, xyz_DTempDt, xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyzf_QMixA(:,:,:,IndexH2OLiq), xyzf_QMixA(:,:,:,IndexH2OSol), xyzf_QMixA(:,:,:,CompositionInqIndex('CloudCover')), xy_RainLsc, xy_SnowLsc ) case ( IDCloudMethodMarsH2OCloud ) if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! call AuxVars( xy_PsA, xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyz_VirTemp = xyz_VirTemp, xyr_Press = xyr_Press, xy_SurfHeight = xy_SurfHeight, xyr_Height = xyr_Height ) ! 火星 H2O 雲モデル ! Mars H2O cloud model ! call CloudMarsH2O( xyr_Press, xyz_VirTemp, xyr_Height, xyz_DQH2OSolDtCum, xyz_DQH2OSolDtLSC, xyzf_QMixA(:,:,:,IndexH2OSol), xy_RainLsc, xy_SnowLsc ) end select ! Sum of cumulus and non-convective (large scale) condensation xy_Rain = xy_RainCumulus + xy_RainLsc xy_Snow = xy_SnowCumulus + xy_SnowLsc select case ( IDSfcMoistMethod ) case ( IDSfcMoistMethodBucket ) ! バケツモデル, 降水に伴う地表水量変化の計算 ! bucket model, calculation of change of surface water due to ! precipitation ! call BucketSetFlagOceanFromMatthews( xy_SurfType, xy_BucketFlagOceanGrid ) call BucketPRCPAdjust( xy_BucketFlagOceanGrid, xy_Rain, xy_Snow, xy_SoilMoistA, xy_SurfSnowA ) end select select case ( IDDCMethod ) case ( IDDCMethodDCA ) ! 乾燥対流調節 ! Dry convective adjustment ! call DryConvAdjust( xyz_TempA, xyz_UA, xyz_VA, xyzf_QMixA, xyz_Press, xyr_Press ) end select ! 重力沈降過程 ! Gravitational sedimentation process ! if ( CompositionInqIndex('QDust') > 0 ) then call GravSed( 'MarsDust', xyr_Press, xyz_VirTemp, xyr_Height, xyzf_QMixA(:,:,:,CompositionInqIndex('QDust')), xy_SurfDustGravSedFlux ) end if !!$ if ( IDPhysMode == IDPhysModeFullPhysics ) then ! 主成分相変化 ! Phase change of atmospheric major component ! !!$ call MajorCompPhaseChangeInAtm( & !!$ & xyr_Press, xyz_Press, & ! (in) !!$ & xy_PsA, xyz_TempA, xyzf_QMixA, xy_SurfMajCompIceA & ! (inout) !!$ & ) call MajorCompPhaseChangeInAtm( xyr_Press, xyz_Press, xy_PsA, xyz_TempA, xyzf_QMixA, xyz_UA, xyz_VA, xy_SurfMajCompIceA ) !!$ end if ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! call AuxVars( xy_PsA, xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyr_Press = xyr_Press ) ! 成分の質量の補正 ! Fix masses of constituents ! call MassFixerColumn( xyr_Press, xyzf_QMixA ) end select ! 時間フィルター (Asselin, 1972) ! Time filter (Asselin, 1972) ! !!$ if ( .not. flag_initial .or. .not. firstloop ) then !!$ call TimeFilter( & !!$ & xyz_UB, xyz_VB, xyz_TempB, xyzf_QMixB, xy_PsB, & ! (in) !!$ & xyz_UN, xyz_VN, xyz_TempN, xyzf_QMixN, xy_PsN, & ! (inout) !!$ & xyz_UA, xyz_VA, xyz_TempA, xyzf_QMixA, xy_PsA ) ! (in) !!$ !!$ select case ( IDPhysMode ) !!$ case ( IDPhysModeFullPhysics ) !!$ call TimeFilterSurfVars( & !!$ & xy_SurfMajCompIceB, xy_SoilMoistB, xy_SurfSnowB, & ! (in) !!$ & xy_SurfMajCompIceN, xy_SoilMoistN, xy_SurfSnowN, & ! (inout) !!$ & xy_SurfMajCompIceA, xy_SoilMoistA, xy_SurfSnowA & ! (in) !!$ & ) !!$ end select !!$ end if ! 時間フィルター (Williams, 2009) ! Time filter (Williams, 2009) ! if ( .not. flag_initial .or. .not. firstloop ) then call TimeFilterWilliams2009( xyz_UB, xyz_VB, xyz_TempB, xyzf_QMixB, xy_PsB, xyz_UN, xyz_VN, xyz_TempN, xyzf_QMixN, xy_PsN, xyz_UA, xyz_VA, xyz_TempA, xyzf_QMixA, xy_PsA ) select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) call TimeFilterWilliams2009SurfVars( xy_SurfMajCompIceB, xy_SoilMoistB, xy_SurfSnowB, xy_SurfMajCompIceN, xy_SoilMoistN, xy_SurfSnowN, xy_SurfMajCompIceA, xy_SoilMoistA, xy_SurfSnowA, xy_PsA ) end select end if ! 予報変数の値の確認 ! Check values of prognostic variables ! call CheckProgVars( xy_PsA, xyz_UA, xyz_VA, xyz_TempA, xyzf_QMixA ) ! ヒストリデータ出力 ! History data output ! call HistoryAutoPut( TimeA, 'U', xyz_UA ) call HistoryAutoPut( TimeA, 'V', xyz_VA ) call HistoryAutoPut( TimeA, 'Temp', xyz_TempA ) do n = 1, ncmax call HistoryAutoPut( TimeA, a_QMixName(n), xyzf_QMixA(:,:,:,n) ) end do ! Backward compatibility n = IndexH2OVap if ( a_QMixName(n) /= 'QVap' ) then call HistoryAutoPut( TimeA, 'QVap', xyzf_QMixA(:,:,:,n) ) end if call HistoryAutoPut( TimeA, 'Ps', xy_PsA ) ! Output frequently used variables ! Output frequently used variables ! call OutputFreqUsedVars( xy_PsA, xyz_TempA, xyzf_QMixA, xy_SurfHeight ) select case ( IDPhysMode ) case ( IDPhysModeJupiterSimpleV2 ) call HistoryAutoPut( TimeN, 'Rain', xy_Rain ) call HistoryAutoPut( TimeN, 'Snow', xy_Snow ) call HistoryAutoPut( TimeN, 'PRCP', xy_Rain + xy_Snow ) case ( IDPhysModeFullPhysics ) call HistoryAutoPut( TimeN, 'SurfTemp', xy_SurfTemp ) if ( size( xyz_SoilTemp ) /= 0 ) then call HistoryAutoPut( TimeN, 'SoilTemp', xyz_SoilTemp ) end if call HistoryAutoPut( TimeA, 'SurfMajCompIce', xy_SurfMajCompIceA ) call HistoryAutoPut( TimeA, 'SoilMoist' , xy_SoilMoistA ) call HistoryAutoPut( TimeA, 'SurfSnow' , xy_SurfSnowA ) !!$ call HistoryAutoPut( TimeN, 'Rain', xy_Rain * LatentHeat ) !!$ call HistoryAutoPut( TimeN, 'Rain', ( xy_Rain + xy_Snow ) * LatentHeat ) call HistoryAutoPut( TimeN, 'Rain', xy_Rain ) call HistoryAutoPut( TimeN, 'Snow', xy_Snow ) call HistoryAutoPut( TimeN, 'PRCP', xy_Rain + xy_Snow ) call HistoryAutoPut( TimeN, 'RainCum', xy_RainCumulus ) call HistoryAutoPut( TimeN, 'SnowCum', xy_SnowCumulus ) call HistoryAutoPut( TimeN, 'PRCPCum', xy_RainCumulus + xy_SnowCumulus ) call HistoryAutoPut( TimeN, 'RainLsc', xy_RainLsc ) call HistoryAutoPut( TimeN, 'SnowLsc', xy_SnowLsc ) call HistoryAutoPut( TimeN, 'PRCPLsc', xy_RainLsc + xy_SnowLsc ) call HistoryAutoPut( TimeN, 'SeaIceConc' , xy_SeaIceConc ) call HistoryAutoPut( TimeN, 'SurfAlbedo' , xy_SurfAlbedo ) call HistoryAutoPut( TimeN, 'SurfRoughLenMom' , xy_SurfRoughLenMom ) call HistoryAutoPut( TimeN, 'SurfRoughLenHeat', xy_SurfRoughLenHeat ) if ( CompositionInqIndex('QDust') > 0 ) then call HistoryAutoPut( TimeN, 'SurfDustGravSedFlux', xy_SurfDustGravSedFlux ) end if end select ! 次の時間ステップに向けて予報変数の入れ替え ! Exchange prediction variables for the next time step ! xyz_UB = xyz_UN xyz_UN = xyz_UA xyz_UA = 0. xyz_VB = xyz_VN xyz_VN = xyz_VA xyz_VA = 0. xyz_TempB = xyz_TempN xyz_TempN = xyz_TempA xyz_TempA = 0. xyzf_QMixB = xyzf_QMixN xyzf_QMixN = xyzf_QMixA xyzf_QMixA = 0. xy_PsB = xy_PsN xy_PsN = xy_PsA xy_PsA = 0. select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) xy_SurfMajCompIceB = xy_SurfMajCompIceN xy_SurfMajCompIceN = xy_SurfMajCompIceA xy_SurfMajCompIceA = 0.0_DP xy_SoilMoistB = xy_SoilMoistN xy_SoilMoistN = xy_SoilMoistA xy_SoilMoistA = 0.0_DP xy_SurfSnowB = xy_SurfSnowN xy_SurfSnowN = xy_SurfSnowA xy_SurfSnowA = 0.0_DP end select ! 時刻の進行 ! Progress time ! call TimesetProgress ! NAMELIST から読み込んだ変数名に無効なものが存在したかどうかをチェック ! HistoryAutoAddVariable で登録した変数名を印字 ! ! Check that invalid variable names are loaded from NAMELIST or not ! Print registered variable names by "HistoryAutoAddVariable" ! !!! if ( firstloop ) call HistoryAutoAllVarFix ! リスタートデータ出力 ! Restart data output ! call RestartFileOutput( xyz_UB, xyz_VB, xyz_TempB, xyzf_QMixB, xy_PsB, xyz_UN, xyz_VN, xyz_TempN, xyzf_QMixN, xy_PsN ) select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) ! 地表面温度リスタートデータ出力 ! Restart data of surface temperature output ! call RestartSurfTempOutput( xy_SurfTemp, xyz_SoilTemp, xy_SurfMajCompIceB, xy_SoilMoistB, xy_SurfSnowB, xy_SurfMajCompIceN, xy_SoilMoistN, xy_SurfSnowN ) end select firstloop = .false. ! 時間積分終了 ! Time integration is finished ! end do loop_time ! 主プログラムの終了処理 (内部サブルーチン) ! Termination for the main program (Internal subroutine) ! call MainTerminate contains !------------------------------------------------------------------- subroutine MainInit ! ! 主プログラムの初期化手続き. ! ! Initialization procedure for the main program. ! ! MPI ! use mpi_wrapper, only : MPIWrapperInit use dc_message, only: MessageNotify ! コマンドライン引数処理 ! Command line option parser ! use option_parser, only: OptParseInit ! NAMELIST ファイル入力に関するユーティリティ ! Utilities for NAMELIST file input ! use namelist_util, only: NmlutilInit, NmlutilMsg ! 時刻管理 ! Time control ! use timeset, only: TimesetInit, TimesetDelTimeHalf, TimeN ! ステップ $ t $ の時刻. Time of step $ t $. ! 出力ファイルの基本情報管理 ! Management basic information for output files ! use fileset, only: FilesetInit ! 格子点設定 ! Grid points settings ! use gridset, only: GridsetInit, imax, jmax, kmax, kslmax ! 地下の鉛直層数. ! Number of subsurface vertical level ! 組成に関わる配列の設定 ! Settings of array for atmospheric composition ! use composition, only: CompositionInit ! 物理定数設定 ! Physical constants settings ! use constants, only: ConstantsInit ! 雪と海氷の定数の設定 ! Setting constants of snow and sea ice ! use constants_snowseaice, only: ConstantsSnowSeaIceInit ! 座標データ設定 ! Axes data settings ! use axesset, only: AxessetInit ! リスタートデータ入出力 ! Restart data input/output ! use restart_file_io, only: RestartFileInit, RestartFileOpen, RestartFileGet ! 地表面温度リスタートデータ入出力 ! Restart data of surface temperature input/output ! use restart_surftemp_io, only: RestartSurfTempInit, RestartSurfTempOpen, RestartSurfTempGet ! ヒストリデータ出力 ! History data output ! use history_file_io, only: HistoryFileOpen use gtool_historyauto, only: HistoryAutoAddVariable, HistoryAutoPut ! 種別型パラメタ ! Kind type parameter ! use dc_types, only: STDOUT ! 標準出力の装置番号. Unit number of standard output ! ファイル入出力補助 ! File I/O support ! use dc_iounit, only: FileOpen ! 時系列データの読み込み ! Reading time series ! use read_time_series, only : ReadTimeSeriesInit ! 地表面データ提供 ! Prepare surface data ! use surface_data, only : SurfDataInit ! ファイルから 1 次元プロファイルを読んで設定する. ! read 1-D profile from a file and set it ! use set_1d_profile, only : Set1DProfileInit ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! use auxiliary, only : AuxVarsInit, AuxVars ! Held and Suarez (1994) による強制と散逸 ! Forcing and dissipation suggested by Held and Suarez (1994) ! use held_suarez_1994, only : HS94Init ! Yamamoto and Takahashi (2003) に従った簡単金星計算のための強制 ! forcing for simple Venus calculation following Yamamoto and Takahashi (2003) ! use yt2003_forcing, only : YT2003ForcingInit ! 惑星表面データの設定 ! Setting planetary surface properties ! use surface_properties, only : SurfacePropertiesInit ! 雪, 氷の割合 ! snow/ice fraction ! use snowice_frac, only : SnowIceFracInit ! 地下における熱の鉛直拡散 ! Vertical diffusion of heat under the ground ! use subsurface_diffusion_heat, only : SubsurfaceDiffusionInit ! 陰解法による時間積分 ! Time integration with implicit scheme ! use phy_implicit, only : PhyImplInit ! 地下熱伝導モデルを用いた場合の陰解法による時間積分 ! ! Time integration by using implicit scheme in case using subsurface thermal diffusion model use phy_implicit_sdh, only : PhyImplSDHInit !!$ ! 地下熱伝導モデルを用いた場合の陰解法による時間積分 !!$ ! !!$ ! Time integration by using implicit scheme in case using subsurface thermal diffusion model !!$ use phy_implicit_sdh_V2, only : PhyImplSDHV2Init ! 地下熱伝導モデルを用いた場合の陰解法による時間積分 ! ! Time integration by using implicit scheme in case using subsurface thermal diffusion model use phy_implicit_sdh_V3, only : PhyImplSDHV3Init ! 陰解法による時間積分 (大気のみ / 惑星表面温度・土壌温度計算なし) ! Time integration by using implicit scheme in case without calculation of surface and soil temperature ! use phy_implicit_atmonly, only : PhyImplAtmOnlyInit ! 陰解法による時間積分のためのルーチン ! Routines for time integration with implicit scheme ! use phy_implicit_utils, only : PhyImplUtilsInit ! バケツモデル ! Bucket model ! use Bucket_Model, only : BucketModelInit ! 放射フラックス (GFD 電脳倶楽部開発の放射モデル) ! Radiation flux (radiation model developed by GFD Dennou Club) ! use rad_DennouAGCM, only : RadDennouAGCMInit ! 地球大気向け放射モデル Ver. 2 ! radiation model for the Earth's atmosphere Ver. 2 ! use rad_Earth_V2, only : RadEarthV2Init ! wrapper of RRTMG ! wrapper of RRTMG ! use rad_rrtmg_wrapper, only : RadRRTMGWrapperInit ! 火星大気向け放射モデル Ver. 1 ! radiation model for the Mars' atmosphere Ver. 1 ! use rad_Mars_V1, only : RadMarsV1Init !!$ ! (火星大気向け) Non-LTE 放射モデル !!$ ! Non-NLTE radiation model (for the Mars' atmosphere) !!$ ! !!$ use rad_15m_NLTE, only: Rad15mNLTEInit ! 火星計算用近赤外加熱率計算 ! Calculation of near infrared heating rate in the case of Mars ! use rad_Mars_NIR, only : RadMarsNIRInit ! Schneider and Liu (2009) の放射モデル ! Radiation model by Schneider and Liu (2009) ! use rad_SL09, only : RadSL09Init ! 簡単放射モデル ! Simple radiation model ! use rad_simple, only : RadSimpleInit ! 何もしない放射モデル ! radiation model with no absorption and no scattering ! use rad_none, only : RadNoneInit ! 放射関連ルーチン ! Routines for radiation calculation ! use rad_utils, only : RadUtilsInit ! 鉛直拡散フラックス ! Vertical diffusion flux ! use vdiffusion_my, only : VDiffusionInit ! JMA 乱流混合モジュール ! JMA turbulent mixing module ! use vdiffusion_jma_my_wrapper, only : VDiffusionJMAInit ! Schneider and Liu (2009) による鉛直混合課程 ! Vertical diffusion by Schneider and Liu (2009) ! use sl09_diffusion, only : SL09DiffusionInit ! Gravity wave drag by McFarlane (1987) ! Gravity wave drag by McFarlane (1987) ! use gwd_m1987, only : GWDM1987Init ! 雲なしモデル ! No cloud model ! use cloud_none, only : CloudNoneInit ! 簡単雲モデル ! Simple cloud ! use cloud_simple, only: CloudSimpleInit ! Tiedtke (1993) に基づく雲モデル ! Cloud model based on Tiedtke (1993) ! use cloud_T1993base, only : CloudT1993baseInit ! 火星 H2O 雲モデル ! Mars H2O cloud model ! use cloud_mars_h2o, only : CloudMarsH2OInit ! 地表面フラックス (バルク法) ! Surface flux (Bulk method) ! use surface_flux_bulk, only : SurfaceFluxInit ! ! set dust flux ! !!$ use set_dust_flux, only : SetDustFluxInit ! 下部境界フラックス ! Lower boundary flux ! use lb_flux_simple, only : LBFluxSimpleInit ! 地面温度, 土壌温度の時間積分 ! Time integration of surface temperature and soil temperature ! use intg_surftemp, only : IntgSurfTempInit ! 力学過程 (スペクトル法, Arakawa and Suarez (1983)) ! Dynamical process (Spectral method, Arakawa and Suarez (1983)) ! use dynamics_hspl_vas83, only : DynamicsHSplVAS83Init ! 物理過程のみの計算のための力学過程 ! A dynamics for calculation with physical processes only ! use dynamics_physicsonly, only : DynamicsPhysicsOnlyInit ! ! Dynamical process for TWP-ICE experiment ! use dynamics_twpice_scm_exp, only : DynamicsTWPICESCMExpInit ! 湿潤対流調節 ! Moist convective adjustment ! use moist_conv_adjust, only : MoistConvAdjustInit ! Relaxed Arakawa-Schubert scheme ! Relaxed Arakawa-Schubert scheme ! use relaxed_arakawa_schubert, only : RASInit ! 大規模凝結 (非対流性凝結) ! Large scale condensation (non-convective condensation) ! use lscond, only : LScaleCondInit ! 大規模凝結 (非対流性凝結) (Le Treut and Li, 1991) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! !!$ use lscond_LL91, only : LScaleCondLL91Init ! != Saturation adjustment ! use saturation_adjust, only : SaturationAdjustInit ! 乾燥対流調節 ! Dry convective adjustment ! use dry_conv_adjust, only : DryConvAdjustInit ! 重力沈降過程 ! Gravitational sedimentation process ! use grav_sed, only : GravSedInit ! 主成分相変化 ! Phase change of atmospheric major component ! use major_comp_phase_change, only : MajorCompPhaseChangeInit ! タイムフィルター (Asselin, 1972) ! Time filter (Asselin, 1972) ! use timefilter_asselin1972, only : TimeFiltInit ! 時間フィルター (Williams, 2009) ! Time filter (Williams, 2009) ! use timefilter_williams2009, only: TimeFilterWilliams2009Init ! 予報変数の値の確認 ! Check values of prognostic variables ! use check_prog_vars, only : CheckProgVarsInit ! 質量の補正 ! Mass fixer ! use mass_fixer, only : MassFixerInit ! Output frequently used variables ! Output frequently used variables ! use output_freq_used_vars, only : OutputFreqUsedVarsInit ! 宣言文 ; Declaration statements ! implicit none character(*), parameter:: version = '$Name: $' // '$Id: dcpam_main.f90,v 1.67 2015/03/11 04:54:54 yot Exp $' ! 主プログラムのバージョン ! Main program version character(STRING) :: namelist_filename ! NAMELIST ファイルの名称. ! NAMELIST file name character(STRING) :: DynMode ! Dynamics used in calculation character(STRING) :: PhysMode ! Physics used in calculation character(STRING) :: RadModel ! Radiation model used in calculation character(STRING) :: SfcFluxMethod ! Method for surface flux evaluation used in calculation character(STRING) :: VDiffMethod ! Method for vertical diffusion evaluation used in calculation character(STRING) :: PhysImpMode ! Mode for implicit method used in calculation character(STRING) :: MCMethod ! Moist convection parameterization character(STRING) :: LSCMethod ! Large scale condensation parameterization character(STRING) :: CloudMethod ! Cloud model character(STRING) :: SfcMoistMethod ! Surface moist model character(STRING) :: GWDMethod ! Gravity wave drag character(STRING) :: DCMethod ! Dry convection logical :: FlagPhysImpSoilModelSO ! flag for use of slab ocean logical :: FlagSnow ! flag for treating snow logical :: FlagMajCompPhaseChange ! flag for use of major component phase change character(STRING):: CondMajCompName ! name of condensable major component character(STRING):: briefexpldyn ! 実行ファイルの簡潔な説明 (力学過程) ! Brief account of executable file (dynamics) character(STRING):: briefexplphy ! 実行ファイルの簡潔な説明 (物理過程) ! Brief account of executable file (physics) character(STRING):: briefexplrad ! 実行ファイルの簡潔な説明 (放射過程) ! Brief account of executable file (radiation) character(STRING):: briefexplsfcflux ! 実行ファイルの簡潔な説明 (惑星表面フラックス) ! Brief account of executable file (surface flux) character(STRING):: briefexplvdiff ! 実行ファイルの簡潔な説明 (鉛直拡散過程) ! Brief account of executable file (vertical diffusion) character(STRING):: briefexplimp ! 実行ファイルの簡潔な説明 (陰解法方程式構築方法) ! Brief account of executable file (implicit method) logical:: FlagBucketModel integer:: unit_nml ! NAMELIST ファイルオープン用装置番号. ! Unit number for NAMELIST file open integer:: iostat_nml ! NAMELIST 読み込み時の IOSTAT. ! IOSTAT of NAMELIST read integer:: n ! 組成方向に回る DO ループ用作業変数 ! Work variables for DO loop in dimension of constituents ! NAMELIST 変数群 ! NAMELIST group name ! namelist /dcpam_main_nml/ DynMode, PhysMode, RadModel, SfcFluxMethod, VDiffMethod, PhysImpMode, MCMethod, LSCMethod, CloudMethod, SfcMoistMethod, GWDMethod, DCMethod, FlagSnow, FlagMajCompPhaseChange, CondMajCompName ! ! デフォルト値については初期化手続 "main/dcpam_main.F90#MainInit" ! のソースコードを参照のこと. ! ! Refer to source codes in the initialization procedure ! "main/dcpam_main.F90#MainInit" for the default values. ! ! 実行文 ; Executable statement ! ! Initialize MPI ! call MPIWrapperInit ! コマンドライン引数処理 ! Command line option parser ! call OptParseInit( namelist_filename, prog_name ) ! NAMELIST ファイル名入力 ! Input NAMELIST file name ! call NmlutilInit( namelist_filename ) ! デフォルト値の設定 ! Default values settings ! DynMode = 'HSPLVAS83' !!$ DynMode = 'NoHorAdv' PhysMode = 'FullPhysics' !!$ PhysMode = 'HS94' !!$ PhysMode = 'VenusSimple' !!$ PhysMode = 'JupiterSimple' !!$ PhysMode = 'NoPhysics' RadModel = 'DennouAGCM' !!$ RadModel = 'Earth' !!$ RadModel = 'Mars' !!$ RadModel = 'SL09' SfcFluxMethod = 'L82' !!$ SfcFluxMethod = 'BH91B94' VDiffMethod = 'MY2' !!$ VDiffMethod = 'MY2.5' PhysImpMode = '1LayModel' !!$ PhysImpMode = 'SoilModel' !!$ PhysImpMode = 'SoilModelSO' !!$ PhysImpMode = 'AtmOnly' !!$ MCMethod = 'None' MCMethod = 'MCA' !!$ MCMethod = 'RAS' !!$ LSCMethod = 'None' LSCMethod = 'M65' !!$ LSCMethod = 'M65WithIce' !!$ LSCMethod = 'LL91' !!$ LSCMethod = 'LL91WithIce' CloudMethod = 'None' !!$ CloudMethod = 'Simple' !!$ CloudMethod = 'T1993WithIce' SfcMoistMethod = 'None' !!$ SfcMoistMethod = 'Bucket' GWDMethod = 'None' !!$ GWDMethod = 'M1987' !!$ DCMethod = 'None' DCMethod = 'DCA' FlagSnow = .false. FlagMajCompPhaseChange = .false. CondMajCompName = '' !!$ CondMajCompName = 'CO2' ! 計算モードの設定 ! Configure calculation mode ! if ( trim(namelist_filename) /= '' ) then call FileOpen( unit_nml, namelist_filename, mode = 'r' ) ! (in) rewind( unit_nml ) read( unit_nml, nml = dcpam_main_nml, iostat = iostat_nml ) ! (out) close( unit_nml ) call NmlutilMsg( iostat_nml, prog_name ) ! (in) if ( iostat_nml == 0 ) write( STDOUT, nml = dcpam_main_nml ) end if ! Identification of calculation method for dynamics ! call MessageNotify( 'M', prog_name, 'DynMode=<%c>.', c1 = trim(DynMode) ) ! select case ( DynMode ) case ( 'HSPLVAS83' ) IDDynMode = IDDynModeHSPLVAS83 case ( 'NoHorAdv' ) IDDynMode = IDDynModeNoHorAdv case ( 'TWPICE' ) IDDynMode = IDDynModeTWPICE case default call MessageNotify( 'E', prog_name, 'DynMode=<%c> is not supported.', c1 = trim(DynMode) ) end select ! Identification of calculation method for physics ! call MessageNotify( 'M', prog_name, 'PhysMode=<%c>.', c1 = trim(PhysMode) ) ! select case ( PhysMode ) case ( 'FullPhysics' ) IDPhysMode = IDPhysModeFullPhysics case ( 'HS94' ) IDPhysMode = IDPhysModeHS94 case ( 'VenusSimple' ) IDPhysMode = IDPhysModeVenusSimple case ( 'JupiterSimple' ) IDPhysMode = IDPhysModeJupiterSimple case ( 'JupiterSimpleV2' ) IDPhysMode = IDPhysModeJupiterSimpleV2 case ( 'NoPhysics' ) IDPhysMode = IDPhysModeNoPhysics case default call MessageNotify( 'E', prog_name, 'PhysMode=<%c> is not supported.', c1 = trim(PhysMode) ) end select ! Identification of calculation method for radiation ! call MessageNotify( 'M', prog_name, 'RadModel=<%c>.', c1 = trim(RadModel) ) ! select case ( RadModel ) case ( 'DennouAGCM' ) IDRadMethod = IDRadMethodDennouAGCM case ( 'Earth' ) IDRadMethod = IDRadMethodEarthV2 case ( 'Mars' ) IDRadMethod = IDRadMethodMarsV1 case ( 'SL09' ) IDRadMethod = IDRadMethodSL09 !!$ case ( 'VenusSimple' ) !!$ IDRadMethod = IDRadMethodVenusSimple case ( 'Simple' ) IDRadMethod = IDRadMethodSimple case ( 'RRTMG' ) IDRadMethod = IDRadMethodRRTMG case ( 'none' ) IDRadMethod = IDRadMethodNone case default call MessageNotify( 'E', prog_name, 'RadModel=<%c> is not supported.', c1 = trim(RadModel) ) end select ! Identification of calculation method for surface flux ! call MessageNotify( 'M', prog_name, 'SfcFluxMethod=<%c>.', c1 = trim(SfcFluxMethod) ) ! select case ( SfcFluxMethod ) case ( 'L82' ) IDSfcFluxMethod = IDSfcFluxMethodL82 case ( 'BH91B94' ) IDSfcFluxMethod = IDSfcFluxMethodBH91B94 case default call MessageNotify( 'E', prog_name, 'SfcFluxMethod=<%c> is not supported.', c1 = trim(SfcFluxMethod) ) end select ! Identification of calculation method for vertical diffusion ! call MessageNotify( 'M', prog_name, 'VDiffMethod=<%c>.', c1 = trim(VDiffMethod) ) ! select case ( VDiffMethod ) case ( 'MY2' ) IDVDiffMethod = IDVDiffMethodMY2 case ( 'MY2.5' ) IDVDiffMethod = IDVDiffMethodMY25 case ( 'JMA' ) IDVDiffMethod = IDVDiffMethodJMA case default call MessageNotify( 'E', prog_name, 'VDiffMethod=<%c> is not supported.', c1 = trim(VDiffMethod) ) end select ! Identification of calculation method for solving simultaneous linear equations ! of physics ! call MessageNotify( 'M', prog_name, 'PhysImpMode=<%c>.', c1 = trim(PhysImpMode) ) ! select case ( PhysImpMode ) case ( '1LayModel' ) IDPhyTendMethod = IDPhyTendMethodImp1LayModel FlagPhysImpSoilModelSO = .false. case ( 'SoilModel' ) IDPhyTendMethod = IDPhyTendMethodImpSoilModel FlagPhysImpSoilModelSO = .false. case ( 'SoilModelSO' ) IDPhyTendMethod = IDPhyTendMethodImpSoilModel FlagPhysImpSoilModelSO = .true. case ( 'AtmOnly' ) IDPhyTendMethod = IDPhyTendMethodImpAtmOnly FlagPhysImpSoilModelSO = .false. case default call MessageNotify( 'E', prog_name, 'PhysImpMode=<%c> is not supported.', c1 = trim(PhysImpMode) ) end select ! ! Check for value of FlagFullPhysics ! if ( ( IDPhysMode /= IDPhysModeFullPhysics ) .and. ( IDPhyTendMethod == IDPhyTendMethodImpSoilModel ) ) then call MessageNotify( 'E', prog_name, 'PhysMode has to be "FullPhysics" true, when PhyImpMode is "SoilModel" or "SoilModelSO".' ) end if if ( ( IDPhysMode /= IDPhysModeFullPhysics ) .and. ( IDPhyTendMethod == IDPhyTendMethodImpAtmOnly ) ) then call MessageNotify( 'E', prog_name, 'PhysMode has to be "FullPhysics" true, when PhyImpMode is "AtmOnly".' ) end if ! Identification of calculation method for moist convection ! call MessageNotify( 'M', prog_name, 'MCMethod=<%c>.', c1 = trim(MCMethod) ) ! select case ( MCMethod ) case ( 'None' ) IDMCMethod = IDMCMethodNone case ( 'MCA' ) IDMCMethod = IDMCMethodMCA case ( 'RAS' ) IDMCMethod = IDMCMethodRAS case ( 'RASWithIce' ) IDMCMethod = IDMCMethodRASWithIce case default call MessageNotify( 'E', prog_name, 'MCMethod=<%c> is not supported.', c1 = trim(MCMethod) ) end select ! Identification of calculation method for large scale condensation ! call MessageNotify( 'M', prog_name, 'LSCMethod=<%c>.', c1 = trim(LSCMethod) ) ! select case ( LSCMethod ) case ( 'None' ) IDLSCMethod = IDLSCMethodNone case ( 'M65' ) IDLSCMethod = IDLSCMethodM65 !!$ case ( 'LL91' ) !!$ IDLSCMethod = IDLSCMethodLL91 case ( 'SatAdjM65' ) IDLSCMethod = IDLSCMethodSatAdjM65 case ( 'M65WithIce' ) IDLSCMethod = IDLSCMethodM65WithIce case ( 'LL91WithIce' ) IDLSCMethod = IDLSCMethodLL91WithIce case default call MessageNotify( 'E', prog_name, 'LSCMethod=<%c> is not supported.', c1 = trim(LSCMethod) ) end select ! Identification of calculation method for cloud ! call MessageNotify( 'M', prog_name, 'CloudMethod=<%c>.', c1 = trim(CloudMethod) ) ! select case ( CloudMethod ) case ( 'None' ) IDCloudMethod = IDCloudMethodNone case ( 'Simple' ) IDCloudMethod = IDCloudMethodSimple case ( 'SimpleWithIce' ) IDCloudMethod = IDCloudMethodSimpleWithIce case ( 'T1993WithIce' ) IDCloudMethod = IDCloudMethodT1993WithIce case ( 'MarsH2OCloud' ) IDCloudMethod = IDCloudMethodMarsH2OCloud case default call MessageNotify( 'E', prog_name, 'LSCloudMethod=<%c> is not supported.', c1 = trim(CloudMethod) ) end select ! check a non-convective condensation if ( IDCloudMethod == IDCloudMethodT1993WithIce ) then if ( IDLSCMethod /= IDLSCMethodNone ) then call MessageNotify( 'E', prog_name, 'If CloudMethod="T1993WithIce", LscMethod has to be "None".' ) end if end if ! Identification of calculation method for surface moisture ! call MessageNotify( 'M', prog_name, 'SfcMoistMethod=<%c>.', c1 = trim(SfcMoistMethod) ) ! select case ( SfcMoistMethod ) case ( 'None' ) IDSfcMoistMethod = IDSfcMoistMethodNone FlagBucketModel = .false. case ( 'Bucket' ) IDSfcMoistMethod = IDSfcMoistMethodBucket FlagBucketModel = .true. case default call MessageNotify( 'E', prog_name, 'SfcMoistMethod=<%c> is not supported.', c1 = trim(SfcMoistMethod) ) end select ! Identification of calculation method for gravity wave drag ! call MessageNotify( 'M', prog_name, 'GWDMethod=<%c>.', c1 = trim(GWDMethod) ) ! select case ( GWDMethod ) case ( 'None' ) IDGWDMethod = IDGWDMethodNone case ( 'M1987' ) IDGWDMethod = IDGWDMethodM1987 case default call MessageNotify( 'E', prog_name, 'GWDMethod=<%c> is not supported.', c1 = trim(GWDMethod) ) end select ! Identification of calculation method for dry convection ! call MessageNotify( 'M', prog_name, 'DCMethod=<%c>.', c1 = trim(DCMethod) ) ! select case ( DCMethod ) case ( 'None' ) IDDCMethod = IDDCMethodNone case ( 'DCA' ) IDDCMethod = IDDCMethodDCA case default call MessageNotify( 'E', prog_name, 'DCMethod=<%c> is not supported.', c1 = trim(DCMethod) ) end select ! 計算モードの表示 ! Display calculation mode ! select case ( IDDynMode ) case ( IDDynModeHSPLVAS83 ) briefexpldyn = 'used' case ( IDDynModeNoHorAdv ) briefexpldyn = 'not used' case ( IDDynModeTWPICE ) briefexpldyn = 'TWP-ICE' end select select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) briefexplphy = 'parameterization suite is used' case ( IDPhysModeHS94 ) briefexplphy = 'forcing for Held and Suarez (1994) dynamical core test' case ( IDPhysModeVenusSimple ) briefexplphy = 'simple forcing for a Venus-like planet' case ( IDPhysModeJupiterSimple ) briefexplphy = 'simple forcing for a Jupiter-like planet' case ( IDPhysModeJupiterSimpleV2 ) briefexplphy = 'simple forcing for a Jupiter-like planet Ver. 2' case ( IDPhysModeNoPhysics ) briefexplphy = 'not used' end select if ( IDPhysMode == IDPhysModeFullPhysics ) then select case ( IDRadMethod ) case ( IDRadMethodDennouAGCM ) briefexplrad = 'dennou AGCM5 default' case ( IDRadMethodEarthV2 ) briefexplrad = 'Earth' case ( IDRadMethodMarsV1 ) briefexplrad = 'Mars' case ( IDRadMethodSL09 ) briefexplrad = 'Schneider and Liu (2009) (Jupiter-like planet)' !!$ case ( IDRadMethodVenusSimple ) !!$ briefexplrad = 'Venus simple radiation model (tentative)' case ( IDRadMethodSimple ) briefexplrad = 'Simple radiation model (tentative)' case ( IDRadMethodRRTMG ) briefexplrad = 'RRTMG' case ( IDRadMethodNone ) briefexplrad = 'none' case default call MessageNotify( 'E', 'Unexpected error in setting briefexplrad', '' ) end select select case ( IDSfcFluxMethod ) case ( IDSfcFluxMethodL82 ) briefexplsfcflux = 'surface flux by the method of Louis et al. (1982)' case ( IDSfcFluxMethodBH91B94 ) briefexplsfcflux = 'surface flux by the method of Beljaars and Holtslag (1991), Beljaars (1994)' case default call MessageNotify( 'E', 'Unexpected error in setting briefexplsfcflux', '' ) end select select case ( IDVDiffMethod ) case ( IDVDiffMethodMY2 ) briefexplvdiff = 'vertical diffusion with the method of Mellor and Yamada level 2' case ( IDVDiffMethodMY25 ) briefexplvdiff = 'vertical diffusion with the method of Mellor and Yamada level 2.5' case ( IDVDiffMethodJMA ) briefexplvdiff = 'vertical diffusion with the method of JMA physical library of Mellor and Yamada'! level 2.5' case default call MessageNotify( 'E', 'Unexpected error in setting briefexplvdiff', '' ) end select select case ( IDPhyTendMethod ) case ( IDPhyTendMethodImp1LayModel ) briefexplimp = 'system with surface 1 layer model' case ( IDPhyTendMethodImpSoilModel ) briefexplimp = 'system with thermal diffusion soil model' case ( IDPhyTendMethodImpAtmOnly ) briefexplimp = 'system only with atmosphere' case default call MessageNotify( 'E', 'Unexpected error in setting briefexplimp', '' ) end select else briefexplrad = '' end if call MessageNotify( 'M', prog_name, '' ) call MessageNotify( 'M', prog_name, '+-------------------------------------' ) call MessageNotify( 'M', prog_name, '| Dynamics: %c', c1 = trim(briefexpldyn) ) call MessageNotify( 'M', prog_name, '| Physics : %c', c1 = trim(briefexplphy) ) if ( IDPhysMode == IDPhysModeFullPhysics ) then call MessageNotify( 'M', prog_name, '| Radiation model : %c', c1 = trim(briefexplrad) ) call MessageNotify( 'M', prog_name, '| Surface flux method : %c', c1 = trim(briefexplsfcflux) ) call MessageNotify( 'M', prog_name, '| Vertical diffusion method : %c', c1 = trim(briefexplvdiff) ) call MessageNotify( 'M', prog_name, '| Implicit method : %c', c1 = trim(briefexplimp) ) call MessageNotify( 'M', prog_name, '| Major component phase change : %b', l = (/ FlagMajCompPhaseChange /) ) end if call MessageNotify( 'M', prog_name, '| -- version = %c', c1 = trim(version) ) call MessageNotify( 'M', prog_name, '+-------------------------------------' ) call MessageNotify( 'M', prog_name, '' ) ! Initialization of modules used in this module ! ! 時刻管理 ! Time control ! call TimesetInit ! 出力ファイルの基本情報管理 ! Management basic information for output files ! call FilesetInit ! 格子点設定 ! Grid points settings ! call GridsetInit ! 組成に関わる配列の設定 ! Settings of array for atmospheric composition ! call CompositionInit ! 物理定数設定 ! Physical constants settings ! call ConstantsInit ! 雪と海氷の定数の設定 ! Setting constants of snow and sea ice ! call ConstantsSnowSeaIceInit ! 座標データ設定 ! Axes data settings ! call AxessetInit ! 時系列データの読み込み ! Reading time series ! call ReadTimeSeriesInit ! 地表面データ提供 ! Prepare surface data ! call SurfDataInit ! ファイルから 1 次元プロファイルを読んで設定する. ! read 1-D profile from a file and set it ! call Set1DProfileInit ! 予報変数の割付 ! Allocation of prediction variables ! allocate( xyz_UB (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_VB (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_TempB (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyzf_QMixB(0:imax-1, 1:jmax, 1:kmax, 1:ncmax) ) allocate( xy_PsB (0:imax-1, 1:jmax) ) allocate( xyz_UN (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_VN (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_TempN (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyzf_QMixN(0:imax-1, 1:jmax, 1:kmax, 1:ncmax) ) allocate( xy_PsN (0:imax-1, 1:jmax) ) allocate( xyz_UA (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_VA (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_TempA (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyzf_QMixA(0:imax-1, 1:jmax, 1:kmax, 1:ncmax) ) allocate( xy_PsA (0:imax-1, 1:jmax) ) ! リスタートデータ入力 ! Restart data input ! call RestartFileInit call RestartFileGet( xyz_UB, xyz_VB, xyz_TempB, xyzf_QMixB, xy_PsB, xyz_UN, xyz_VN, xyz_TempN, xyzf_QMixN, xy_PsN, flag_initial ) ! (out) optional select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) ! 地表面温度, 土壌温度の割付 ! Allocation of surface temperature and soil temperature ! allocate( xy_SurfTemp (0:imax-1, 1:jmax) ) allocate( xyz_SoilTemp(0:imax-1, 1:jmax, 1:kslmax) ) allocate( xy_SurfMajCompIceB(0:imax-1, 1:jmax) ) allocate( xy_SoilMoistB (0:imax-1, 1:jmax) ) allocate( xy_SurfSnowB (0:imax-1, 1:jmax) ) allocate( xy_SurfMajCompIceN(0:imax-1, 1:jmax) ) allocate( xy_SoilMoistN (0:imax-1, 1:jmax) ) allocate( xy_SurfSnowN (0:imax-1, 1:jmax) ) allocate( xy_SurfMajCompIceA(0:imax-1, 1:jmax) ) allocate( xy_SoilMoistA (0:imax-1, 1:jmax) ) allocate( xy_SurfSnowA (0:imax-1, 1:jmax) ) ! 地表面温度リスタートデータ入力 ! Restart data of surface temperature input ! !!$ call RestartSurfTempGet( & !!$ & xy_SurfTemp ) ! (out) call RestartSurfTempInit call RestartSurfTempGet( xy_SurfTemp, xyz_SoilTemp, xy_SurfMajCompIceB, xy_SoilMoistB, xy_SurfSnowB, xy_SurfMajCompIceN, xy_SoilMoistN, xy_SurfSnowN ) !!$ xy_SurfSnowN = 1.0d1 !!$ xy_SurfSnowB = xy_SurfSnowN ! THIS IS A TEMPORARY LINE. !!$ ! 土壌温度, ..., の初期値設定, いずれリスタートファイルから読むようにする !!$ ! Setting of initial values of soil temperature, ..., these values are input from restart file in near future !!$ ! !!$ do k = 1, kslmax !!$ xyz_SoilTemp(:,:,k) = xy_SurfTemp !!$ end do !!$ !!$ xy_SoilMoistN = 0.0_DP !!$ xy_SurfSnowN = 0.0_DP !!$ !!$ xy_SoilMoistB = xy_SoilMoistN !!$ xy_SurfSnowB = xy_SurfSnowN !!$ !!$ xy_SoilMoistA = 0.0_DP !!$ xy_SurfSnowA = 0.0_DP !!$ xy_SurfMajCompIceN = 0.0_DP !!$ xy_SurfMajCompIceB = xy_SurfMajCompIceN end select ! リスタートデータファイルの初期化 ! Initialization of restart data file ! call RestartFileOpen ! ヒストリデータファイルの初期化 ! Initialization of history data files ! call HistoryFileOpen ! ヒストリデータ出力のためのへの変数登録 ! Register of variables for history data output ! call HistoryAutoAddVariable( 'U' , (/ 'lon ', 'lat ', 'sig ', 'time' /), 'eastward wind', 'm s-1' ) ! (in) call HistoryAutoAddVariable( 'V' , (/ 'lon ', 'lat ', 'sig ', 'time' /), 'northward wind', 'm s-1' ) ! (in) call HistoryAutoAddVariable( 'Temp' , (/ 'lon ', 'lat ', 'sig ', 'time' /), 'temperature', 'K' ) ! (in) do n = 1, ncmax call HistoryAutoAddVariable( a_QMixName(n) , (/ 'lon ', 'lat ', 'sig ', 'time' /), a_QMixLongName(n), 'kg kg-1' ) ! (in) end do n = IndexH2OVap if ( a_QMixName(n) /= 'QVap' ) then call HistoryAutoAddVariable( 'QVap' , (/ 'lon ', 'lat ', 'sig ', 'time' /), a_QMixLongName(n), 'kg kg-1' ) ! (in) end if call HistoryAutoAddVariable( 'Ps' , (/ 'lon ', 'lat ', 'time' /), 'surface pressure', 'Pa' ) ! (in) ! ヒストリデータ出力 (スタート時刻) ! History data output (Start time) ! call HistoryAutoPut( TimeN, 'U', xyz_UN ) call HistoryAutoPut( TimeN, 'V', xyz_VN ) call HistoryAutoPut( TimeN, 'Temp', xyz_TempN ) do n = 1, ncmax call HistoryAutoPut( TimeN, a_QMixName(n), xyzf_QMixN(:,:,:,n) ) end do call HistoryAutoPut( TimeN, 'Ps', xy_PsN ) ! Backward compatibility n = IndexH2OVap if ( a_QMixName(n) /= 'QVap' ) then call HistoryAutoPut( TimeN, 'QVap', xyzf_QMixN(:,:,:,n) ) end if ! Output frequently used variables ! Output frequently used variables ! call OutputFreqUsedVarsInit select case ( IDPhysMode ) case ( IDPhysModeJupiterSimpleV2 ) ! ヒストリデータ出力のためのへの変数登録 ! Register of variables for history data output ! call HistoryAutoAddVariable( 'Rain', (/ 'lon ', 'lat ', 'time' /), 'precipitation (rain)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'Snow', (/ 'lon ', 'lat ', 'time' /), 'precipitation (snow)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'PRCP', (/ 'lon ', 'lat ', 'time' /), 'precipitation', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'RainCum', (/ 'lon ', 'lat ', 'time' /), 'convective precipitation (rain)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'SnowCum', (/ 'lon ', 'lat ', 'time' /), 'convective precipitation (snow)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'PRCPCum', (/ 'lon ', 'lat ', 'time' /), 'convective precipitation', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'RainLsc', (/ 'lon ', 'lat ', 'time' /), 'non-convective precipitation (rain)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'SnowLsc', (/ 'lon ', 'lat ', 'time' /), 'non-convective precipitation (snow)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'PRCPLsc', (/ 'lon ', 'lat ', 'time' /), 'non-convective precipitation', 'kg m-2 s-1' ) case ( IDPhysModeFullPhysics ) ! 地表面温度リスタートデータファイルの初期化 ! Initialization of restart data file of surface temperature ! call RestartSurfTempOpen ! ヒストリデータ出力のためのへの変数登録 ! Register of variables for history data output ! call HistoryAutoAddVariable( 'SurfTemp' , (/ 'lon ', 'lat ', 'time' /), 'surface temperature', 'K' ) call HistoryAutoAddVariable( 'SoilTemp', (/ 'lon ', 'lat ', 'ssz ', 'time' /), 'soil temperature', 'K' ) call HistoryAutoAddVariable( 'SurfMajCompIce' , (/ 'lon ', 'lat ', 'time' /), 'surface major component ice', 'kg m-2' ) ! (in) call HistoryAutoAddVariable( 'SoilMoist' , (/ 'lon ', 'lat ', 'time' /), 'soil moisture', 'kg m-2' ) ! (in) call HistoryAutoAddVariable( 'SurfSnow' , (/ 'lon ', 'lat ', 'time' /), 'surface snow amount', 'kg m-2' ) ! (in) call HistoryAutoAddVariable( 'Rain', (/ 'lon ', 'lat ', 'time' /), 'precipitation (rain)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'Snow', (/ 'lon ', 'lat ', 'time' /), 'precipitation (snow)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'PRCP', (/ 'lon ', 'lat ', 'time' /), 'precipitation', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'RainCum', (/ 'lon ', 'lat ', 'time' /), 'convective precipitation (rain)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'SnowCum', (/ 'lon ', 'lat ', 'time' /), 'convective precipitation (snow)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'PRCPCum', (/ 'lon ', 'lat ', 'time' /), 'convective precipitation', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'RainLsc', (/ 'lon ', 'lat ', 'time' /), 'non-convective precipitation (rain)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'SnowLsc', (/ 'lon ', 'lat ', 'time' /), 'non-convective precipitation (snow)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'PRCPLsc', (/ 'lon ', 'lat ', 'time' /), 'non-convective precipitation', 'kg m-2 s-1' ) ! ヒストリデータ出力 (スタート時刻) ! History data output (Start time) ! call HistoryAutoPut( TimeN, 'SurfMajCompIce', xy_SurfMajCompIceN ) call HistoryAutoPut( TimeN, 'SoilMoist' , xy_SoilMoistN ) call HistoryAutoPut( TimeN, 'SurfSnow' , xy_SurfSnowN ) end select ! 診断変数の割付 ! Allocation of diagnostic variables ! allocate( xyz_DUDt (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DVDt (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DTempDt (0:imax-1, 1:jmax, 1:kmax) ) allocate( xy_DPsDt (0:imax-1, 1:jmax) ) allocate( xyzf_DQMixDt(0:imax-1, 1:jmax, 1:kmax, 1:ncmax) ) allocate( xyz_DTurKinEneDt(0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_OMG(0:imax-1, 1:jmax, 1:kmax) ) allocate( xy_SurfHeight(0:imax-1, 1:jmax) ) allocate( xyz_Height (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_Exner (0:imax-1, 1:jmax, 1:kmax) ) select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) allocate( xy_SurfAlbedo (0:imax-1, 1:jmax) ) allocate( xy_SurfHumidCoef (0:imax-1, 1:jmax) ) allocate( xy_SurfRoughLenMom (0:imax-1, 1:jmax) ) allocate( xy_SurfRoughLenHeat (0:imax-1, 1:jmax) ) allocate( xy_SurfHeatCapacity (0:imax-1, 1:jmax) ) allocate( xy_SeaIceConc (0:imax-1, 1:jmax) ) allocate( xy_SurfCond (0:imax-1, 1:jmax) ) allocate( xy_SurfType (0:imax-1, 1:jmax) ) allocate( xy_DeepSubSurfHeatFlux(0:imax-1, 1:jmax) ) allocate( xy_SoilHeatCap (0:imax-1, 1:jmax) ) allocate( xy_SoilHeatDiffCoef (0:imax-1, 1:jmax) ) allocate( xy_SurfHeightStd (0:imax-1, 1:jmax) ) allocate( xy_SnowFrac (0:imax-1, 1:jmax) ) !!$ allocate( xy_FlagMatthewsLand (0:imax-1, 1:jmax) ) allocate( xy_PhyImplSDHIndexCalcMethod(0:imax-1, 1:jmax) ) allocate( xy_BucketFlagOceanGrid (0:imax-1, 1:jmax) ) allocate( xyr_Temp (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyz_VirTemp (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_VirTemp (0:imax-1, 1:jmax, 0:kmax) ) allocate( xy_SurfVirTemp(0:imax-1, 1:jmax) ) allocate( xyz_Press (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_Press (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_Height (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_Exner (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLFluxA (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLUwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLDwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSUwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSDwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyra_DelRadLFlux (0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xyra_DelRadLUwFlux(0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xyra_DelRadLDwFlux(0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xyr_MomFluxX (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_MomFluxY (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_HeatFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyrf_QMixFlux (0:imax-1, 1:jmax, 0:kmax, 1:ncmax) ) allocate( xy_SurfMomFluxX (0:imax-1, 1:jmax) ) allocate( xy_SurfMomFluxY (0:imax-1, 1:jmax) ) allocate( xy_SurfHeatFlux (0:imax-1, 1:jmax) ) allocate( xyf_SurfQMixFlux (0:imax-1, 1:jmax, 1:ncmax) ) allocate( xy_SurfH2OVapFluxA (0:imax-1, 1:jmax) ) allocate( xy_SurfLatentHeatFluxA(0:imax-1, 1:jmax) ) allocate( xyr_SoilHeatFlux(0:imax-1, 1:jmax, 0:kslmax) ) allocate( xyr_VelDiffCoef (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_TempDiffCoef(0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_QMixDiffCoef(0:imax-1, 1:jmax, 0:kmax) ) allocate( xy_SurfVelTransCoef (0:imax-1, 1:jmax) ) allocate( xy_SurfTempTransCoef(0:imax-1, 1:jmax) ) allocate( xy_SurfQVapTransCoef(0:imax-1, 1:jmax) ) allocate( xy_SurfMOLength (0:imax-1, 1:jmax) ) allocate( xyr_SoilTempTransCoef (0:imax-1, 1:jmax, 0:kslmax) ) allocate( xy_DSurfTempDt (0:imax-1, 1:jmax) ) allocate( xyz_DSoilTempDt(0:imax-1, 1:jmax, 1:kslmax) ) allocate( xy_DSurfMajCompIceDt(0:imax-1, 1:jmax) ) allocate( xy_DSoilMoistDt (0:imax-1, 1:jmax) ) allocate( xy_DSurfSnowDt (0:imax-1, 1:jmax) ) allocate( xyz_DTempDtVDiff(0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DUDtGWD(0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DVDtGWD(0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DTempDtRadL (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DTempDtRadS (0:imax-1, 1:jmax, 1:kmax) ) allocate( xy_Rain (0:imax-1, 1:jmax) ) allocate( xy_RainCumulus (0:imax-1, 1:jmax) ) allocate( xy_RainLsc (0:imax-1, 1:jmax) ) allocate( xy_Snow (0:imax-1, 1:jmax) ) allocate( xy_SnowCumulus (0:imax-1, 1:jmax) ) allocate( xy_SnowLsc (0:imax-1, 1:jmax) ) allocate( xyz_DTempDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQVapDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OLiqDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OSolDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DUDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DVDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OLiqDtLSC (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OSolDtLSC (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_MoistConvDetTend (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_MoistConvSubsidMassFlux(0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_QH2OLiqforRad (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_QH2OSolforRad (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_CloudCoverforRad(0:imax-1,1:jmax,1:kmax) ) allocate( xy_SurfDustGravSedFlux(0:imax-1,1:jmax) ) ! ヒストリデータ出力のためのへの変数登録 ! Register of variables for history data output ! call HistoryAutoAddVariable( 'SeaIceConc' , (/ 'lon ', 'lat ', 'time' /), 'sea ice concentration', '1' ) call HistoryAutoAddVariable( 'SurfAlbedo' , (/ 'lon ', 'lat ', 'time' /), 'surface albedo', '1' ) call HistoryAutoAddVariable( 'SurfRoughLenMom' , (/ 'lon ', 'lat ', 'time' /), 'surface roughness length for momentum', 'm' ) call HistoryAutoAddVariable( 'SurfRoughLenHeat' , (/ 'lon ', 'lat ', 'time' /), 'surface roughness length for heat', 'm' ) call HistoryAutoAddVariable( 'SurfDustGravSedFlux' , (/ 'lon ', 'lat ', 'time' /), 'surface roughness length', 'm' ) case ( IDPhysModeVenusSimple ) allocate( xyr_Temp (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyz_VirTemp (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_VirTemp (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyz_Press (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_Press (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_Height (0:imax-1, 1:jmax, 0:kmax) ) !!$ allocate( xyz_Exner (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_Exner (0:imax-1, 1:jmax, 0:kmax) ) case ( IDPhysModeJupiterSimple ) allocate( xyz_Press (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_Press (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_VirTemp(0:imax-1, 1:jmax, 0:kmax) ) allocate( xyz_DTempDtVDiff(0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_HeatFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLUwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLDwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSUwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSDwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyz_DTempDtRadL (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DTempDtRadS (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyra_DelRadLFlux (0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xyra_DelRadLUwFlux(0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xyra_DelRadLDwFlux(0:imax-1, 1:jmax, 0:kmax, 0:1) ) case ( IDPhysModeJupiterSimpleV2 ) allocate( xyz_Press (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_Press (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_VirTemp(0:imax-1, 1:jmax, 0:kmax) ) !!$ allocate( xyz_Exner (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_Exner (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyz_DTempDtVDiff(0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_MomFluxX (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_MomFluxY (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_HeatFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyrf_QMixFlux (0:imax-1, 1:jmax, 0:kmax, 1:ncmax) ) allocate( xyr_VelDiffCoef (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_TempDiffCoef(0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_QMixDiffCoef(0:imax-1, 1:jmax, 0:kmax) ) allocate( xy_SurfVelTransCoef (0:imax-1, 1:jmax) ) allocate( xy_SurfTempTransCoef(0:imax-1, 1:jmax) ) allocate( xy_SurfQVapTransCoef(0:imax-1, 1:jmax) ) allocate( xyr_RadLFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLUwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLDwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSUwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSDwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyz_DTempDtRadL (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DTempDtRadS (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyra_DelRadLFlux (0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xyra_DelRadLUwFlux(0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xyra_DelRadLDwFlux(0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xy_Rain (0:imax-1, 1:jmax) ) allocate( xy_RainCumulus (0:imax-1, 1:jmax) ) allocate( xy_RainLsc (0:imax-1, 1:jmax) ) allocate( xy_Snow (0:imax-1, 1:jmax) ) allocate( xy_SnowCumulus (0:imax-1, 1:jmax) ) allocate( xy_SnowLsc (0:imax-1, 1:jmax) ) allocate( xyz_DTempDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQVapDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OLiqDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OSolDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DUDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DVDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OLiqDtLSC (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OSolDtLSC (0:imax-1,1:jmax,1:kmax) ) end select ! 惑星表面データの設定 ! Setting planetary surface properties ! select case ( IDSfcMoistMethod ) case ( IDSfcMoistMethodNone ) call SurfacePropertiesInit( FlagPhysImpSoilModelSO, .false., FlagSnow ) case ( IDSfcMoistMethodBucket ) call SurfacePropertiesInit( FlagPhysImpSoilModelSO, .true. , FlagSnow ) end select select case ( IDPhysMode ) case ( IDPhysModeNoPhysics ) ! Nothing to do case ( IDPhysModeHS94 ) ! Held and Suarez (1994) による強制と散逸 ! Forcing and dissipation suggested by Held and Suarez (1994) ! call HS94Init case ( IDPhysModeVenusSimple ) ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit ! Yamamoto and Takahashi (2003) に従った簡単金星計算のための強制 ! forcing for simple Venus calculation following Yamamoto and Takahashi (2003) ! call YT2003ForcingInit case ( IDPhysModeJupiterSimple ) ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit ! Schneider and Liu (2009) による鉛直混合課程 ! Vertical diffusion by Schneider and Liu (2009) ! call SL09DiffusionInit ! Schneider and Liu (2009) の放射モデル ! Radiation model by Schneider and Liu (2009) ! call RadSL09Init ! 放射関連ルーチン ! Routines for radiation calculation ! call RadUtilsInit case ( IDPhysModeJupiterSimpleV2 ) ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit ! 下部境界フラックス ! Lower boundary flux ! call LBFluxSimpleInit ! 陰解法による時間積分 (大気のみ / 惑星表面温度・土壌温度計算なし) ! Time integration by using implicit scheme in case without calculation of surface and soil temperature ! call PhyImplAtmOnlyInit ! Schneider and Liu (2009) の放射モデル ! Radiation model by Schneider and Liu (2009) ! call RadSL09Init ! 放射関連ルーチン ! Routines for radiation calculation ! call RadUtilsInit case ( IDPhysModeFullPhysics ) ! 惑星表面データの設定 ! Setting planetary surface properties ! select case ( IDSfcMoistMethod ) case ( IDSfcMoistMethodNone ) call SurfacePropertiesInit( FlagPhysImpSoilModelSO, .false., FlagSnow ) case ( IDSfcMoistMethodBucket ) call SurfacePropertiesInit( FlagPhysImpSoilModelSO, .true. , FlagSnow ) end select ! 雪, 氷の割合 ! snow/ice fraction ! call SnowIceFracInit ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit select case ( IDRadMethod ) case ( IDRadMethodDennouAGCM ) ! 放射フラックス (GFD 電脳倶楽部開発の放射モデル) ! Radiation flux (radiation model developed by GFD Dennou Club) ! call RadDennouAGCMInit( flag_rst = .not. flag_initial ) case ( IDRadMethodEarthV2 ) if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if select case ( IDCloudMethod ) case ( IDCloudMethodNone ) ! 雲なしモデル ! No cloud model ! call CloudNoneInit( FlagSnow ) case ( IDCloudMethodSimple ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) case ( IDCloudMethodSimpleWithIce ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) case ( IDCloudMethodT1993WithIce ) ! Tiedtke (1993) に基づく雲モデル ! Cloud model based on Tiedtke (1993) ! call CloudT1993baseInit( FlagSnow ) end select ! 地球大気向け放射モデル Ver. 2 ! radiation model for the Earth's atmosphere Ver. 2 ! call RadEarthV2Init( FlagSnow ) case ( IDRadMethodRRTMG ) if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if select case ( IDCloudMethod ) case ( IDCloudMethodNone ) ! 雲なしモデル ! No cloud model ! call CloudNoneInit( FlagSnow ) case ( IDCloudMethodSimple ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) case ( IDCloudMethodSimpleWithIce ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) case ( IDCloudMethodT1993WithIce ) ! Tiedtke (1993) に基づく雲モデル ! Cloud model based on Tiedtke (1993) ! call CloudT1993baseInit( FlagSnow ) end select ! wrapper of RRTMG ! wrapper of RRTMG ! call RadRRTMGWrapperInit( FlagSnow ) case ( IDRadMethodMarsV1 ) ! 火星大気向け放射モデル Ver. 1 ! radiation model for the Mars' atmosphere Ver. 1 ! call RadMarsV1Init case ( IDRadMethodSL09 ) ! Schneider and Liu (2009) の放射モデル ! Radiation model by Schneider and Liu (2009) ! call RadSL09Init case ( IDRadMethodSimple ) ! 簡単放射モデル ! Simple radiation model ! call RadSimpleInit case ( IDRadMethodNone ) ! 何もしない放射モデル ! radiation model with no absorption and no scattering ! call RadNoneInit end select ! 鉛直拡散フラックス ! Vertical diffusion flux ! select case ( IDVDiffMethod ) case ( IDVDiffMethodMY2, IDVDiffMethodMY25 ) ! 鉛直拡散フラックス (Mellor and Yamada, 1974) ! Vertical diffusion flux (Mellor and Yamada, 1974) ! call VDiffusionInit case ( IDVDiffMethodJMA ) ! JMA 乱流混合モジュール ! JMA turbulent mixing module ! call VDiffusionJMAInit end select ! 地表面フラックス (バルク法) ! Surface flux (Bulk method) ! call SurfaceFluxInit ! ! set dust flux ! !!$ call SetDustFluxInit ! 一部の物理過程の時間変化率の計算 (陰解法) ! Calculate tendency by a part of physical processes (implicit) ! select case ( IDPhyTendMethod ) case ( IDPhyTendMethodImp1LayModel ) ! 陰解法による時間積分 ! Time integration with implicit scheme ! call PhyImplInit( FlagBucketModel, FlagSnow ) case ( IDPhyTendMethodImpSoilModel ) select case ( IDSfcMoistMethod ) case ( IDSfcMoistMethodBucket ) ! バケツモデル ! Bucket model ! call BucketModelInit( FlagSnow ) end select ! 地下における熱の鉛直拡散 ! Vertical diffusion of heat under the ground ! call SubsurfaceDiffusionInit ! 地下熱伝導モデルを用いた場合の陰解法による時間積分 ! ! Time integration by using implicit scheme in case using subsurface thermal diffusion model !!$ call PhyImplSDHInit( & !!$ & FlagBucketModel, FlagSnow, & !!$ & FlagPhysImpSoilModelSO, FlagMajCompPhaseChange, CondMajCompName & !!$ & ) !!$ call PhyImplSDHV2Init( & !!$ & FlagBucketModel, FlagSnow, & !!$ & FlagPhysImpSoilModelSO, FlagMajCompPhaseChange, CondMajCompName & !!$ & ) call PhyImplSDHV3Init( FlagBucketModel, FlagSnow, FlagPhysImpSoilModelSO, FlagMajCompPhaseChange, CondMajCompName ) case ( IDPhyTendMethodImpAtmOnly ) ! 陰解法による時間積分 (大気のみ / 惑星表面温度・土壌温度計算なし) ! Time integration by using implicit scheme in case without calculation of surface and soil temperature ! call PhyImplAtmOnlyInit end select ! Gravity wave drag by McFarlane (1987) ! Gravity wave drag by McFarlane (1987) ! call GWDM1987Init ! 陰解法による時間積分のためのルーチン ! Routines for time integration with implicit scheme ! call PhyImplUtilsInit ! 放射関連ルーチン ! Routines for radiation calculation ! call RadUtilsInit !!$ select case ( IDRadMethod ) !!$ case ( IDRadMethodMarsV1 ) !!$ ! (火星大気向け) Non-LTE 放射モデル !!$ ! Non-NLTE radiation model (for the Mars' atmosphere) !!$ ! !!$ call Rad15mNLTEInit !!$ end select select case ( IDRadMethod ) case ( IDRadMethodMarsV1 ) ! 火星計算用近赤外加熱率計算 ! Calculation of near infrared heating rate in the case of Mars ! call RadMarsNIRInit end select ! 鉛直拡散フラックス (Mellor and Yamada, 1974) ! Vertical diffusion flux (Mellor and Yamada, 1974) ! call VDiffusionInit ! 地表面フラックス (バルク法) ! Surface flux (Bulk method) ! call SurfaceFluxInit ! 放射関連ルーチン ! Routines for radiation calculation ! call RadUtilsInit end select ! 地面温度・土壌温度・土壌水分・積雪量の積分 ! Time integration of surface temperature, soil temperature, soil moisture, ! and surface snow amount ! select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) ! 地面温度, 土壌温度の時間積分 ! Time integration of surface temperature and soil temperature ! call IntgSurfTempInit select case ( IDSfcMoistMethod ) case ( IDSfcMoistMethodBucket ) ! バケツモデル ! Bucket model ! call BucketModelInit( FlagSnow ) end select end select ! 力学過程 ! Dynamical core ! select case ( IDDynMode ) case ( IDDynModeHSPLVAS83 ) ! 力学過程 (スペクトル法, Arakawa and Suarez (1983)) ! Dynamical process (Spectral method, Arakawa and Suarez (1983)) ! call DynamicsHSplVAS83Init case ( IDDynModeNoHorAdv ) ! 物理過程のみの計算のための力学過程 ! A dynamics for calculation with physical processes only ! call DynamicsPhysicsOnlyInit case ( IDDynModeTWPICE ) ! ! Dynamical process for TWP-ICE experiment ! call DynamicsTWPICESCMExpInit end select select case ( IDPhysMode ) case ( IDPhysModeJupiterSimple ) ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit select case ( IDDCMethod ) case ( IDDCMethodDCA ) ! 乾燥対流調節 ! Dry convective adjustment ! call DryConvAdjustInit end select case ( IDPhysModeJupiterSimpleV2 ) ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit ! 湿潤対流調節 ! Moist convective adjustment ! call MoistConvAdjustInit ! 大規模凝結 (非対流性凝結) (Manabe, 1965) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! call LScaleCondInit( FlagSnow ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) select case ( IDDCMethod ) case ( IDDCMethodDCA ) ! 乾燥対流調節 ! Dry convective adjustment ! call DryConvAdjustInit end select ! 質量の補正 ! Mass fixer ! call MassFixerInit case ( IDPhysModeFullPhysics ) ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit select case ( IDMCMethod ) case ( IDMCMethodMCA ) ! 湿潤対流調節 ! Moist convective adjustment ! call MoistConvAdjustInit case ( IDMCMethodRAS ) ! Relaxed Arakawa-Schubert scheme ! Relaxed Arakawa-Schubert scheme ! call RASInit case ( IDMCMethodRASWithIce ) ! Relaxed Arakawa-Schubert scheme ! Relaxed Arakawa-Schubert scheme ! call RASInit end select select case ( IDLSCMethod ) case ( IDLSCMethodM65 ) ! 大規模凝結 (非対流性凝結) (Manabe, 1965) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! call LScaleCondInit( FlagSnow ) !!$ case ( IDLSCMethodLL91 ) !!$ ! 大規模凝結 (非対流性凝結) (Le Treut and Li, 1991) !!$ ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) !!$ ! !!$ call LScaleCondLL91Init case ( IDLSCMethodSatAdjM65 ) ! != Saturation adjustment ! if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if call SaturationAdjustInit( FlagSnow ) case ( IDLSCMethodM65WithIce ) ! 大規模凝結 (非対流性凝結) (Manabe, 1965) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! call LScaleCondInit( FlagSnow ) case ( IDLSCMethodLL91WithIce ) ! 大規模凝結 (非対流性凝結) (Le Treut and Li, 1991) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! call LScaleCondInit( FlagSnow ) end select ! ! Cloud model ! select case ( IDCloudMethod ) case ( IDCloudMethodNone ) ! 雲なしモデル ! No cloud model ! call CloudNoneInit( FlagSnow ) case ( IDCloudMethodSimple ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) case ( IDCloudMethodSimpleWithIce ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) case ( IDCloudMethodT1993WithIce ) ! Tiedtke (1993) に基づく雲モデル ! Cloud model based on Tiedtke (1993) ! call CloudT1993baseInit( FlagSnow ) case ( IDCloudMethodMarsH2OCloud ) ! 火星 H2O 雲モデル ! Mars H2O cloud model ! call CloudMarsH2OInit end select select case ( IDSfcMoistMethod ) case ( IDSfcMoistMethodBucket ) ! バケツモデル ! Bucket model ! call BucketModelInit( FlagSnow ) end select select case ( IDDCMethod ) case ( IDDCMethodDCA ) ! 乾燥対流調節 ! Dry convective adjustment ! call DryConvAdjustInit end select ! 重力沈降過程 ! Gravitational sedimentation process ! call GravSedInit ! 主成分相変化 ! Phase change of atmospheric major component ! call MajorCompPhaseChangeInit( FlagMajCompPhaseChange, CondMajCompName ) ! 質量の補正 ! Mass fixer ! call MassFixerInit end select ! タイムフィルター (Asselin, 1972) ! Time filter (Asselin, 1972) ! !!$ call TimeFiltInit ! 時間フィルター (Williams, 2009) ! Time filter (Williams, 2009) ! call TimeFilterWilliams2009Init ! 予報変数の値の確認 ! Check values of prognostic variables ! call CheckProgVarsInit ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit ! ! End of initialization ! ! 初回だけはオイラー法を用いるため, Δt を半分に ! Delta t is reduced to half in order to use Euler method at initial step ! if ( flag_initial ) then call TimesetDelTimeHalf end if end subroutine MainInit !------------------------------------------------------------------- subroutine MainTerminate ! ! 主プログラムの終了処理手続き. ! ! Termination procedure for the main program. ! ! モジュール引用 ; USE statements ! ! MPI ! use mpi_wrapper, only : MPIWrapperFinalize ! 力学過程 (スペクトル法, Arakawa and Suarez (1983)) ! Dynamical process (Spectral method, Arakawa and Suarez (1983)) ! use dynamics_hspl_vas83, only : DynamicsHSplVAS83Finalize ! ! Dynamical process for TWP-ICE experiment ! use dynamics_twpice_scm_exp, only : DynamicsTWPICESCMExpFinalize ! Held and Suarez (1994) による強制と散逸 ! Forcing and dissipation suggested by Held and Suarez (1994) ! use held_suarez_1994, only: Hs94Finalize ! 放射フラックス (バンドモデル) ! Radiation flux (band model) ! use rad_DennouAGCM, only: RadDennouAGCMFinalize ! 座標データ設定 ! Axes data settings ! use axesset, only: AxessetFinalize ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! use auxiliary, only: AuxVarsFinalize ! 時刻管理 ! Time control ! use timeset, only: TimesetClose ! リスタートデータ入出力 ! Restart data input/output ! use restart_file_io, only: RestartFileClose ! 地表面温度リスタートデータ入出力 ! Restart data of surface temperature input/output ! use restart_surftemp_io, only: RestartSurfTempClose ! ヒストリデータ出力 ! History data output ! use history_file_io, only: HistoryFileClose ! 宣言文 ; Declaration statements ! implicit none ! 実行文 ; Executable statement ! ! リスタートデータファイルクローズ ! Close restart data file ! call RestartFileClose if ( IDPhysMode == IDPhysModeFullPhysics ) then ! 地表面温度リスタートデータファイルクローズ ! Close restart data file of surface temperature ! call RestartSurfTempClose end if ! ヒストリデータファイルクローズ ! Close history data files ! call HistoryFileClose ! 予報変数の割付解除 ! Deallocation of prediction variables ! deallocate( xyz_UB ) deallocate( xyz_VB ) deallocate( xyz_TempB ) deallocate( xyzf_QMixB ) deallocate( xy_PsB ) deallocate( xyz_UN ) deallocate( xyz_VN ) deallocate( xyz_TempN ) deallocate( xyzf_QMixN ) deallocate( xy_PsN ) deallocate( xyz_UA ) deallocate( xyz_VA ) deallocate( xyz_TempA ) deallocate( xyzf_QMixA ) deallocate( xy_PsA ) ! 診断変数の割付解除 ! Dellocation of diagnostic variables ! deallocate( xyz_DUDt ) deallocate( xyz_DVDt ) deallocate( xyz_DTempDt ) deallocate( xyzf_DQMixDt ) deallocate( xyz_DTurKinEneDt ) deallocate( xyz_OMG ) deallocate( xy_SurfHeight ) deallocate( xyz_Height ) if ( IDPhysMode == IDPhysModeFullPhysics ) then deallocate( xy_SurfAlbedo ) deallocate( xy_SurfHumidCoef ) deallocate( xy_SurfRoughLenMom ) deallocate( xy_SurfRoughLenHeat ) deallocate( xy_SurfHeatCapacity ) deallocate( xy_SeaIceConc ) deallocate( xy_SurfCond ) deallocate( xy_SurfType ) deallocate( xy_DeepSubSurfHeatFlux ) deallocate( xy_SoilHeatCap ) deallocate( xy_SoilHeatDiffCoef ) deallocate( xy_SurfHeightStd ) deallocate( xy_SnowFrac ) !!$ deallocate( xy_FlagMatthewsLand ) deallocate( xy_PhyImplSDHIndexCalcMethod ) deallocate( xy_BucketFlagOceanGrid ) deallocate( xyr_Temp ) deallocate( xyz_VirTemp ) deallocate( xyr_VirTemp ) deallocate( xy_SurfVirTemp ) deallocate( xyz_Press ) deallocate( xyr_Press ) deallocate( xyr_Height ) deallocate( xyz_Exner ) deallocate( xyr_Exner ) deallocate( xyr_RadLFlux ) deallocate( xyr_RadLFluxA ) deallocate( xyr_RadLUwFlux ) deallocate( xyr_RadLDwFlux ) deallocate( xyr_RadSFlux ) deallocate( xyr_RadSUwFlux ) deallocate( xyr_RadSDwFlux ) deallocate( xyra_DelRadLUwFlux ) deallocate( xyra_DelRadLDwFlux ) deallocate( xyr_MomFluxX ) deallocate( xyr_MomFluxY ) deallocate( xyr_HeatFlux ) deallocate( xyrf_QMixFlux ) deallocate( xy_SurfMomFluxX ) deallocate( xy_SurfMomFluxY ) deallocate( xy_SurfHeatFlux ) deallocate( xyf_SurfQMixFlux ) deallocate( xy_SurfH2OVapFluxA ) deallocate( xy_SurfLatentHeatFluxA ) deallocate( xyr_SoilHeatFlux ) deallocate( xyr_VelDiffCoef ) deallocate( xyr_TempDiffCoef ) deallocate( xyr_QMixDiffCoef ) deallocate( xy_SurfVelTransCoef ) deallocate( xy_SurfTempTransCoef ) deallocate( xy_SurfQVapTransCoef ) deallocate( xy_SurfMOLength ) deallocate( xy_DSurfTempDt ) deallocate( xyz_DSoilTempDt ) deallocate( xy_DPsDt ) deallocate( xy_DSurfMajCompIceDt ) deallocate( xy_DSoilMoistDt ) deallocate( xy_DSurfSnowDt ) deallocate( xyz_DTempDtVDiff ) deallocate( xyz_DUDtGWD ) deallocate( xyz_DVDtGWD ) deallocate( xyz_DTempDtRadL ) deallocate( xyz_DTempDtRadS ) deallocate( xy_Rain ) deallocate( xy_RainCumulus ) deallocate( xy_RainLsc ) deallocate( xy_SnowCumulus ) deallocate( xy_SnowLsc ) deallocate( xyz_DTempDtCum ) deallocate( xyz_DQVapDtCum ) deallocate( xyz_DQH2OLiqDtCum ) deallocate( xyz_DQH2OSolDtCum ) deallocate( xyz_DUDtCum ) deallocate( xyz_DVDtCum ) deallocate( xyz_DQH2OLiqDtLSC ) deallocate( xyz_DQH2OSolDtLSC ) deallocate( xyz_MoistConvDetTend ) deallocate( xyz_MoistConvSubsidMassFlux ) deallocate( xyz_QH2OLiqforRad ) deallocate( xyz_QH2OSolforRad ) deallocate( xyz_CloudCoverforRad ) end if ! FlagFullPhysics select case ( IDDynMode ) case ( IDDynModeHSPLVAS83 ) ! 各モジュール内の変数の割付解除 ! Dellocation of variables in modules ! call DynamicsHSplVAS83Finalize case ( IDDynModeNoHorAdv ) case ( IDDynModeTWPICE ) ! ! Dynamical process for TWP-ICE experiment ! call DynamicsTWPICESCMExpFinalize end select call AuxVarsFinalize select case ( IDPhysMode ) case ( IDPhysModeHS94 ) call Hs94Finalize end select select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) ! 割付解除とリスタートファイルの終了処理 ! Dellocation and close a restart file ! call RadDennouAGCMFinalize end select call AxessetFinalize ! 時刻管理終了処理 ! Termination of time control ! call TimesetClose ! Finalize MPI ! call MPIWrapperFinalize end subroutine MainTerminate end program dcpam_main
Subroutine : |
主プログラムの初期化手続き.
Initialization procedure for the main program.
This procedure input/output NAMELIST#dcpam_main_nml .
subroutine MainInit ! ! 主プログラムの初期化手続き. ! ! Initialization procedure for the main program. ! ! MPI ! use mpi_wrapper, only : MPIWrapperInit use dc_message, only: MessageNotify ! コマンドライン引数処理 ! Command line option parser ! use option_parser, only: OptParseInit ! NAMELIST ファイル入力に関するユーティリティ ! Utilities for NAMELIST file input ! use namelist_util, only: NmlutilInit, NmlutilMsg ! 時刻管理 ! Time control ! use timeset, only: TimesetInit, TimesetDelTimeHalf, TimeN ! ステップ $ t $ の時刻. Time of step $ t $. ! 出力ファイルの基本情報管理 ! Management basic information for output files ! use fileset, only: FilesetInit ! 格子点設定 ! Grid points settings ! use gridset, only: GridsetInit, imax, jmax, kmax, kslmax ! 地下の鉛直層数. ! Number of subsurface vertical level ! 組成に関わる配列の設定 ! Settings of array for atmospheric composition ! use composition, only: CompositionInit ! 物理定数設定 ! Physical constants settings ! use constants, only: ConstantsInit ! 雪と海氷の定数の設定 ! Setting constants of snow and sea ice ! use constants_snowseaice, only: ConstantsSnowSeaIceInit ! 座標データ設定 ! Axes data settings ! use axesset, only: AxessetInit ! リスタートデータ入出力 ! Restart data input/output ! use restart_file_io, only: RestartFileInit, RestartFileOpen, RestartFileGet ! 地表面温度リスタートデータ入出力 ! Restart data of surface temperature input/output ! use restart_surftemp_io, only: RestartSurfTempInit, RestartSurfTempOpen, RestartSurfTempGet ! ヒストリデータ出力 ! History data output ! use history_file_io, only: HistoryFileOpen use gtool_historyauto, only: HistoryAutoAddVariable, HistoryAutoPut ! 種別型パラメタ ! Kind type parameter ! use dc_types, only: STDOUT ! 標準出力の装置番号. Unit number of standard output ! ファイル入出力補助 ! File I/O support ! use dc_iounit, only: FileOpen ! 時系列データの読み込み ! Reading time series ! use read_time_series, only : ReadTimeSeriesInit ! 地表面データ提供 ! Prepare surface data ! use surface_data, only : SurfDataInit ! ファイルから 1 次元プロファイルを読んで設定する. ! read 1-D profile from a file and set it ! use set_1d_profile, only : Set1DProfileInit ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! use auxiliary, only : AuxVarsInit, AuxVars ! Held and Suarez (1994) による強制と散逸 ! Forcing and dissipation suggested by Held and Suarez (1994) ! use held_suarez_1994, only : HS94Init ! Yamamoto and Takahashi (2003) に従った簡単金星計算のための強制 ! forcing for simple Venus calculation following Yamamoto and Takahashi (2003) ! use yt2003_forcing, only : YT2003ForcingInit ! 惑星表面データの設定 ! Setting planetary surface properties ! use surface_properties, only : SurfacePropertiesInit ! 雪, 氷の割合 ! snow/ice fraction ! use snowice_frac, only : SnowIceFracInit ! 地下における熱の鉛直拡散 ! Vertical diffusion of heat under the ground ! use subsurface_diffusion_heat, only : SubsurfaceDiffusionInit ! 陰解法による時間積分 ! Time integration with implicit scheme ! use phy_implicit, only : PhyImplInit ! 地下熱伝導モデルを用いた場合の陰解法による時間積分 ! ! Time integration by using implicit scheme in case using subsurface thermal diffusion model use phy_implicit_sdh, only : PhyImplSDHInit !!$ ! 地下熱伝導モデルを用いた場合の陰解法による時間積分 !!$ ! !!$ ! Time integration by using implicit scheme in case using subsurface thermal diffusion model !!$ use phy_implicit_sdh_V2, only : PhyImplSDHV2Init ! 地下熱伝導モデルを用いた場合の陰解法による時間積分 ! ! Time integration by using implicit scheme in case using subsurface thermal diffusion model use phy_implicit_sdh_V3, only : PhyImplSDHV3Init ! 陰解法による時間積分 (大気のみ / 惑星表面温度・土壌温度計算なし) ! Time integration by using implicit scheme in case without calculation of surface and soil temperature ! use phy_implicit_atmonly, only : PhyImplAtmOnlyInit ! 陰解法による時間積分のためのルーチン ! Routines for time integration with implicit scheme ! use phy_implicit_utils, only : PhyImplUtilsInit ! バケツモデル ! Bucket model ! use Bucket_Model, only : BucketModelInit ! 放射フラックス (GFD 電脳倶楽部開発の放射モデル) ! Radiation flux (radiation model developed by GFD Dennou Club) ! use rad_DennouAGCM, only : RadDennouAGCMInit ! 地球大気向け放射モデル Ver. 2 ! radiation model for the Earth's atmosphere Ver. 2 ! use rad_Earth_V2, only : RadEarthV2Init ! wrapper of RRTMG ! wrapper of RRTMG ! use rad_rrtmg_wrapper, only : RadRRTMGWrapperInit ! 火星大気向け放射モデル Ver. 1 ! radiation model for the Mars' atmosphere Ver. 1 ! use rad_Mars_V1, only : RadMarsV1Init !!$ ! (火星大気向け) Non-LTE 放射モデル !!$ ! Non-NLTE radiation model (for the Mars' atmosphere) !!$ ! !!$ use rad_15m_NLTE, only: Rad15mNLTEInit ! 火星計算用近赤外加熱率計算 ! Calculation of near infrared heating rate in the case of Mars ! use rad_Mars_NIR, only : RadMarsNIRInit ! Schneider and Liu (2009) の放射モデル ! Radiation model by Schneider and Liu (2009) ! use rad_SL09, only : RadSL09Init ! 簡単放射モデル ! Simple radiation model ! use rad_simple, only : RadSimpleInit ! 何もしない放射モデル ! radiation model with no absorption and no scattering ! use rad_none, only : RadNoneInit ! 放射関連ルーチン ! Routines for radiation calculation ! use rad_utils, only : RadUtilsInit ! 鉛直拡散フラックス ! Vertical diffusion flux ! use vdiffusion_my, only : VDiffusionInit ! JMA 乱流混合モジュール ! JMA turbulent mixing module ! use vdiffusion_jma_my_wrapper, only : VDiffusionJMAInit ! Schneider and Liu (2009) による鉛直混合課程 ! Vertical diffusion by Schneider and Liu (2009) ! use sl09_diffusion, only : SL09DiffusionInit ! Gravity wave drag by McFarlane (1987) ! Gravity wave drag by McFarlane (1987) ! use gwd_m1987, only : GWDM1987Init ! 雲なしモデル ! No cloud model ! use cloud_none, only : CloudNoneInit ! 簡単雲モデル ! Simple cloud ! use cloud_simple, only: CloudSimpleInit ! Tiedtke (1993) に基づく雲モデル ! Cloud model based on Tiedtke (1993) ! use cloud_T1993base, only : CloudT1993baseInit ! 火星 H2O 雲モデル ! Mars H2O cloud model ! use cloud_mars_h2o, only : CloudMarsH2OInit ! 地表面フラックス (バルク法) ! Surface flux (Bulk method) ! use surface_flux_bulk, only : SurfaceFluxInit ! ! set dust flux ! !!$ use set_dust_flux, only : SetDustFluxInit ! 下部境界フラックス ! Lower boundary flux ! use lb_flux_simple, only : LBFluxSimpleInit ! 地面温度, 土壌温度の時間積分 ! Time integration of surface temperature and soil temperature ! use intg_surftemp, only : IntgSurfTempInit ! 力学過程 (スペクトル法, Arakawa and Suarez (1983)) ! Dynamical process (Spectral method, Arakawa and Suarez (1983)) ! use dynamics_hspl_vas83, only : DynamicsHSplVAS83Init ! 物理過程のみの計算のための力学過程 ! A dynamics for calculation with physical processes only ! use dynamics_physicsonly, only : DynamicsPhysicsOnlyInit ! ! Dynamical process for TWP-ICE experiment ! use dynamics_twpice_scm_exp, only : DynamicsTWPICESCMExpInit ! 湿潤対流調節 ! Moist convective adjustment ! use moist_conv_adjust, only : MoistConvAdjustInit ! Relaxed Arakawa-Schubert scheme ! Relaxed Arakawa-Schubert scheme ! use relaxed_arakawa_schubert, only : RASInit ! 大規模凝結 (非対流性凝結) ! Large scale condensation (non-convective condensation) ! use lscond, only : LScaleCondInit ! 大規模凝結 (非対流性凝結) (Le Treut and Li, 1991) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! !!$ use lscond_LL91, only : LScaleCondLL91Init ! != Saturation adjustment ! use saturation_adjust, only : SaturationAdjustInit ! 乾燥対流調節 ! Dry convective adjustment ! use dry_conv_adjust, only : DryConvAdjustInit ! 重力沈降過程 ! Gravitational sedimentation process ! use grav_sed, only : GravSedInit ! 主成分相変化 ! Phase change of atmospheric major component ! use major_comp_phase_change, only : MajorCompPhaseChangeInit ! タイムフィルター (Asselin, 1972) ! Time filter (Asselin, 1972) ! use timefilter_asselin1972, only : TimeFiltInit ! 時間フィルター (Williams, 2009) ! Time filter (Williams, 2009) ! use timefilter_williams2009, only: TimeFilterWilliams2009Init ! 予報変数の値の確認 ! Check values of prognostic variables ! use check_prog_vars, only : CheckProgVarsInit ! 質量の補正 ! Mass fixer ! use mass_fixer, only : MassFixerInit ! Output frequently used variables ! Output frequently used variables ! use output_freq_used_vars, only : OutputFreqUsedVarsInit ! 宣言文 ; Declaration statements ! implicit none character(*), parameter:: version = '$Name: $' // '$Id: dcpam_main.f90,v 1.67 2015/03/11 04:54:54 yot Exp $' ! 主プログラムのバージョン ! Main program version character(STRING) :: namelist_filename ! NAMELIST ファイルの名称. ! NAMELIST file name character(STRING) :: DynMode ! Dynamics used in calculation character(STRING) :: PhysMode ! Physics used in calculation character(STRING) :: RadModel ! Radiation model used in calculation character(STRING) :: SfcFluxMethod ! Method for surface flux evaluation used in calculation character(STRING) :: VDiffMethod ! Method for vertical diffusion evaluation used in calculation character(STRING) :: PhysImpMode ! Mode for implicit method used in calculation character(STRING) :: MCMethod ! Moist convection parameterization character(STRING) :: LSCMethod ! Large scale condensation parameterization character(STRING) :: CloudMethod ! Cloud model character(STRING) :: SfcMoistMethod ! Surface moist model character(STRING) :: GWDMethod ! Gravity wave drag character(STRING) :: DCMethod ! Dry convection logical :: FlagPhysImpSoilModelSO ! flag for use of slab ocean logical :: FlagSnow ! flag for treating snow logical :: FlagMajCompPhaseChange ! flag for use of major component phase change character(STRING):: CondMajCompName ! name of condensable major component character(STRING):: briefexpldyn ! 実行ファイルの簡潔な説明 (力学過程) ! Brief account of executable file (dynamics) character(STRING):: briefexplphy ! 実行ファイルの簡潔な説明 (物理過程) ! Brief account of executable file (physics) character(STRING):: briefexplrad ! 実行ファイルの簡潔な説明 (放射過程) ! Brief account of executable file (radiation) character(STRING):: briefexplsfcflux ! 実行ファイルの簡潔な説明 (惑星表面フラックス) ! Brief account of executable file (surface flux) character(STRING):: briefexplvdiff ! 実行ファイルの簡潔な説明 (鉛直拡散過程) ! Brief account of executable file (vertical diffusion) character(STRING):: briefexplimp ! 実行ファイルの簡潔な説明 (陰解法方程式構築方法) ! Brief account of executable file (implicit method) logical:: FlagBucketModel integer:: unit_nml ! NAMELIST ファイルオープン用装置番号. ! Unit number for NAMELIST file open integer:: iostat_nml ! NAMELIST 読み込み時の IOSTAT. ! IOSTAT of NAMELIST read integer:: n ! 組成方向に回る DO ループ用作業変数 ! Work variables for DO loop in dimension of constituents ! NAMELIST 変数群 ! NAMELIST group name ! namelist /dcpam_main_nml/ DynMode, PhysMode, RadModel, SfcFluxMethod, VDiffMethod, PhysImpMode, MCMethod, LSCMethod, CloudMethod, SfcMoistMethod, GWDMethod, DCMethod, FlagSnow, FlagMajCompPhaseChange, CondMajCompName ! ! デフォルト値については初期化手続 "main/dcpam_main.F90#MainInit" ! のソースコードを参照のこと. ! ! Refer to source codes in the initialization procedure ! "main/dcpam_main.F90#MainInit" for the default values. ! ! 実行文 ; Executable statement ! ! Initialize MPI ! call MPIWrapperInit ! コマンドライン引数処理 ! Command line option parser ! call OptParseInit( namelist_filename, prog_name ) ! NAMELIST ファイル名入力 ! Input NAMELIST file name ! call NmlutilInit( namelist_filename ) ! デフォルト値の設定 ! Default values settings ! DynMode = 'HSPLVAS83' !!$ DynMode = 'NoHorAdv' PhysMode = 'FullPhysics' !!$ PhysMode = 'HS94' !!$ PhysMode = 'VenusSimple' !!$ PhysMode = 'JupiterSimple' !!$ PhysMode = 'NoPhysics' RadModel = 'DennouAGCM' !!$ RadModel = 'Earth' !!$ RadModel = 'Mars' !!$ RadModel = 'SL09' SfcFluxMethod = 'L82' !!$ SfcFluxMethod = 'BH91B94' VDiffMethod = 'MY2' !!$ VDiffMethod = 'MY2.5' PhysImpMode = '1LayModel' !!$ PhysImpMode = 'SoilModel' !!$ PhysImpMode = 'SoilModelSO' !!$ PhysImpMode = 'AtmOnly' !!$ MCMethod = 'None' MCMethod = 'MCA' !!$ MCMethod = 'RAS' !!$ LSCMethod = 'None' LSCMethod = 'M65' !!$ LSCMethod = 'M65WithIce' !!$ LSCMethod = 'LL91' !!$ LSCMethod = 'LL91WithIce' CloudMethod = 'None' !!$ CloudMethod = 'Simple' !!$ CloudMethod = 'T1993WithIce' SfcMoistMethod = 'None' !!$ SfcMoistMethod = 'Bucket' GWDMethod = 'None' !!$ GWDMethod = 'M1987' !!$ DCMethod = 'None' DCMethod = 'DCA' FlagSnow = .false. FlagMajCompPhaseChange = .false. CondMajCompName = '' !!$ CondMajCompName = 'CO2' ! 計算モードの設定 ! Configure calculation mode ! if ( trim(namelist_filename) /= '' ) then call FileOpen( unit_nml, namelist_filename, mode = 'r' ) ! (in) rewind( unit_nml ) read( unit_nml, nml = dcpam_main_nml, iostat = iostat_nml ) ! (out) close( unit_nml ) call NmlutilMsg( iostat_nml, prog_name ) ! (in) if ( iostat_nml == 0 ) write( STDOUT, nml = dcpam_main_nml ) end if ! Identification of calculation method for dynamics ! call MessageNotify( 'M', prog_name, 'DynMode=<%c>.', c1 = trim(DynMode) ) ! select case ( DynMode ) case ( 'HSPLVAS83' ) IDDynMode = IDDynModeHSPLVAS83 case ( 'NoHorAdv' ) IDDynMode = IDDynModeNoHorAdv case ( 'TWPICE' ) IDDynMode = IDDynModeTWPICE case default call MessageNotify( 'E', prog_name, 'DynMode=<%c> is not supported.', c1 = trim(DynMode) ) end select ! Identification of calculation method for physics ! call MessageNotify( 'M', prog_name, 'PhysMode=<%c>.', c1 = trim(PhysMode) ) ! select case ( PhysMode ) case ( 'FullPhysics' ) IDPhysMode = IDPhysModeFullPhysics case ( 'HS94' ) IDPhysMode = IDPhysModeHS94 case ( 'VenusSimple' ) IDPhysMode = IDPhysModeVenusSimple case ( 'JupiterSimple' ) IDPhysMode = IDPhysModeJupiterSimple case ( 'JupiterSimpleV2' ) IDPhysMode = IDPhysModeJupiterSimpleV2 case ( 'NoPhysics' ) IDPhysMode = IDPhysModeNoPhysics case default call MessageNotify( 'E', prog_name, 'PhysMode=<%c> is not supported.', c1 = trim(PhysMode) ) end select ! Identification of calculation method for radiation ! call MessageNotify( 'M', prog_name, 'RadModel=<%c>.', c1 = trim(RadModel) ) ! select case ( RadModel ) case ( 'DennouAGCM' ) IDRadMethod = IDRadMethodDennouAGCM case ( 'Earth' ) IDRadMethod = IDRadMethodEarthV2 case ( 'Mars' ) IDRadMethod = IDRadMethodMarsV1 case ( 'SL09' ) IDRadMethod = IDRadMethodSL09 !!$ case ( 'VenusSimple' ) !!$ IDRadMethod = IDRadMethodVenusSimple case ( 'Simple' ) IDRadMethod = IDRadMethodSimple case ( 'RRTMG' ) IDRadMethod = IDRadMethodRRTMG case ( 'none' ) IDRadMethod = IDRadMethodNone case default call MessageNotify( 'E', prog_name, 'RadModel=<%c> is not supported.', c1 = trim(RadModel) ) end select ! Identification of calculation method for surface flux ! call MessageNotify( 'M', prog_name, 'SfcFluxMethod=<%c>.', c1 = trim(SfcFluxMethod) ) ! select case ( SfcFluxMethod ) case ( 'L82' ) IDSfcFluxMethod = IDSfcFluxMethodL82 case ( 'BH91B94' ) IDSfcFluxMethod = IDSfcFluxMethodBH91B94 case default call MessageNotify( 'E', prog_name, 'SfcFluxMethod=<%c> is not supported.', c1 = trim(SfcFluxMethod) ) end select ! Identification of calculation method for vertical diffusion ! call MessageNotify( 'M', prog_name, 'VDiffMethod=<%c>.', c1 = trim(VDiffMethod) ) ! select case ( VDiffMethod ) case ( 'MY2' ) IDVDiffMethod = IDVDiffMethodMY2 case ( 'MY2.5' ) IDVDiffMethod = IDVDiffMethodMY25 case ( 'JMA' ) IDVDiffMethod = IDVDiffMethodJMA case default call MessageNotify( 'E', prog_name, 'VDiffMethod=<%c> is not supported.', c1 = trim(VDiffMethod) ) end select ! Identification of calculation method for solving simultaneous linear equations ! of physics ! call MessageNotify( 'M', prog_name, 'PhysImpMode=<%c>.', c1 = trim(PhysImpMode) ) ! select case ( PhysImpMode ) case ( '1LayModel' ) IDPhyTendMethod = IDPhyTendMethodImp1LayModel FlagPhysImpSoilModelSO = .false. case ( 'SoilModel' ) IDPhyTendMethod = IDPhyTendMethodImpSoilModel FlagPhysImpSoilModelSO = .false. case ( 'SoilModelSO' ) IDPhyTendMethod = IDPhyTendMethodImpSoilModel FlagPhysImpSoilModelSO = .true. case ( 'AtmOnly' ) IDPhyTendMethod = IDPhyTendMethodImpAtmOnly FlagPhysImpSoilModelSO = .false. case default call MessageNotify( 'E', prog_name, 'PhysImpMode=<%c> is not supported.', c1 = trim(PhysImpMode) ) end select ! ! Check for value of FlagFullPhysics ! if ( ( IDPhysMode /= IDPhysModeFullPhysics ) .and. ( IDPhyTendMethod == IDPhyTendMethodImpSoilModel ) ) then call MessageNotify( 'E', prog_name, 'PhysMode has to be "FullPhysics" true, when PhyImpMode is "SoilModel" or "SoilModelSO".' ) end if if ( ( IDPhysMode /= IDPhysModeFullPhysics ) .and. ( IDPhyTendMethod == IDPhyTendMethodImpAtmOnly ) ) then call MessageNotify( 'E', prog_name, 'PhysMode has to be "FullPhysics" true, when PhyImpMode is "AtmOnly".' ) end if ! Identification of calculation method for moist convection ! call MessageNotify( 'M', prog_name, 'MCMethod=<%c>.', c1 = trim(MCMethod) ) ! select case ( MCMethod ) case ( 'None' ) IDMCMethod = IDMCMethodNone case ( 'MCA' ) IDMCMethod = IDMCMethodMCA case ( 'RAS' ) IDMCMethod = IDMCMethodRAS case ( 'RASWithIce' ) IDMCMethod = IDMCMethodRASWithIce case default call MessageNotify( 'E', prog_name, 'MCMethod=<%c> is not supported.', c1 = trim(MCMethod) ) end select ! Identification of calculation method for large scale condensation ! call MessageNotify( 'M', prog_name, 'LSCMethod=<%c>.', c1 = trim(LSCMethod) ) ! select case ( LSCMethod ) case ( 'None' ) IDLSCMethod = IDLSCMethodNone case ( 'M65' ) IDLSCMethod = IDLSCMethodM65 !!$ case ( 'LL91' ) !!$ IDLSCMethod = IDLSCMethodLL91 case ( 'SatAdjM65' ) IDLSCMethod = IDLSCMethodSatAdjM65 case ( 'M65WithIce' ) IDLSCMethod = IDLSCMethodM65WithIce case ( 'LL91WithIce' ) IDLSCMethod = IDLSCMethodLL91WithIce case default call MessageNotify( 'E', prog_name, 'LSCMethod=<%c> is not supported.', c1 = trim(LSCMethod) ) end select ! Identification of calculation method for cloud ! call MessageNotify( 'M', prog_name, 'CloudMethod=<%c>.', c1 = trim(CloudMethod) ) ! select case ( CloudMethod ) case ( 'None' ) IDCloudMethod = IDCloudMethodNone case ( 'Simple' ) IDCloudMethod = IDCloudMethodSimple case ( 'SimpleWithIce' ) IDCloudMethod = IDCloudMethodSimpleWithIce case ( 'T1993WithIce' ) IDCloudMethod = IDCloudMethodT1993WithIce case ( 'MarsH2OCloud' ) IDCloudMethod = IDCloudMethodMarsH2OCloud case default call MessageNotify( 'E', prog_name, 'LSCloudMethod=<%c> is not supported.', c1 = trim(CloudMethod) ) end select ! check a non-convective condensation if ( IDCloudMethod == IDCloudMethodT1993WithIce ) then if ( IDLSCMethod /= IDLSCMethodNone ) then call MessageNotify( 'E', prog_name, 'If CloudMethod="T1993WithIce", LscMethod has to be "None".' ) end if end if ! Identification of calculation method for surface moisture ! call MessageNotify( 'M', prog_name, 'SfcMoistMethod=<%c>.', c1 = trim(SfcMoistMethod) ) ! select case ( SfcMoistMethod ) case ( 'None' ) IDSfcMoistMethod = IDSfcMoistMethodNone FlagBucketModel = .false. case ( 'Bucket' ) IDSfcMoistMethod = IDSfcMoistMethodBucket FlagBucketModel = .true. case default call MessageNotify( 'E', prog_name, 'SfcMoistMethod=<%c> is not supported.', c1 = trim(SfcMoistMethod) ) end select ! Identification of calculation method for gravity wave drag ! call MessageNotify( 'M', prog_name, 'GWDMethod=<%c>.', c1 = trim(GWDMethod) ) ! select case ( GWDMethod ) case ( 'None' ) IDGWDMethod = IDGWDMethodNone case ( 'M1987' ) IDGWDMethod = IDGWDMethodM1987 case default call MessageNotify( 'E', prog_name, 'GWDMethod=<%c> is not supported.', c1 = trim(GWDMethod) ) end select ! Identification of calculation method for dry convection ! call MessageNotify( 'M', prog_name, 'DCMethod=<%c>.', c1 = trim(DCMethod) ) ! select case ( DCMethod ) case ( 'None' ) IDDCMethod = IDDCMethodNone case ( 'DCA' ) IDDCMethod = IDDCMethodDCA case default call MessageNotify( 'E', prog_name, 'DCMethod=<%c> is not supported.', c1 = trim(DCMethod) ) end select ! 計算モードの表示 ! Display calculation mode ! select case ( IDDynMode ) case ( IDDynModeHSPLVAS83 ) briefexpldyn = 'used' case ( IDDynModeNoHorAdv ) briefexpldyn = 'not used' case ( IDDynModeTWPICE ) briefexpldyn = 'TWP-ICE' end select select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) briefexplphy = 'parameterization suite is used' case ( IDPhysModeHS94 ) briefexplphy = 'forcing for Held and Suarez (1994) dynamical core test' case ( IDPhysModeVenusSimple ) briefexplphy = 'simple forcing for a Venus-like planet' case ( IDPhysModeJupiterSimple ) briefexplphy = 'simple forcing for a Jupiter-like planet' case ( IDPhysModeJupiterSimpleV2 ) briefexplphy = 'simple forcing for a Jupiter-like planet Ver. 2' case ( IDPhysModeNoPhysics ) briefexplphy = 'not used' end select if ( IDPhysMode == IDPhysModeFullPhysics ) then select case ( IDRadMethod ) case ( IDRadMethodDennouAGCM ) briefexplrad = 'dennou AGCM5 default' case ( IDRadMethodEarthV2 ) briefexplrad = 'Earth' case ( IDRadMethodMarsV1 ) briefexplrad = 'Mars' case ( IDRadMethodSL09 ) briefexplrad = 'Schneider and Liu (2009) (Jupiter-like planet)' !!$ case ( IDRadMethodVenusSimple ) !!$ briefexplrad = 'Venus simple radiation model (tentative)' case ( IDRadMethodSimple ) briefexplrad = 'Simple radiation model (tentative)' case ( IDRadMethodRRTMG ) briefexplrad = 'RRTMG' case ( IDRadMethodNone ) briefexplrad = 'none' case default call MessageNotify( 'E', 'Unexpected error in setting briefexplrad', '' ) end select select case ( IDSfcFluxMethod ) case ( IDSfcFluxMethodL82 ) briefexplsfcflux = 'surface flux by the method of Louis et al. (1982)' case ( IDSfcFluxMethodBH91B94 ) briefexplsfcflux = 'surface flux by the method of Beljaars and Holtslag (1991), Beljaars (1994)' case default call MessageNotify( 'E', 'Unexpected error in setting briefexplsfcflux', '' ) end select select case ( IDVDiffMethod ) case ( IDVDiffMethodMY2 ) briefexplvdiff = 'vertical diffusion with the method of Mellor and Yamada level 2' case ( IDVDiffMethodMY25 ) briefexplvdiff = 'vertical diffusion with the method of Mellor and Yamada level 2.5' case ( IDVDiffMethodJMA ) briefexplvdiff = 'vertical diffusion with the method of JMA physical library of Mellor and Yamada'! level 2.5' case default call MessageNotify( 'E', 'Unexpected error in setting briefexplvdiff', '' ) end select select case ( IDPhyTendMethod ) case ( IDPhyTendMethodImp1LayModel ) briefexplimp = 'system with surface 1 layer model' case ( IDPhyTendMethodImpSoilModel ) briefexplimp = 'system with thermal diffusion soil model' case ( IDPhyTendMethodImpAtmOnly ) briefexplimp = 'system only with atmosphere' case default call MessageNotify( 'E', 'Unexpected error in setting briefexplimp', '' ) end select else briefexplrad = '' end if call MessageNotify( 'M', prog_name, '' ) call MessageNotify( 'M', prog_name, '+-------------------------------------' ) call MessageNotify( 'M', prog_name, '| Dynamics: %c', c1 = trim(briefexpldyn) ) call MessageNotify( 'M', prog_name, '| Physics : %c', c1 = trim(briefexplphy) ) if ( IDPhysMode == IDPhysModeFullPhysics ) then call MessageNotify( 'M', prog_name, '| Radiation model : %c', c1 = trim(briefexplrad) ) call MessageNotify( 'M', prog_name, '| Surface flux method : %c', c1 = trim(briefexplsfcflux) ) call MessageNotify( 'M', prog_name, '| Vertical diffusion method : %c', c1 = trim(briefexplvdiff) ) call MessageNotify( 'M', prog_name, '| Implicit method : %c', c1 = trim(briefexplimp) ) call MessageNotify( 'M', prog_name, '| Major component phase change : %b', l = (/ FlagMajCompPhaseChange /) ) end if call MessageNotify( 'M', prog_name, '| -- version = %c', c1 = trim(version) ) call MessageNotify( 'M', prog_name, '+-------------------------------------' ) call MessageNotify( 'M', prog_name, '' ) ! Initialization of modules used in this module ! ! 時刻管理 ! Time control ! call TimesetInit ! 出力ファイルの基本情報管理 ! Management basic information for output files ! call FilesetInit ! 格子点設定 ! Grid points settings ! call GridsetInit ! 組成に関わる配列の設定 ! Settings of array for atmospheric composition ! call CompositionInit ! 物理定数設定 ! Physical constants settings ! call ConstantsInit ! 雪と海氷の定数の設定 ! Setting constants of snow and sea ice ! call ConstantsSnowSeaIceInit ! 座標データ設定 ! Axes data settings ! call AxessetInit ! 時系列データの読み込み ! Reading time series ! call ReadTimeSeriesInit ! 地表面データ提供 ! Prepare surface data ! call SurfDataInit ! ファイルから 1 次元プロファイルを読んで設定する. ! read 1-D profile from a file and set it ! call Set1DProfileInit ! 予報変数の割付 ! Allocation of prediction variables ! allocate( xyz_UB (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_VB (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_TempB (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyzf_QMixB(0:imax-1, 1:jmax, 1:kmax, 1:ncmax) ) allocate( xy_PsB (0:imax-1, 1:jmax) ) allocate( xyz_UN (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_VN (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_TempN (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyzf_QMixN(0:imax-1, 1:jmax, 1:kmax, 1:ncmax) ) allocate( xy_PsN (0:imax-1, 1:jmax) ) allocate( xyz_UA (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_VA (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_TempA (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyzf_QMixA(0:imax-1, 1:jmax, 1:kmax, 1:ncmax) ) allocate( xy_PsA (0:imax-1, 1:jmax) ) ! リスタートデータ入力 ! Restart data input ! call RestartFileInit call RestartFileGet( xyz_UB, xyz_VB, xyz_TempB, xyzf_QMixB, xy_PsB, xyz_UN, xyz_VN, xyz_TempN, xyzf_QMixN, xy_PsN, flag_initial ) ! (out) optional select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) ! 地表面温度, 土壌温度の割付 ! Allocation of surface temperature and soil temperature ! allocate( xy_SurfTemp (0:imax-1, 1:jmax) ) allocate( xyz_SoilTemp(0:imax-1, 1:jmax, 1:kslmax) ) allocate( xy_SurfMajCompIceB(0:imax-1, 1:jmax) ) allocate( xy_SoilMoistB (0:imax-1, 1:jmax) ) allocate( xy_SurfSnowB (0:imax-1, 1:jmax) ) allocate( xy_SurfMajCompIceN(0:imax-1, 1:jmax) ) allocate( xy_SoilMoistN (0:imax-1, 1:jmax) ) allocate( xy_SurfSnowN (0:imax-1, 1:jmax) ) allocate( xy_SurfMajCompIceA(0:imax-1, 1:jmax) ) allocate( xy_SoilMoistA (0:imax-1, 1:jmax) ) allocate( xy_SurfSnowA (0:imax-1, 1:jmax) ) ! 地表面温度リスタートデータ入力 ! Restart data of surface temperature input ! !!$ call RestartSurfTempGet( & !!$ & xy_SurfTemp ) ! (out) call RestartSurfTempInit call RestartSurfTempGet( xy_SurfTemp, xyz_SoilTemp, xy_SurfMajCompIceB, xy_SoilMoistB, xy_SurfSnowB, xy_SurfMajCompIceN, xy_SoilMoistN, xy_SurfSnowN ) !!$ xy_SurfSnowN = 1.0d1 !!$ xy_SurfSnowB = xy_SurfSnowN ! THIS IS A TEMPORARY LINE. !!$ ! 土壌温度, ..., の初期値設定, いずれリスタートファイルから読むようにする !!$ ! Setting of initial values of soil temperature, ..., these values are input from restart file in near future !!$ ! !!$ do k = 1, kslmax !!$ xyz_SoilTemp(:,:,k) = xy_SurfTemp !!$ end do !!$ !!$ xy_SoilMoistN = 0.0_DP !!$ xy_SurfSnowN = 0.0_DP !!$ !!$ xy_SoilMoistB = xy_SoilMoistN !!$ xy_SurfSnowB = xy_SurfSnowN !!$ !!$ xy_SoilMoistA = 0.0_DP !!$ xy_SurfSnowA = 0.0_DP !!$ xy_SurfMajCompIceN = 0.0_DP !!$ xy_SurfMajCompIceB = xy_SurfMajCompIceN end select ! リスタートデータファイルの初期化 ! Initialization of restart data file ! call RestartFileOpen ! ヒストリデータファイルの初期化 ! Initialization of history data files ! call HistoryFileOpen ! ヒストリデータ出力のためのへの変数登録 ! Register of variables for history data output ! call HistoryAutoAddVariable( 'U' , (/ 'lon ', 'lat ', 'sig ', 'time' /), 'eastward wind', 'm s-1' ) ! (in) call HistoryAutoAddVariable( 'V' , (/ 'lon ', 'lat ', 'sig ', 'time' /), 'northward wind', 'm s-1' ) ! (in) call HistoryAutoAddVariable( 'Temp' , (/ 'lon ', 'lat ', 'sig ', 'time' /), 'temperature', 'K' ) ! (in) do n = 1, ncmax call HistoryAutoAddVariable( a_QMixName(n) , (/ 'lon ', 'lat ', 'sig ', 'time' /), a_QMixLongName(n), 'kg kg-1' ) ! (in) end do n = IndexH2OVap if ( a_QMixName(n) /= 'QVap' ) then call HistoryAutoAddVariable( 'QVap' , (/ 'lon ', 'lat ', 'sig ', 'time' /), a_QMixLongName(n), 'kg kg-1' ) ! (in) end if call HistoryAutoAddVariable( 'Ps' , (/ 'lon ', 'lat ', 'time' /), 'surface pressure', 'Pa' ) ! (in) ! ヒストリデータ出力 (スタート時刻) ! History data output (Start time) ! call HistoryAutoPut( TimeN, 'U', xyz_UN ) call HistoryAutoPut( TimeN, 'V', xyz_VN ) call HistoryAutoPut( TimeN, 'Temp', xyz_TempN ) do n = 1, ncmax call HistoryAutoPut( TimeN, a_QMixName(n), xyzf_QMixN(:,:,:,n) ) end do call HistoryAutoPut( TimeN, 'Ps', xy_PsN ) ! Backward compatibility n = IndexH2OVap if ( a_QMixName(n) /= 'QVap' ) then call HistoryAutoPut( TimeN, 'QVap', xyzf_QMixN(:,:,:,n) ) end if ! Output frequently used variables ! Output frequently used variables ! call OutputFreqUsedVarsInit select case ( IDPhysMode ) case ( IDPhysModeJupiterSimpleV2 ) ! ヒストリデータ出力のためのへの変数登録 ! Register of variables for history data output ! call HistoryAutoAddVariable( 'Rain', (/ 'lon ', 'lat ', 'time' /), 'precipitation (rain)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'Snow', (/ 'lon ', 'lat ', 'time' /), 'precipitation (snow)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'PRCP', (/ 'lon ', 'lat ', 'time' /), 'precipitation', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'RainCum', (/ 'lon ', 'lat ', 'time' /), 'convective precipitation (rain)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'SnowCum', (/ 'lon ', 'lat ', 'time' /), 'convective precipitation (snow)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'PRCPCum', (/ 'lon ', 'lat ', 'time' /), 'convective precipitation', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'RainLsc', (/ 'lon ', 'lat ', 'time' /), 'non-convective precipitation (rain)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'SnowLsc', (/ 'lon ', 'lat ', 'time' /), 'non-convective precipitation (snow)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'PRCPLsc', (/ 'lon ', 'lat ', 'time' /), 'non-convective precipitation', 'kg m-2 s-1' ) case ( IDPhysModeFullPhysics ) ! 地表面温度リスタートデータファイルの初期化 ! Initialization of restart data file of surface temperature ! call RestartSurfTempOpen ! ヒストリデータ出力のためのへの変数登録 ! Register of variables for history data output ! call HistoryAutoAddVariable( 'SurfTemp' , (/ 'lon ', 'lat ', 'time' /), 'surface temperature', 'K' ) call HistoryAutoAddVariable( 'SoilTemp', (/ 'lon ', 'lat ', 'ssz ', 'time' /), 'soil temperature', 'K' ) call HistoryAutoAddVariable( 'SurfMajCompIce' , (/ 'lon ', 'lat ', 'time' /), 'surface major component ice', 'kg m-2' ) ! (in) call HistoryAutoAddVariable( 'SoilMoist' , (/ 'lon ', 'lat ', 'time' /), 'soil moisture', 'kg m-2' ) ! (in) call HistoryAutoAddVariable( 'SurfSnow' , (/ 'lon ', 'lat ', 'time' /), 'surface snow amount', 'kg m-2' ) ! (in) call HistoryAutoAddVariable( 'Rain', (/ 'lon ', 'lat ', 'time' /), 'precipitation (rain)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'Snow', (/ 'lon ', 'lat ', 'time' /), 'precipitation (snow)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'PRCP', (/ 'lon ', 'lat ', 'time' /), 'precipitation', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'RainCum', (/ 'lon ', 'lat ', 'time' /), 'convective precipitation (rain)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'SnowCum', (/ 'lon ', 'lat ', 'time' /), 'convective precipitation (snow)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'PRCPCum', (/ 'lon ', 'lat ', 'time' /), 'convective precipitation', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'RainLsc', (/ 'lon ', 'lat ', 'time' /), 'non-convective precipitation (rain)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'SnowLsc', (/ 'lon ', 'lat ', 'time' /), 'non-convective precipitation (snow)', 'kg m-2 s-1' ) call HistoryAutoAddVariable( 'PRCPLsc', (/ 'lon ', 'lat ', 'time' /), 'non-convective precipitation', 'kg m-2 s-1' ) ! ヒストリデータ出力 (スタート時刻) ! History data output (Start time) ! call HistoryAutoPut( TimeN, 'SurfMajCompIce', xy_SurfMajCompIceN ) call HistoryAutoPut( TimeN, 'SoilMoist' , xy_SoilMoistN ) call HistoryAutoPut( TimeN, 'SurfSnow' , xy_SurfSnowN ) end select ! 診断変数の割付 ! Allocation of diagnostic variables ! allocate( xyz_DUDt (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DVDt (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DTempDt (0:imax-1, 1:jmax, 1:kmax) ) allocate( xy_DPsDt (0:imax-1, 1:jmax) ) allocate( xyzf_DQMixDt(0:imax-1, 1:jmax, 1:kmax, 1:ncmax) ) allocate( xyz_DTurKinEneDt(0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_OMG(0:imax-1, 1:jmax, 1:kmax) ) allocate( xy_SurfHeight(0:imax-1, 1:jmax) ) allocate( xyz_Height (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_Exner (0:imax-1, 1:jmax, 1:kmax) ) select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) allocate( xy_SurfAlbedo (0:imax-1, 1:jmax) ) allocate( xy_SurfHumidCoef (0:imax-1, 1:jmax) ) allocate( xy_SurfRoughLenMom (0:imax-1, 1:jmax) ) allocate( xy_SurfRoughLenHeat (0:imax-1, 1:jmax) ) allocate( xy_SurfHeatCapacity (0:imax-1, 1:jmax) ) allocate( xy_SeaIceConc (0:imax-1, 1:jmax) ) allocate( xy_SurfCond (0:imax-1, 1:jmax) ) allocate( xy_SurfType (0:imax-1, 1:jmax) ) allocate( xy_DeepSubSurfHeatFlux(0:imax-1, 1:jmax) ) allocate( xy_SoilHeatCap (0:imax-1, 1:jmax) ) allocate( xy_SoilHeatDiffCoef (0:imax-1, 1:jmax) ) allocate( xy_SurfHeightStd (0:imax-1, 1:jmax) ) allocate( xy_SnowFrac (0:imax-1, 1:jmax) ) !!$ allocate( xy_FlagMatthewsLand (0:imax-1, 1:jmax) ) allocate( xy_PhyImplSDHIndexCalcMethod(0:imax-1, 1:jmax) ) allocate( xy_BucketFlagOceanGrid (0:imax-1, 1:jmax) ) allocate( xyr_Temp (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyz_VirTemp (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_VirTemp (0:imax-1, 1:jmax, 0:kmax) ) allocate( xy_SurfVirTemp(0:imax-1, 1:jmax) ) allocate( xyz_Press (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_Press (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_Height (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_Exner (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLFluxA (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLUwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLDwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSUwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSDwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyra_DelRadLFlux (0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xyra_DelRadLUwFlux(0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xyra_DelRadLDwFlux(0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xyr_MomFluxX (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_MomFluxY (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_HeatFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyrf_QMixFlux (0:imax-1, 1:jmax, 0:kmax, 1:ncmax) ) allocate( xy_SurfMomFluxX (0:imax-1, 1:jmax) ) allocate( xy_SurfMomFluxY (0:imax-1, 1:jmax) ) allocate( xy_SurfHeatFlux (0:imax-1, 1:jmax) ) allocate( xyf_SurfQMixFlux (0:imax-1, 1:jmax, 1:ncmax) ) allocate( xy_SurfH2OVapFluxA (0:imax-1, 1:jmax) ) allocate( xy_SurfLatentHeatFluxA(0:imax-1, 1:jmax) ) allocate( xyr_SoilHeatFlux(0:imax-1, 1:jmax, 0:kslmax) ) allocate( xyr_VelDiffCoef (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_TempDiffCoef(0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_QMixDiffCoef(0:imax-1, 1:jmax, 0:kmax) ) allocate( xy_SurfVelTransCoef (0:imax-1, 1:jmax) ) allocate( xy_SurfTempTransCoef(0:imax-1, 1:jmax) ) allocate( xy_SurfQVapTransCoef(0:imax-1, 1:jmax) ) allocate( xy_SurfMOLength (0:imax-1, 1:jmax) ) allocate( xyr_SoilTempTransCoef (0:imax-1, 1:jmax, 0:kslmax) ) allocate( xy_DSurfTempDt (0:imax-1, 1:jmax) ) allocate( xyz_DSoilTempDt(0:imax-1, 1:jmax, 1:kslmax) ) allocate( xy_DSurfMajCompIceDt(0:imax-1, 1:jmax) ) allocate( xy_DSoilMoistDt (0:imax-1, 1:jmax) ) allocate( xy_DSurfSnowDt (0:imax-1, 1:jmax) ) allocate( xyz_DTempDtVDiff(0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DUDtGWD(0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DVDtGWD(0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DTempDtRadL (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DTempDtRadS (0:imax-1, 1:jmax, 1:kmax) ) allocate( xy_Rain (0:imax-1, 1:jmax) ) allocate( xy_RainCumulus (0:imax-1, 1:jmax) ) allocate( xy_RainLsc (0:imax-1, 1:jmax) ) allocate( xy_Snow (0:imax-1, 1:jmax) ) allocate( xy_SnowCumulus (0:imax-1, 1:jmax) ) allocate( xy_SnowLsc (0:imax-1, 1:jmax) ) allocate( xyz_DTempDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQVapDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OLiqDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OSolDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DUDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DVDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OLiqDtLSC (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OSolDtLSC (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_MoistConvDetTend (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_MoistConvSubsidMassFlux(0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_QH2OLiqforRad (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_QH2OSolforRad (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_CloudCoverforRad(0:imax-1,1:jmax,1:kmax) ) allocate( xy_SurfDustGravSedFlux(0:imax-1,1:jmax) ) ! ヒストリデータ出力のためのへの変数登録 ! Register of variables for history data output ! call HistoryAutoAddVariable( 'SeaIceConc' , (/ 'lon ', 'lat ', 'time' /), 'sea ice concentration', '1' ) call HistoryAutoAddVariable( 'SurfAlbedo' , (/ 'lon ', 'lat ', 'time' /), 'surface albedo', '1' ) call HistoryAutoAddVariable( 'SurfRoughLenMom' , (/ 'lon ', 'lat ', 'time' /), 'surface roughness length for momentum', 'm' ) call HistoryAutoAddVariable( 'SurfRoughLenHeat' , (/ 'lon ', 'lat ', 'time' /), 'surface roughness length for heat', 'm' ) call HistoryAutoAddVariable( 'SurfDustGravSedFlux' , (/ 'lon ', 'lat ', 'time' /), 'surface roughness length', 'm' ) case ( IDPhysModeVenusSimple ) allocate( xyr_Temp (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyz_VirTemp (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_VirTemp (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyz_Press (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_Press (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_Height (0:imax-1, 1:jmax, 0:kmax) ) !!$ allocate( xyz_Exner (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_Exner (0:imax-1, 1:jmax, 0:kmax) ) case ( IDPhysModeJupiterSimple ) allocate( xyz_Press (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_Press (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_VirTemp(0:imax-1, 1:jmax, 0:kmax) ) allocate( xyz_DTempDtVDiff(0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_HeatFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLUwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLDwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSUwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSDwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyz_DTempDtRadL (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DTempDtRadS (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyra_DelRadLFlux (0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xyra_DelRadLUwFlux(0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xyra_DelRadLDwFlux(0:imax-1, 1:jmax, 0:kmax, 0:1) ) case ( IDPhysModeJupiterSimpleV2 ) allocate( xyz_Press (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_Press (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_VirTemp(0:imax-1, 1:jmax, 0:kmax) ) !!$ allocate( xyz_Exner (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_Exner (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyz_DTempDtVDiff(0:imax-1, 1:jmax, 1:kmax) ) allocate( xyr_MomFluxX (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_MomFluxY (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_HeatFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyrf_QMixFlux (0:imax-1, 1:jmax, 0:kmax, 1:ncmax) ) allocate( xyr_VelDiffCoef (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_TempDiffCoef(0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_QMixDiffCoef(0:imax-1, 1:jmax, 0:kmax) ) allocate( xy_SurfVelTransCoef (0:imax-1, 1:jmax) ) allocate( xy_SurfTempTransCoef(0:imax-1, 1:jmax) ) allocate( xy_SurfQVapTransCoef(0:imax-1, 1:jmax) ) allocate( xyr_RadLFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLUwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadLDwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSUwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_RadSDwFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyz_DTempDtRadL (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DTempDtRadS (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyra_DelRadLFlux (0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xyra_DelRadLUwFlux(0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xyra_DelRadLDwFlux(0:imax-1, 1:jmax, 0:kmax, 0:1) ) allocate( xy_Rain (0:imax-1, 1:jmax) ) allocate( xy_RainCumulus (0:imax-1, 1:jmax) ) allocate( xy_RainLsc (0:imax-1, 1:jmax) ) allocate( xy_Snow (0:imax-1, 1:jmax) ) allocate( xy_SnowCumulus (0:imax-1, 1:jmax) ) allocate( xy_SnowLsc (0:imax-1, 1:jmax) ) allocate( xyz_DTempDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQVapDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OLiqDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OSolDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DUDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DVDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OLiqDtLSC (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OSolDtLSC (0:imax-1,1:jmax,1:kmax) ) end select ! 惑星表面データの設定 ! Setting planetary surface properties ! select case ( IDSfcMoistMethod ) case ( IDSfcMoistMethodNone ) call SurfacePropertiesInit( FlagPhysImpSoilModelSO, .false., FlagSnow ) case ( IDSfcMoistMethodBucket ) call SurfacePropertiesInit( FlagPhysImpSoilModelSO, .true. , FlagSnow ) end select select case ( IDPhysMode ) case ( IDPhysModeNoPhysics ) ! Nothing to do case ( IDPhysModeHS94 ) ! Held and Suarez (1994) による強制と散逸 ! Forcing and dissipation suggested by Held and Suarez (1994) ! call HS94Init case ( IDPhysModeVenusSimple ) ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit ! Yamamoto and Takahashi (2003) に従った簡単金星計算のための強制 ! forcing for simple Venus calculation following Yamamoto and Takahashi (2003) ! call YT2003ForcingInit case ( IDPhysModeJupiterSimple ) ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit ! Schneider and Liu (2009) による鉛直混合課程 ! Vertical diffusion by Schneider and Liu (2009) ! call SL09DiffusionInit ! Schneider and Liu (2009) の放射モデル ! Radiation model by Schneider and Liu (2009) ! call RadSL09Init ! 放射関連ルーチン ! Routines for radiation calculation ! call RadUtilsInit case ( IDPhysModeJupiterSimpleV2 ) ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit ! 下部境界フラックス ! Lower boundary flux ! call LBFluxSimpleInit ! 陰解法による時間積分 (大気のみ / 惑星表面温度・土壌温度計算なし) ! Time integration by using implicit scheme in case without calculation of surface and soil temperature ! call PhyImplAtmOnlyInit ! Schneider and Liu (2009) の放射モデル ! Radiation model by Schneider and Liu (2009) ! call RadSL09Init ! 放射関連ルーチン ! Routines for radiation calculation ! call RadUtilsInit case ( IDPhysModeFullPhysics ) ! 惑星表面データの設定 ! Setting planetary surface properties ! select case ( IDSfcMoistMethod ) case ( IDSfcMoistMethodNone ) call SurfacePropertiesInit( FlagPhysImpSoilModelSO, .false., FlagSnow ) case ( IDSfcMoistMethodBucket ) call SurfacePropertiesInit( FlagPhysImpSoilModelSO, .true. , FlagSnow ) end select ! 雪, 氷の割合 ! snow/ice fraction ! call SnowIceFracInit ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit select case ( IDRadMethod ) case ( IDRadMethodDennouAGCM ) ! 放射フラックス (GFD 電脳倶楽部開発の放射モデル) ! Radiation flux (radiation model developed by GFD Dennou Club) ! call RadDennouAGCMInit( flag_rst = .not. flag_initial ) case ( IDRadMethodEarthV2 ) if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if select case ( IDCloudMethod ) case ( IDCloudMethodNone ) ! 雲なしモデル ! No cloud model ! call CloudNoneInit( FlagSnow ) case ( IDCloudMethodSimple ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) case ( IDCloudMethodSimpleWithIce ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) case ( IDCloudMethodT1993WithIce ) ! Tiedtke (1993) に基づく雲モデル ! Cloud model based on Tiedtke (1993) ! call CloudT1993baseInit( FlagSnow ) end select ! 地球大気向け放射モデル Ver. 2 ! radiation model for the Earth's atmosphere Ver. 2 ! call RadEarthV2Init( FlagSnow ) case ( IDRadMethodRRTMG ) if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if select case ( IDCloudMethod ) case ( IDCloudMethodNone ) ! 雲なしモデル ! No cloud model ! call CloudNoneInit( FlagSnow ) case ( IDCloudMethodSimple ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) case ( IDCloudMethodSimpleWithIce ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) case ( IDCloudMethodT1993WithIce ) ! Tiedtke (1993) に基づく雲モデル ! Cloud model based on Tiedtke (1993) ! call CloudT1993baseInit( FlagSnow ) end select ! wrapper of RRTMG ! wrapper of RRTMG ! call RadRRTMGWrapperInit( FlagSnow ) case ( IDRadMethodMarsV1 ) ! 火星大気向け放射モデル Ver. 1 ! radiation model for the Mars' atmosphere Ver. 1 ! call RadMarsV1Init case ( IDRadMethodSL09 ) ! Schneider and Liu (2009) の放射モデル ! Radiation model by Schneider and Liu (2009) ! call RadSL09Init case ( IDRadMethodSimple ) ! 簡単放射モデル ! Simple radiation model ! call RadSimpleInit case ( IDRadMethodNone ) ! 何もしない放射モデル ! radiation model with no absorption and no scattering ! call RadNoneInit end select ! 鉛直拡散フラックス ! Vertical diffusion flux ! select case ( IDVDiffMethod ) case ( IDVDiffMethodMY2, IDVDiffMethodMY25 ) ! 鉛直拡散フラックス (Mellor and Yamada, 1974) ! Vertical diffusion flux (Mellor and Yamada, 1974) ! call VDiffusionInit case ( IDVDiffMethodJMA ) ! JMA 乱流混合モジュール ! JMA turbulent mixing module ! call VDiffusionJMAInit end select ! 地表面フラックス (バルク法) ! Surface flux (Bulk method) ! call SurfaceFluxInit ! ! set dust flux ! !!$ call SetDustFluxInit ! 一部の物理過程の時間変化率の計算 (陰解法) ! Calculate tendency by a part of physical processes (implicit) ! select case ( IDPhyTendMethod ) case ( IDPhyTendMethodImp1LayModel ) ! 陰解法による時間積分 ! Time integration with implicit scheme ! call PhyImplInit( FlagBucketModel, FlagSnow ) case ( IDPhyTendMethodImpSoilModel ) select case ( IDSfcMoistMethod ) case ( IDSfcMoistMethodBucket ) ! バケツモデル ! Bucket model ! call BucketModelInit( FlagSnow ) end select ! 地下における熱の鉛直拡散 ! Vertical diffusion of heat under the ground ! call SubsurfaceDiffusionInit ! 地下熱伝導モデルを用いた場合の陰解法による時間積分 ! ! Time integration by using implicit scheme in case using subsurface thermal diffusion model !!$ call PhyImplSDHInit( & !!$ & FlagBucketModel, FlagSnow, & !!$ & FlagPhysImpSoilModelSO, FlagMajCompPhaseChange, CondMajCompName & !!$ & ) !!$ call PhyImplSDHV2Init( & !!$ & FlagBucketModel, FlagSnow, & !!$ & FlagPhysImpSoilModelSO, FlagMajCompPhaseChange, CondMajCompName & !!$ & ) call PhyImplSDHV3Init( FlagBucketModel, FlagSnow, FlagPhysImpSoilModelSO, FlagMajCompPhaseChange, CondMajCompName ) case ( IDPhyTendMethodImpAtmOnly ) ! 陰解法による時間積分 (大気のみ / 惑星表面温度・土壌温度計算なし) ! Time integration by using implicit scheme in case without calculation of surface and soil temperature ! call PhyImplAtmOnlyInit end select ! Gravity wave drag by McFarlane (1987) ! Gravity wave drag by McFarlane (1987) ! call GWDM1987Init ! 陰解法による時間積分のためのルーチン ! Routines for time integration with implicit scheme ! call PhyImplUtilsInit ! 放射関連ルーチン ! Routines for radiation calculation ! call RadUtilsInit !!$ select case ( IDRadMethod ) !!$ case ( IDRadMethodMarsV1 ) !!$ ! (火星大気向け) Non-LTE 放射モデル !!$ ! Non-NLTE radiation model (for the Mars' atmosphere) !!$ ! !!$ call Rad15mNLTEInit !!$ end select select case ( IDRadMethod ) case ( IDRadMethodMarsV1 ) ! 火星計算用近赤外加熱率計算 ! Calculation of near infrared heating rate in the case of Mars ! call RadMarsNIRInit end select ! 鉛直拡散フラックス (Mellor and Yamada, 1974) ! Vertical diffusion flux (Mellor and Yamada, 1974) ! call VDiffusionInit ! 地表面フラックス (バルク法) ! Surface flux (Bulk method) ! call SurfaceFluxInit ! 放射関連ルーチン ! Routines for radiation calculation ! call RadUtilsInit end select ! 地面温度・土壌温度・土壌水分・積雪量の積分 ! Time integration of surface temperature, soil temperature, soil moisture, ! and surface snow amount ! select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) ! 地面温度, 土壌温度の時間積分 ! Time integration of surface temperature and soil temperature ! call IntgSurfTempInit select case ( IDSfcMoistMethod ) case ( IDSfcMoistMethodBucket ) ! バケツモデル ! Bucket model ! call BucketModelInit( FlagSnow ) end select end select ! 力学過程 ! Dynamical core ! select case ( IDDynMode ) case ( IDDynModeHSPLVAS83 ) ! 力学過程 (スペクトル法, Arakawa and Suarez (1983)) ! Dynamical process (Spectral method, Arakawa and Suarez (1983)) ! call DynamicsHSplVAS83Init case ( IDDynModeNoHorAdv ) ! 物理過程のみの計算のための力学過程 ! A dynamics for calculation with physical processes only ! call DynamicsPhysicsOnlyInit case ( IDDynModeTWPICE ) ! ! Dynamical process for TWP-ICE experiment ! call DynamicsTWPICESCMExpInit end select select case ( IDPhysMode ) case ( IDPhysModeJupiterSimple ) ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit select case ( IDDCMethod ) case ( IDDCMethodDCA ) ! 乾燥対流調節 ! Dry convective adjustment ! call DryConvAdjustInit end select case ( IDPhysModeJupiterSimpleV2 ) ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit ! 湿潤対流調節 ! Moist convective adjustment ! call MoistConvAdjustInit ! 大規模凝結 (非対流性凝結) (Manabe, 1965) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! call LScaleCondInit( FlagSnow ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) select case ( IDDCMethod ) case ( IDDCMethodDCA ) ! 乾燥対流調節 ! Dry convective adjustment ! call DryConvAdjustInit end select ! 質量の補正 ! Mass fixer ! call MassFixerInit case ( IDPhysModeFullPhysics ) ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit select case ( IDMCMethod ) case ( IDMCMethodMCA ) ! 湿潤対流調節 ! Moist convective adjustment ! call MoistConvAdjustInit case ( IDMCMethodRAS ) ! Relaxed Arakawa-Schubert scheme ! Relaxed Arakawa-Schubert scheme ! call RASInit case ( IDMCMethodRASWithIce ) ! Relaxed Arakawa-Schubert scheme ! Relaxed Arakawa-Schubert scheme ! call RASInit end select select case ( IDLSCMethod ) case ( IDLSCMethodM65 ) ! 大規模凝結 (非対流性凝結) (Manabe, 1965) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! call LScaleCondInit( FlagSnow ) !!$ case ( IDLSCMethodLL91 ) !!$ ! 大規模凝結 (非対流性凝結) (Le Treut and Li, 1991) !!$ ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) !!$ ! !!$ call LScaleCondLL91Init case ( IDLSCMethodSatAdjM65 ) ! != Saturation adjustment ! if ( IndexH2OLiq <= 0 ) then call MessageNotify( 'E', prog_name, trim(a_QMixName(IndexH2OLiq))//' is not found.' ) end if call SaturationAdjustInit( FlagSnow ) case ( IDLSCMethodM65WithIce ) ! 大規模凝結 (非対流性凝結) (Manabe, 1965) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! call LScaleCondInit( FlagSnow ) case ( IDLSCMethodLL91WithIce ) ! 大規模凝結 (非対流性凝結) (Le Treut and Li, 1991) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! call LScaleCondInit( FlagSnow ) end select ! ! Cloud model ! select case ( IDCloudMethod ) case ( IDCloudMethodNone ) ! 雲なしモデル ! No cloud model ! call CloudNoneInit( FlagSnow ) case ( IDCloudMethodSimple ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) case ( IDCloudMethodSimpleWithIce ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) case ( IDCloudMethodT1993WithIce ) ! Tiedtke (1993) に基づく雲モデル ! Cloud model based on Tiedtke (1993) ! call CloudT1993baseInit( FlagSnow ) case ( IDCloudMethodMarsH2OCloud ) ! 火星 H2O 雲モデル ! Mars H2O cloud model ! call CloudMarsH2OInit end select select case ( IDSfcMoistMethod ) case ( IDSfcMoistMethodBucket ) ! バケツモデル ! Bucket model ! call BucketModelInit( FlagSnow ) end select select case ( IDDCMethod ) case ( IDDCMethodDCA ) ! 乾燥対流調節 ! Dry convective adjustment ! call DryConvAdjustInit end select ! 重力沈降過程 ! Gravitational sedimentation process ! call GravSedInit ! 主成分相変化 ! Phase change of atmospheric major component ! call MajorCompPhaseChangeInit( FlagMajCompPhaseChange, CondMajCompName ) ! 質量の補正 ! Mass fixer ! call MassFixerInit end select ! タイムフィルター (Asselin, 1972) ! Time filter (Asselin, 1972) ! !!$ call TimeFiltInit ! 時間フィルター (Williams, 2009) ! Time filter (Williams, 2009) ! call TimeFilterWilliams2009Init ! 予報変数の値の確認 ! Check values of prognostic variables ! call CheckProgVarsInit ! 補助的な変数を計算するサブルーチン・関数群 ! Subroutines and functions for calculating auxiliary variables ! call AuxVarsInit ! ! End of initialization ! ! 初回だけはオイラー法を用いるため, Δt を半分に ! Delta t is reduced to half in order to use Euler method at initial step ! if ( flag_initial ) then call TimesetDelTimeHalf end if end subroutine MainInit
Subroutine : |
主プログラムの終了処理手続き.
Termination procedure for the main program.
subroutine MainTerminate ! ! 主プログラムの終了処理手続き. ! ! Termination procedure for the main program. ! ! モジュール引用 ; USE statements ! ! MPI ! use mpi_wrapper, only : MPIWrapperFinalize ! 力学過程 (スペクトル法, Arakawa and Suarez (1983)) ! Dynamical process (Spectral method, Arakawa and Suarez (1983)) ! use dynamics_hspl_vas83, only : DynamicsHSplVAS83Finalize ! ! Dynamical process for TWP-ICE experiment ! use dynamics_twpice_scm_exp, only : DynamicsTWPICESCMExpFinalize ! Held and Suarez (1994) による強制と散逸 ! Forcing and dissipation suggested by Held and Suarez (1994) ! use held_suarez_1994, only: Hs94Finalize ! 放射フラックス (バンドモデル) ! Radiation flux (band model) ! use rad_DennouAGCM, only: RadDennouAGCMFinalize ! 座標データ設定 ! Axes data settings ! use axesset, only: AxessetFinalize ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! use auxiliary, only: AuxVarsFinalize ! 時刻管理 ! Time control ! use timeset, only: TimesetClose ! リスタートデータ入出力 ! Restart data input/output ! use restart_file_io, only: RestartFileClose ! 地表面温度リスタートデータ入出力 ! Restart data of surface temperature input/output ! use restart_surftemp_io, only: RestartSurfTempClose ! ヒストリデータ出力 ! History data output ! use history_file_io, only: HistoryFileClose ! 宣言文 ; Declaration statements ! implicit none ! 実行文 ; Executable statement ! ! リスタートデータファイルクローズ ! Close restart data file ! call RestartFileClose if ( IDPhysMode == IDPhysModeFullPhysics ) then ! 地表面温度リスタートデータファイルクローズ ! Close restart data file of surface temperature ! call RestartSurfTempClose end if ! ヒストリデータファイルクローズ ! Close history data files ! call HistoryFileClose ! 予報変数の割付解除 ! Deallocation of prediction variables ! deallocate( xyz_UB ) deallocate( xyz_VB ) deallocate( xyz_TempB ) deallocate( xyzf_QMixB ) deallocate( xy_PsB ) deallocate( xyz_UN ) deallocate( xyz_VN ) deallocate( xyz_TempN ) deallocate( xyzf_QMixN ) deallocate( xy_PsN ) deallocate( xyz_UA ) deallocate( xyz_VA ) deallocate( xyz_TempA ) deallocate( xyzf_QMixA ) deallocate( xy_PsA ) ! 診断変数の割付解除 ! Dellocation of diagnostic variables ! deallocate( xyz_DUDt ) deallocate( xyz_DVDt ) deallocate( xyz_DTempDt ) deallocate( xyzf_DQMixDt ) deallocate( xyz_DTurKinEneDt ) deallocate( xyz_OMG ) deallocate( xy_SurfHeight ) deallocate( xyz_Height ) if ( IDPhysMode == IDPhysModeFullPhysics ) then deallocate( xy_SurfAlbedo ) deallocate( xy_SurfHumidCoef ) deallocate( xy_SurfRoughLenMom ) deallocate( xy_SurfRoughLenHeat ) deallocate( xy_SurfHeatCapacity ) deallocate( xy_SeaIceConc ) deallocate( xy_SurfCond ) deallocate( xy_SurfType ) deallocate( xy_DeepSubSurfHeatFlux ) deallocate( xy_SoilHeatCap ) deallocate( xy_SoilHeatDiffCoef ) deallocate( xy_SurfHeightStd ) deallocate( xy_SnowFrac ) !!$ deallocate( xy_FlagMatthewsLand ) deallocate( xy_PhyImplSDHIndexCalcMethod ) deallocate( xy_BucketFlagOceanGrid ) deallocate( xyr_Temp ) deallocate( xyz_VirTemp ) deallocate( xyr_VirTemp ) deallocate( xy_SurfVirTemp ) deallocate( xyz_Press ) deallocate( xyr_Press ) deallocate( xyr_Height ) deallocate( xyz_Exner ) deallocate( xyr_Exner ) deallocate( xyr_RadLFlux ) deallocate( xyr_RadLFluxA ) deallocate( xyr_RadLUwFlux ) deallocate( xyr_RadLDwFlux ) deallocate( xyr_RadSFlux ) deallocate( xyr_RadSUwFlux ) deallocate( xyr_RadSDwFlux ) deallocate( xyra_DelRadLUwFlux ) deallocate( xyra_DelRadLDwFlux ) deallocate( xyr_MomFluxX ) deallocate( xyr_MomFluxY ) deallocate( xyr_HeatFlux ) deallocate( xyrf_QMixFlux ) deallocate( xy_SurfMomFluxX ) deallocate( xy_SurfMomFluxY ) deallocate( xy_SurfHeatFlux ) deallocate( xyf_SurfQMixFlux ) deallocate( xy_SurfH2OVapFluxA ) deallocate( xy_SurfLatentHeatFluxA ) deallocate( xyr_SoilHeatFlux ) deallocate( xyr_VelDiffCoef ) deallocate( xyr_TempDiffCoef ) deallocate( xyr_QMixDiffCoef ) deallocate( xy_SurfVelTransCoef ) deallocate( xy_SurfTempTransCoef ) deallocate( xy_SurfQVapTransCoef ) deallocate( xy_SurfMOLength ) deallocate( xy_DSurfTempDt ) deallocate( xyz_DSoilTempDt ) deallocate( xy_DPsDt ) deallocate( xy_DSurfMajCompIceDt ) deallocate( xy_DSoilMoistDt ) deallocate( xy_DSurfSnowDt ) deallocate( xyz_DTempDtVDiff ) deallocate( xyz_DUDtGWD ) deallocate( xyz_DVDtGWD ) deallocate( xyz_DTempDtRadL ) deallocate( xyz_DTempDtRadS ) deallocate( xy_Rain ) deallocate( xy_RainCumulus ) deallocate( xy_RainLsc ) deallocate( xy_SnowCumulus ) deallocate( xy_SnowLsc ) deallocate( xyz_DTempDtCum ) deallocate( xyz_DQVapDtCum ) deallocate( xyz_DQH2OLiqDtCum ) deallocate( xyz_DQH2OSolDtCum ) deallocate( xyz_DUDtCum ) deallocate( xyz_DVDtCum ) deallocate( xyz_DQH2OLiqDtLSC ) deallocate( xyz_DQH2OSolDtLSC ) deallocate( xyz_MoistConvDetTend ) deallocate( xyz_MoistConvSubsidMassFlux ) deallocate( xyz_QH2OLiqforRad ) deallocate( xyz_QH2OSolforRad ) deallocate( xyz_CloudCoverforRad ) end if ! FlagFullPhysics select case ( IDDynMode ) case ( IDDynModeHSPLVAS83 ) ! 各モジュール内の変数の割付解除 ! Dellocation of variables in modules ! call DynamicsHSplVAS83Finalize case ( IDDynModeNoHorAdv ) case ( IDDynModeTWPICE ) ! ! Dynamical process for TWP-ICE experiment ! call DynamicsTWPICESCMExpFinalize end select call AuxVarsFinalize select case ( IDPhysMode ) case ( IDPhysModeHS94 ) call Hs94Finalize end select select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) ! 割付解除とリスタートファイルの終了処理 ! Dellocation and close a restart file ! call RadDennouAGCMFinalize end select call AxessetFinalize ! 時刻管理終了処理 ! Termination of time control ! call TimesetClose ! Finalize MPI ! call MPIWrapperFinalize end subroutine MainTerminate