Path: | main/dcpam_main.f90 |
Last Update: | Mon Sep 17 20:01:58 +0900 2012 |
Authors: | Yasuhiro Morikawa, Satoshi Noda, Yoshiyuki O. Takahashi |
Version: | $Id: dcpam_main.f90,v 1.44 2012-09-17 11:01:58 yot Exp $ |
Tag Name: | $Name: dcpam5-20120921 $ |
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 ! 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 ! 火星大気向け放射モデル Ver. 1 ! radiation model for the Mars' atmosphere Ver. 1 ! use rad_Mars_V1, only: RadMarsV1Flux ! 火星計算用近赤外加熱率計算 ! 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 ! 鉛直拡散フラックス (Mellor and Yamada, 1974, レベル 2) ! Vertical diffusion flux (Mellor and Yamada, 1974, Level 2) ! use vdiffusion_my1974, only: VDiffusion, VDiffusionOutput ! 地下における熱の鉛直拡散 ! Vertical diffusion of heat under the ground ! use subsurface_diffusion_heat, only: SubsurfaceDiffusion ! 積雲パラメタリゼーション (対流調節) ! Cumulus parameterization (convection adjust) ! use moist_conv_adjust, only: MoistConvAdjust ! Relaxed Arakawa-Schubert scheme ! Relaxed Arakawa-Schubert scheme ! use relaxed_arakawa_schubert, only : RelaxedArakawaSchubert ! 大規模凝結 (非対流性凝結) ! Large scale condensation ! use lscond, only: LScaleCond ! 大規模凝結 (非対流性凝結) (Le Treut and Li, 1991) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! !!$ use lscond_LL91, only : LScaleCondLL91 ! 地表面フラックス ! Surface flux use surface_flux_bulk, only: SurfaceFlux, SurfaceFluxOutput ! 乾燥対流調節 ! Dry convective adjustment ! use dry_conv_adjust, only: DryConvAdjust ! 質量の補正 ! Mass fixer ! use mass_fixer, only: MassFixer ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! 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 ! 陰解法による時間積分 (大気のみ / 惑星表面温度・土壌温度計算なし) ! 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 ! 時刻管理 ! 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 ! ヒストリデータ出力 ! History data output ! use gtool_historyauto, only: HistoryAutoPut, HistoryAutoAllVarFix ! 組成に関わる配列の設定 ! Settings of array for atmospheric composition ! use composition, only: ncmax, a_QMixName, a_QMixLongName, IndexH2OVap, 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. ! 簡単雲モデル ! Simple cloud ! use cloud_simple, only: CloudSimple, CloudSimpleCalcCloudCover, CloudSimpleDivideWatAndIce ! 雲関系ルーチン ! Cloud-related routines ! use cloud_utils, only : CloudUtilsCalcPRCPKeyLLTemp3D ! 主成分相変化 ! Phase change of atmospheric major component ! use major_comp_phase_change, only : MajorCompPhaseChangeInAtm ! 予報変数の値の確認 ! Check values of prognostic variables ! use check_prog_vars, only: CheckProgVars ! 宣言文 ; 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:: xy_SurfHeight (:,:) ! $ z_s $ . 地表面高度 (m) ! Surface height (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_SurfRoughLength (:,:) ! 地表粗度長 (m) ! Surface rough length (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) 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:: 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:: OLD_xyr_RadSFlux (:,:,:) real(DP), allocatable:: OLD_xyr_RadLFlux (:,:,:) real(DP), allocatable:: OLD_xyra_DelRadLFlux (:,:,:,:) 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_SurfLatentHeatFlux(:,:) ! 惑星表面潜熱フラックス. ! 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_VelTransCoef (:,:,:) ! 輸送係数:運動量. ! Transfer coefficient: velocity real(DP), allocatable:: xyr_TempTransCoef (:,:,:) ! 輸送係数:温度. ! Transfer coefficient: temperature real(DP), allocatable:: xyr_QMixTransCoef(:,:,:) ! 輸送係数:混合比. ! Transfer coefficient: mixing ratio 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_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:: 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_DTempDtCond (:,:,:) ! 凝結加熱率. ! Condensation heating real(DP), allocatable:: xyz_DQVapDtCond (:,:,:) ! 凝結比湿変化. ! Condensation specific humidity tendency 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_DQH2OLiqDtLSC(:,:,:) ! Production rate of cloud water 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) ! 作業変数 ! Work variables ! integer :: IDDynMode ! 使用する力学過程 ! Dynamics used for an experiment ! integer, parameter:: IDDynModeHSPLVAS83 = 0 integer, parameter:: IDDynModeNoHorAdv = 1 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 :: 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:: IDRadMethodSimple = 24 integer :: IDMCMethod ! 湿潤対流の計算方法 ! Method for moist convection integer, parameter:: IDMCMethodNone = 30 integer, parameter:: IDMCMethodMCA = 31 integer, parameter:: IDMCMethodRAS = 32 integer :: IDLSCMethod ! 大規模凝結 (非対流性凝結) の計算方法 ! Method for large scale condensation ! (non-convective condensation) ! integer, parameter:: IDLSCMethodNone = 40 integer, parameter:: IDLSCMethodM65 = 41 integer, parameter:: IDLSCMethodLL91 = 42 integer :: IDCloudMethod ! 雲の計算方法 ! Method for cloud ! integer, parameter:: IDCloudMethodNone = 50 integer, parameter:: IDCloudMethodSimple = 51 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 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:: k integer:: n ! 組成方向に回る DO ループ用作業変数 ! Work variables for DO loop in dimension of constituents ! 実行文 ; 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.0d0 xyz_DVDt = 0.0d0 xyz_DTempDt = 0.0d0 xy_DPsDt = 0.0_DP xyzf_DQMixDt = 0.0d0 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. 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.0d0 case ( IDPhysModeJupiterSimple ) ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! call AuxVars( xy_PsB, xyz_TempB, xyzf_QMixB(:,:,:,IndexH2OVap), xyr_Press = xyr_Press ) ! Schneider and Liu (2009) による鉛直混合課程 ! Vertical diffusion by Schneider and Liu (2009) ! call SL09Diffusion( xyz_UB, xyz_VB, xyr_Press, xyz_DUDt, xyz_DVDt, xyz_DTempDtVDiff ) ! Schneider and Liu (2009) の放射モデル ! Radiation model by Schneider and Liu (2009) ! call RadSL09Flux( xyr_Press, xyz_TempB, xyr_RadSFlux, xyr_RadLUwFlux, xyra_DelRadLUwFlux ) xyr_RadLDwFlux = 0.0_DP xyra_DelRadLDwFlux = 0.0_DP ! 放射による温度変化率 ! Temperature tendency with radiation ! call RadDTempDt( xyr_RadLUwFlux, 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 xyzf_DQMixDt = 0.0_DP 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_SurfRoughLength = xy_SurfRoughLength, 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 ) ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! 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 ) 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 ( CompositionInqIndex( 'H2OLiq' ) <= 0 ) then call MessageNotify( 'E', prog_name, 'H2OLiq is not found.' ) end if xyz_QH2OLiqforRad = xyzf_QMixB(:,:,:,CompositionInqIndex( 'H2OLiq' )) xyz_QH2OSolforRad = 0.0_DP !!$ call CloudSimpleDivideWatAndIce( & !!$ & xyz_TempB, & ! (in ) !!$ & xyzf_QMixB(:,:,:,CompositionInqIndex( 'H2OLiq' )), & ! (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) + xyzf_QMixB(:,:,:,CompositionInqIndex( 'H2OLiq' )), xyz_CloudCoverforRad ) 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 ( IDRadMethodMarsV1 ) call RadMarsV1Flux( xy_SurfType, xy_SurfMajCompIceB, xy_SurfAlbedo, xyz_Press, xyr_Press, xyz_TempB, xyr_Temp, xy_SurfTemp, 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_TempB, xyr_RadSUwFlux, xyr_RadLUwFlux, xyra_DelRadLUwFlux ) xyr_RadSDwFlux = 0.0_DP xyr_RadLDwFlux = 0.0_DP xyra_DelRadLDwFlux = 0.0_DP ! This is done no to correct long wave radiation flux by PhyImplEvalRadLFluxA. ! (yot, 2010/09/28) ! !!$ xyra_DelRadLFlux = 0.0_DP xyra_DelRadLUwFlux = 0.0_DP 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 ) end select ! Net flux is calculated. ! xyr_RadSFlux = xyr_RadSUwFlux - xyr_RadSDwFlux xyr_RadLFlux = xyr_RadLUwFlux - xyr_RadLDwFlux xyra_DelRadLFlux = xyra_DelRadLUwFlux - xyra_DelRadLDwFlux ! 鉛直拡散フラックス ! Vertical diffusion flux ! 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_VelTransCoef, xyr_TempTransCoef, xyr_QMixTransCoef ) ! 地表面フラックス ! Surface flux ! call SurfaceFlux( xyz_UB, xyz_VB, xyz_TempB, xyr_Temp, xyr_VirTemp, xyzf_QMixB, xyr_Press, xy_SurfHeight, xyz_Height, xyz_Exner, xyr_Exner, xy_SurfTemp, xy_SurfHumidCoef, xy_SurfRoughLength, xyr_MomFluxX, xyr_MomFluxY, xyr_HeatFlux, xyrf_QMixFlux, xy_SurfVelTransCoef, xy_SurfTempTransCoef, xy_SurfQVapTransCoef ) ! 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_SurfLatentHeatFlux = LatentHeat * xyrf_QMixFlux(:,:,0,IndexH2OVap) ! 一部の物理過程の時間変化率の計算 (陰解法) ! 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_VelTransCoef, xyr_TempTransCoef, xyr_QMixTransCoef, xy_SurfVelTransCoef, xy_SurfTempTransCoef, xy_SurfQVapTransCoef, xyz_DUDt, xyz_DVDt, xyz_DTempDtVDiff, xyzf_DQMixDt, xy_DSurfTempDt ) 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 ) select case ( IDSfcMoistMethod ) case ( IDSfcMoistMethodBucket ) ! バケツモデルのための地表面フラックス修正 ! Modification of surface flux for bucket model ! call BucketSetFlagOceanFromMatthews( xy_SurfType, xy_BucketFlagOceanGrid ) call BucketModEvapAndLatentHeatFlux( xy_BucketFlagOceanGrid, xy_SoilMoistB, xy_SurfSnowB, xyrf_QMixFlux(:,:,0,IndexH2OVap), xy_SurfLatentHeatFlux ) end select ! 地下における熱の鉛直拡散 ! Vertical diffusion of heat under the ground ! call SubsurfaceDiffusion( xy_DeepSubSurfHeatFlux, xy_SoilHeatCap, xy_SoilHeatDiffCoef, xy_SurfTemp, xyz_SoilTemp, xyr_SoilTempTransCoef, xyr_SoilHeatFlux ) call PhyImplSDHSetMethodFromMatthews( xy_SurfType, xy_SeaIceConc, xy_PhyImplSDHIndexCalcMethod ) call PhyImplSDHTendency( xy_PhyImplSDHIndexCalcMethod, xyr_MomFluxX, xyr_MomFluxY, xyr_HeatFlux, xyrf_QMixFlux, xy_SurfLatentHeatFlux, xyr_SoilHeatFlux, xyr_RadSFlux, xyr_RadLFlux, xy_DeepSubSurfHeatFlux, xy_SurfTemp, xyz_SoilTemp, xy_SurfHumidCoef, xy_SurfHeatCapacity, xy_SoilHeatCap, xy_SoilHeatDiffCoef, xyra_DelRadLFlux, xyr_Press, xyz_Exner, xyr_Exner, xyr_VelTransCoef, xyr_TempTransCoef, xyr_QMixTransCoef, xy_SurfVelTransCoef, xy_SurfTempTransCoef, xy_SurfQVapTransCoef, xyr_SoilTempTransCoef, xy_SurfMajCompIceB, 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_VelTransCoef, xyr_TempTransCoef, xyr_QMixTransCoef, 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 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) ! 非断熱加熱率の総和の計算 ! 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, xyz_Exner, xyr_Exner, xyr_VelTransCoef, xyr_TempTransCoef, xyr_QMixTransCoef ) ! 地表面フラックスの出力 ! * 出力のみのサブルーチンであり, 計算には影響しない ! ! Output surface fluxes ! * This subroutine works for output only, ! so it does not influence a calculation. ! call SurfaceFluxOutput( xyr_MomFluxX, xyr_MomFluxY, xyr_HeatFlux, xyrf_QMixFlux, xy_SurfLatentHeatFlux, 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 ! 地面温度・土壌温度・土壌水分・積雪量の積分 ! 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 + xy_DSurfMajCompIceDt * ( 2.0_DP * DelTime ) 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 ) case ( IDDynModeNoHorAdv ) call DynamicsPhysicsOnly( 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 ) end select ! Surface pressure is temporarily adjusted, here. ! xy_PsA = xy_PsA + xy_DPsDt * ( 2.0_DP * DelTime ) 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_Press, xyr_Press ) end select 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 ) xyz_DTempDtCond = 0. xyz_DQVapDtCond = 0. ! 積雲パラメタリゼーション ! Cumulus parameterization ! select case ( IDMCMethod ) case ( IDMCMethodNone ) xyz_DQH2OLiqDtCum = 0.0_DP case ( IDMCMethodMCA ) ! 湿潤対流調節 ! Moist convective adjustment ! call MoistConvAdjust( xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyz_DTempDtCond, xyz_DQVapDtCond, xyz_Press, xyr_Press, xyz_DQH2OLiqDtCum ) case ( IDMCMethodRAS ) ! Relaxed Arakawa-Schubert scheme ! Relaxed Arakawa-Schubert scheme ! call RelaxedArakawaSchubert( xy_SurfTemp, xyz_Press, xyr_Press, xyz_Exner, xyr_Exner, xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyz_DTempDtCond, xyz_DQVapDtCond, xyz_DQH2OLiqDtCum ) end select ! ! Cloud model ! select case ( IDCloudMethod ) case ( IDCloudMethodNone ) ! 大規模凝結 (非対流性凝結) ! Large scale condensation ! select case ( IDLSCMethod ) case ( IDLSCMethodNone ) xyz_DQH2OLiqDtLSC = 0.0_DP case ( IDLSCMethodM65 ) ! 大規模凝結 (非対流性凝結) (Manabe, 1965) ! Large scale condensation (non-convective condensation) ! (Manabe, 1965) ! call LScaleCond( xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyz_DTempDtCond, xyz_DQVapDtCond, xyz_Press, xyr_Press, xyz_DQH2OLiqDtLSC ) !!$ 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) !!$ & ) end select call CloudUtilsCalcPRCPKeyLLTemp3D( xyr_Press, xyz_TempA, xyz_DQH2OLiqDtCum, xy_RainCumulus, xy_SnowCumulus ) call CloudUtilsCalcPRCPKeyLLTemp3D( xyr_Press, xyz_TempA, xyz_DQH2OLiqDtLsc, xy_RainLsc, xy_SnowLsc ) xy_Rain = xy_RainCumulus + xy_RainLsc xy_Snow = xy_SnowCumulus + xy_SnowLsc case ( IDCloudMethodSimple ) if ( CompositionInqIndex( 'H2OLiq' ) <= 0 ) then call MessageNotify( 'E', prog_name, 'H2OLiq is not found.' ) end if if ( IDMCMethod == IDMCMethodMCA ) then call MessageNotify( 'E', prog_name, 'If the moist convective adjustment is used, H2OLiq cannot be included.' ) end if ! 大規模凝結 (非対流性凝結) ! Large scale condensation ! select case ( IDLSCMethod ) case ( IDLSCMethodNone ) xyz_DQH2OLiqDtLSC = 0.0_DP case ( IDLSCMethodM65 ) ! 大規模凝結 (非対流性凝結) (Manabe, 1965) ! Large scale condensation (non-convective condensation) ! (Manabe, 1965) ! call LScaleCond( xyz_TempA, xyzf_QMixA(:,:,:,IndexH2OVap), xyz_DTempDtCond, xyz_DQVapDtCond, xyz_Press, xyr_Press, xyz_DQH2OLiqDtLSC ) !!$ 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) !!$ & ) end select ! Update cloud water ! call CloudSimple( xyr_Press, xyz_TempA, xyz_DQH2OLiqDtCum, xyz_DQH2OLiqDtLSC, xyzf_QMixA(:,:,:,CompositionInqIndex('H2OLiq')), xyz_DTempDtCond, xy_RainCumulus, xy_SnowCumulus, xy_RainLsc, xy_SnowLsc ) xy_Rain = xy_RainCumulus + xy_RainLsc xy_Snow = xy_SnowCumulus + xy_SnowLsc !!$ call PhyImplSDHSetMethodFromMatthews( & !!$ & xy_SurfType, xy_SeaIceConc, & ! (in) !!$ & xy_PhyImplSDHIndexCalcMethod & ! (out) !!$ & ) !!$ call PhyImplSDHCorSOTempBySnowMelt( & !!$ & xy_PhyImplSDHIndexCalcMethod, & ! (in ) !!$ & xy_Snow, & ! (in ) !!$ & xy_SurfTemp & ! (inout) !!$ & ) end select 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_Press, xyr_Press ) end select ! 主成分相変化 ! Phase change of atmospheric major component ! call MajorCompPhaseChangeInAtm( xyr_Press, xyz_Press, xy_PsA, xyz_TempA, xy_SurfMajCompIceA ) ! 成分の質量の補正 ! Fix masses of constituents ! call MassFixer( xyr_Press, xyzf_QMixA ) end select ! 時間フィルター ! Time filter ! if ( .not. flag_initial .or. .not. firstloop ) then call TimeFilter( 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 ) ! (in) select case ( IDPhysMode ) case ( IDPhysModeFullPhysics ) call TimeFilterSurfVars( xy_SurfMajCompIceB, xy_SoilMoistB, xy_SurfSnowB, xy_SurfMajCompIceN, xy_SoilMoistN, xy_SurfSnowN, xy_SurfMajCompIceA, xy_SoilMoistA, xy_SurfSnowA ) end select end if ! Messages for debug run ! !!$ select case ( IDPhysMode ) !!$ case ( IDPhysModeFullPhysics ) !!$ write( 6, * ) xyz_TempA(0,jmax/2+1,1), & !!$ & xyz_VirTemp(0,jmax/2+1,1) - xyz_TempB(0,jmax/2+1,1), & !!$ & xyr_VirTemp(0,jmax/2+1,1) - xyr_Temp (0,jmax/2+1,1) !!$ case default !!$ write( 6, * ) xyz_TempA(0,jmax/2+1,1) !!$ end select ! 予報変数の値の確認 ! 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 call HistoryAutoPut( TimeA, 'Ps', xy_PsA ) ! 温度の半整数σレベルの補間, 気圧と高度の算出 ! Interpolate temperature on half sigma level, ! and calculate pressure and height ! call AuxVars( xy_PsN, xyz_TempN, xyzf_QMixN(:,:,:,IndexH2OVap), xy_SurfHeight = xy_SurfHeight, xyz_Height = xyz_Height ) call HistoryAutoPut( TimeN, 'Height', xyz_Height ) select case ( IDPhysMode ) 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, 'DTempDtCond', xyz_DTempDtCond ) call HistoryAutoPut( TimeN, 'DQVapDtCond', xyz_DQVapDtCond ) call HistoryAutoPut( TimeN, 'SeaIceConc', xy_SeaIceConc ) call HistoryAutoPut( TimeN, 'SurfAlbedo', xy_SurfAlbedo ) 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 ! 地下における熱の鉛直拡散 ! 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 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 ! 火星大気向け放射モデル Ver. 1 ! radiation model for the Mars' atmosphere Ver. 1 ! use rad_Mars_V1, only : RadMarsV1Init ! 火星計算用近赤外加熱率計算 ! 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 ! 放射関連ルーチン ! Routines for radiation calculation ! use rad_utils, only : RadUtilsInit ! 鉛直拡散フラックス (Mellor and Yamada, 1974) ! Vertical diffusion flux (Mellor and Yamada, 1974) ! use vdiffusion_my1974, only : VDiffusionInit ! 簡単雲モデル ! Simple cloud ! use cloud_simple, only: CloudSimpleInit ! 雲関系ルーチン ! Cloud-related routines ! use cloud_utils, only : CloudUtilsInit ! 地表面フラックス (バルク法) ! Surface flux (Bulk method) ! use surface_flux_bulk, only : SurfaceFluxInit ! 地面温度, 土壌温度の時間積分 ! 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 ! 湿潤対流調節 ! Moist convective adjustment ! use moist_conv_adjust, only : MoistConvAdjustInit ! Relaxed Arakawa-Schubert scheme ! Relaxed Arakawa-Schubert scheme ! use relaxed_arakawa_schubert, only : RelaxedArakawaSchubertInit ! 大規模凝結 (非対流性凝結) ! 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 ! 乾燥対流調節 ! Dry convective adjustment ! use dry_conv_adjust, only : DryConvAdjustInit ! 主成分相変化 ! Phase change of atmospheric major component ! use major_comp_phase_change, only : MajorCompPhaseChangeInit ! タイムフィルター (Asselin, 1972) ! Time filter (Asselin, 1972) ! use timefilter_asselin1972, only : TimeFiltInit ! 予報変数の値の確認 ! Check values of prognostic variables ! use check_prog_vars, only : CheckProgVarsInit ! 質量の補正 ! Mass fixer ! use mass_fixer, only : MassFixerInit ! 宣言文 ; Declaration statements ! implicit none character(*), parameter:: version = '$Name: dcpam5-20120921 $' // '$Id: dcpam_main.f90,v 1.44 2012-09-17 11:01:58 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) :: 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) :: 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):: 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:: k integer:: n ! 組成方向に回る DO ループ用作業変数 ! Work variables for DO loop in dimension of constituents ! NAMELIST 変数群 ! NAMELIST group name ! namelist /dcpam_main_nml/ DynMode, PhysMode, RadModel, PhysImpMode, MCMethod, LSCMethod, CloudMethod, SfcMoistMethod, 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' PhysImpMode = '1LayModel' !!$ PhysImpMode = 'SoilModel' !!$ PhysImpMode = 'SoilModelSO' !!$ PhysImpMode = 'AtmOnly' !!$ MCMethod = 'None' MCMethod = 'MCA' !!$ MCMethod = 'RAS' !!$ LSCMethod = 'None' LSCMethod = 'M65' !!$ LSCMethod = 'LL91' CloudMethod = 'None' !!$ CloudMethod = 'Simple' SfcMoistMethod = 'None' !!$ SfcMoistMethod = 'Bucket' !!$ 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 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 ( '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 ( 'Simple' ) IDRadMethod = IDRadMethodSimple case default call MessageNotify( 'E', prog_name, 'RadModel=<%c> is not supported.', c1 = trim(RadModel) ) 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 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 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 default call MessageNotify( 'E', prog_name, 'LSCloudMethod=<%c> is not supported.', c1 = trim(CloudMethod) ) end select ! 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 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' 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 ( 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 ( IDRadMethodSimple ) briefexplrad = 'Simple radiation model (tentative)' case default call MessageNotify( 'E', 'Unexpected error in setting briefexplrad', '' ) 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, '| 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 call HistoryAutoAddVariable( 'Ps' , (/ 'lon ', 'lat ', 'time' /), 'surface pressure', 'Pa' ) ! (in) call HistoryAutoAddVariable( 'Height' , (/ 'lon ', 'lat ', 'sig ', 'time' /), 'geopotential height', 'm' ) ! (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 ) select case ( IDPhysMode ) 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( 'DTempDtCond' , (/ 'lon ', 'lat ', 'sig ', 'time' /), 'condensation heating', 'K s-1' ) call HistoryAutoAddVariable( 'DQVapDtCond' , (/ 'lon ', 'lat ', 'sig ', 'time' /), 'condensation moistening', 'kg kg-1 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( xy_SurfHeight(0:imax-1, 1:jmax) ) allocate( xyz_Height (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_SurfRoughLength (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_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( 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) ) allocate( OLD_xyr_RadSFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( OLD_xyr_RadLFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( OLD_xyra_DelRadLFlux (0:imax-1, 1:jmax, 0:kmax, 0:1) ) 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_SurfLatentHeatFlux(0:imax-1, 1:jmax) ) allocate( xyr_SoilHeatFlux(0:imax-1, 1:jmax, 0:kslmax) ) allocate( xyr_VelTransCoef (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_TempTransCoef(0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_QMixTransCoef(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_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_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_DTempDtCond (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DQVapDtCond (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DQH2OLiqDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OLiqDtLSC (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) ) ! ヒストリデータ出力のためのへの変数登録 ! 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' ) 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( 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) ) end select ! 惑星表面データの設定 ! Setting planetary surface properties ! call SurfacePropertiesInit( FlagPhysImpSoilModelSO, FlagSnow ) 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 SL09Diffusion( & !!$ & xyz_UB, xyz_VB, xyr_Press, & ! (in) !!$ & xyz_DUDt, xyz_DVDt, xyz_DTempDtVDiff & ! (out) !!$ & ) !!$ !!$ ! Schneider and Liu (2009) の放射モデル !!$ ! Radiation model by Schneider and Liu (2009) !!$ ! !!$ call RadSL09Flux( & !!$ & xyr_Press, xyz_TempB, & !!$ & xyr_RadSFlux, xyr_RadLFlux, xyra_DelRadLFlux & !!$ & ) !!$ ! 放射関連ルーチン ! Routines for radiation calculation ! call RadUtilsInit case ( IDPhysModeFullPhysics ) ! 惑星表面データの設定 ! Setting planetary surface properties ! call SurfacePropertiesInit( FlagPhysImpSoilModelSO, FlagSnow ) ! 補助的な変数を計算するサブルーチン・関数群 ! 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 ( CompositionInqIndex( 'H2OLiq' ) <= 0 ) then call MessageNotify( 'E', prog_name, 'H2OLiq is not found.' ) end if select case ( IDCloudMethod ) case ( IDCloudMethodNone ) case ( IDCloudMethodSimple ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) end select ! 地球大気向け放射モデル Ver. 2 ! radiation model for the Earth's atmosphere Ver. 2 ! call RadEarthV2Init( 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 end select ! 鉛直拡散フラックス (Mellor and Yamada, 1974) ! Vertical diffusion flux (Mellor and Yamada, 1974) ! call VDiffusionInit ! 地表面フラックス (バルク法) ! Surface flux (Bulk method) ! call SurfaceFluxInit ! 一部の物理過程の時間変化率の計算 (陰解法) ! 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 ) case ( IDPhyTendMethodImpAtmOnly ) ! 陰解法による時間積分 (大気のみ / 惑星表面温度・土壌温度計算なし) ! Time integration by using implicit scheme in case without calculation of surface and soil temperature ! call PhyImplAtmOnlyInit end select ! 陰解法による時間積分のためのルーチン ! Routines for time integration with implicit scheme ! call PhyImplUtilsInit ! 放射関連ルーチン ! Routines for radiation calculation ! call RadUtilsInit 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 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 ( 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 RelaxedArakawaSchubertInit end select select case ( IDLSCMethod ) case ( IDLSCMethodM65 ) ! 大規模凝結 (非対流性凝結) (Manabe, 1965) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! call LScaleCondInit !!$ case ( IDLSCMethodLL91 ) !!$ ! 大規模凝結 (非対流性凝結) (Le Treut and Li, 1991) !!$ ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) !!$ ! !!$ call LScaleCondLL91Init end select ! ! Cloud model ! select case ( IDCloudMethod ) case ( IDCloudMethodNone ) ! 雲関系ルーチン ! Cloud-related routines ! call CloudUtilsInit( FlagSnow ) case ( IDCloudMethodSimple ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) 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 ! 主成分相変化 ! Phase change of atmospheric major component ! call MajorCompPhaseChangeInit( FlagMajCompPhaseChange, CondMajCompName ) ! 質量の補正 ! Mass fixer ! call MassFixerInit end select ! タイムフィルター (Asselin, 1972) ! Time filter (Asselin, 1972) ! call TimeFiltInit ! 予報変数の値の確認 ! 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 ! 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( xy_SurfHeight ) deallocate( xyz_Height ) if ( IDPhysMode == IDPhysModeFullPhysics ) then deallocate( xy_SurfAlbedo ) deallocate( xy_SurfHumidCoef ) deallocate( xy_SurfRoughLength ) deallocate( xy_SurfHeatCapacity ) deallocate( xy_SeaIceConc ) deallocate( xy_SurfCond ) deallocate( xy_SurfType ) deallocate( xy_DeepSubSurfHeatFlux ) deallocate( xy_SoilHeatCap ) deallocate( xy_SoilHeatDiffCoef ) deallocate( xy_PhyImplSDHIndexCalcMethod ) deallocate( xy_BucketFlagOceanGrid ) deallocate( xyr_Temp ) deallocate( xyz_VirTemp ) deallocate( xyr_VirTemp ) 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_SurfLatentHeatFlux ) deallocate( xyr_SoilHeatFlux ) deallocate( xyr_VelTransCoef ) deallocate( xyr_TempTransCoef ) deallocate( xyr_QMixTransCoef ) deallocate( xy_SurfVelTransCoef ) deallocate( xy_SurfTempTransCoef ) deallocate( xy_SurfQVapTransCoef ) deallocate( xy_DSurfTempDt ) deallocate( xyz_DSoilTempDt ) deallocate( xy_DPsDt ) deallocate( xy_DSurfMajCompIceDt ) deallocate( xy_DSoilMoistDt ) deallocate( xy_DSurfSnowDt ) deallocate( xyz_DTempDtVDiff ) deallocate( xyz_DTempDtRadL ) deallocate( xyz_DTempDtRadS ) deallocate( xy_Rain ) deallocate( xy_RainCumulus ) deallocate( xy_RainLsc ) deallocate( xy_SnowCumulus ) deallocate( xy_SnowLsc ) deallocate( xyz_DTempDtCond ) deallocate( xyz_DQVapDtCond ) deallocate( xyz_DQH2OLiqDtCum ) deallocate( xyz_DQH2OLiqDtLSC ) deallocate( xyz_QH2OLiqforRad ) deallocate( xyz_QH2OSolforRad ) deallocate( xyz_CloudCoverforRad ) end if ! FlagFullPhysics ! 各モジュール内の変数の割付解除 ! Dellocation of variables in modules ! call DynamicsHSplVAS83Finalize 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 ! 地下における熱の鉛直拡散 ! 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 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 ! 火星大気向け放射モデル Ver. 1 ! radiation model for the Mars' atmosphere Ver. 1 ! use rad_Mars_V1, only : RadMarsV1Init ! 火星計算用近赤外加熱率計算 ! 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 ! 放射関連ルーチン ! Routines for radiation calculation ! use rad_utils, only : RadUtilsInit ! 鉛直拡散フラックス (Mellor and Yamada, 1974) ! Vertical diffusion flux (Mellor and Yamada, 1974) ! use vdiffusion_my1974, only : VDiffusionInit ! 簡単雲モデル ! Simple cloud ! use cloud_simple, only: CloudSimpleInit ! 雲関系ルーチン ! Cloud-related routines ! use cloud_utils, only : CloudUtilsInit ! 地表面フラックス (バルク法) ! Surface flux (Bulk method) ! use surface_flux_bulk, only : SurfaceFluxInit ! 地面温度, 土壌温度の時間積分 ! 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 ! 湿潤対流調節 ! Moist convective adjustment ! use moist_conv_adjust, only : MoistConvAdjustInit ! Relaxed Arakawa-Schubert scheme ! Relaxed Arakawa-Schubert scheme ! use relaxed_arakawa_schubert, only : RelaxedArakawaSchubertInit ! 大規模凝結 (非対流性凝結) ! 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 ! 乾燥対流調節 ! Dry convective adjustment ! use dry_conv_adjust, only : DryConvAdjustInit ! 主成分相変化 ! Phase change of atmospheric major component ! use major_comp_phase_change, only : MajorCompPhaseChangeInit ! タイムフィルター (Asselin, 1972) ! Time filter (Asselin, 1972) ! use timefilter_asselin1972, only : TimeFiltInit ! 予報変数の値の確認 ! Check values of prognostic variables ! use check_prog_vars, only : CheckProgVarsInit ! 質量の補正 ! Mass fixer ! use mass_fixer, only : MassFixerInit ! 宣言文 ; Declaration statements ! implicit none character(*), parameter:: version = '$Name: dcpam5-20120921 $' // '$Id: dcpam_main.f90,v 1.44 2012-09-17 11:01:58 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) :: 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) :: 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):: 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:: k integer:: n ! 組成方向に回る DO ループ用作業変数 ! Work variables for DO loop in dimension of constituents ! NAMELIST 変数群 ! NAMELIST group name ! namelist /dcpam_main_nml/ DynMode, PhysMode, RadModel, PhysImpMode, MCMethod, LSCMethod, CloudMethod, SfcMoistMethod, 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' PhysImpMode = '1LayModel' !!$ PhysImpMode = 'SoilModel' !!$ PhysImpMode = 'SoilModelSO' !!$ PhysImpMode = 'AtmOnly' !!$ MCMethod = 'None' MCMethod = 'MCA' !!$ MCMethod = 'RAS' !!$ LSCMethod = 'None' LSCMethod = 'M65' !!$ LSCMethod = 'LL91' CloudMethod = 'None' !!$ CloudMethod = 'Simple' SfcMoistMethod = 'None' !!$ SfcMoistMethod = 'Bucket' !!$ 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 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 ( '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 ( 'Simple' ) IDRadMethod = IDRadMethodSimple case default call MessageNotify( 'E', prog_name, 'RadModel=<%c> is not supported.', c1 = trim(RadModel) ) 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 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 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 default call MessageNotify( 'E', prog_name, 'LSCloudMethod=<%c> is not supported.', c1 = trim(CloudMethod) ) end select ! 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 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' 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 ( 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 ( IDRadMethodSimple ) briefexplrad = 'Simple radiation model (tentative)' case default call MessageNotify( 'E', 'Unexpected error in setting briefexplrad', '' ) 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, '| 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 call HistoryAutoAddVariable( 'Ps' , (/ 'lon ', 'lat ', 'time' /), 'surface pressure', 'Pa' ) ! (in) call HistoryAutoAddVariable( 'Height' , (/ 'lon ', 'lat ', 'sig ', 'time' /), 'geopotential height', 'm' ) ! (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 ) select case ( IDPhysMode ) 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( 'DTempDtCond' , (/ 'lon ', 'lat ', 'sig ', 'time' /), 'condensation heating', 'K s-1' ) call HistoryAutoAddVariable( 'DQVapDtCond' , (/ 'lon ', 'lat ', 'sig ', 'time' /), 'condensation moistening', 'kg kg-1 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( xy_SurfHeight(0:imax-1, 1:jmax) ) allocate( xyz_Height (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_SurfRoughLength (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_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( 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) ) allocate( OLD_xyr_RadSFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( OLD_xyr_RadLFlux (0:imax-1, 1:jmax, 0:kmax) ) allocate( OLD_xyra_DelRadLFlux (0:imax-1, 1:jmax, 0:kmax, 0:1) ) 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_SurfLatentHeatFlux(0:imax-1, 1:jmax) ) allocate( xyr_SoilHeatFlux(0:imax-1, 1:jmax, 0:kslmax) ) allocate( xyr_VelTransCoef (0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_TempTransCoef(0:imax-1, 1:jmax, 0:kmax) ) allocate( xyr_QMixTransCoef(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_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_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_DTempDtCond (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DQVapDtCond (0:imax-1, 1:jmax, 1:kmax) ) allocate( xyz_DQH2OLiqDtCum (0:imax-1,1:jmax,1:kmax) ) allocate( xyz_DQH2OLiqDtLSC (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) ) ! ヒストリデータ出力のためのへの変数登録 ! 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' ) 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( 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) ) end select ! 惑星表面データの設定 ! Setting planetary surface properties ! call SurfacePropertiesInit( FlagPhysImpSoilModelSO, FlagSnow ) 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 SL09Diffusion( & !!$ & xyz_UB, xyz_VB, xyr_Press, & ! (in) !!$ & xyz_DUDt, xyz_DVDt, xyz_DTempDtVDiff & ! (out) !!$ & ) !!$ !!$ ! Schneider and Liu (2009) の放射モデル !!$ ! Radiation model by Schneider and Liu (2009) !!$ ! !!$ call RadSL09Flux( & !!$ & xyr_Press, xyz_TempB, & !!$ & xyr_RadSFlux, xyr_RadLFlux, xyra_DelRadLFlux & !!$ & ) !!$ ! 放射関連ルーチン ! Routines for radiation calculation ! call RadUtilsInit case ( IDPhysModeFullPhysics ) ! 惑星表面データの設定 ! Setting planetary surface properties ! call SurfacePropertiesInit( FlagPhysImpSoilModelSO, FlagSnow ) ! 補助的な変数を計算するサブルーチン・関数群 ! 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 ( CompositionInqIndex( 'H2OLiq' ) <= 0 ) then call MessageNotify( 'E', prog_name, 'H2OLiq is not found.' ) end if select case ( IDCloudMethod ) case ( IDCloudMethodNone ) case ( IDCloudMethodSimple ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) end select ! 地球大気向け放射モデル Ver. 2 ! radiation model for the Earth's atmosphere Ver. 2 ! call RadEarthV2Init( 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 end select ! 鉛直拡散フラックス (Mellor and Yamada, 1974) ! Vertical diffusion flux (Mellor and Yamada, 1974) ! call VDiffusionInit ! 地表面フラックス (バルク法) ! Surface flux (Bulk method) ! call SurfaceFluxInit ! 一部の物理過程の時間変化率の計算 (陰解法) ! 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 ) case ( IDPhyTendMethodImpAtmOnly ) ! 陰解法による時間積分 (大気のみ / 惑星表面温度・土壌温度計算なし) ! Time integration by using implicit scheme in case without calculation of surface and soil temperature ! call PhyImplAtmOnlyInit end select ! 陰解法による時間積分のためのルーチン ! Routines for time integration with implicit scheme ! call PhyImplUtilsInit ! 放射関連ルーチン ! Routines for radiation calculation ! call RadUtilsInit 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 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 ( 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 RelaxedArakawaSchubertInit end select select case ( IDLSCMethod ) case ( IDLSCMethodM65 ) ! 大規模凝結 (非対流性凝結) (Manabe, 1965) ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) ! call LScaleCondInit !!$ case ( IDLSCMethodLL91 ) !!$ ! 大規模凝結 (非対流性凝結) (Le Treut and Li, 1991) !!$ ! Large scale condensation (non-convective condensation) (Le Treut and Li, 1991) !!$ ! !!$ call LScaleCondLL91Init end select ! ! Cloud model ! select case ( IDCloudMethod ) case ( IDCloudMethodNone ) ! 雲関系ルーチン ! Cloud-related routines ! call CloudUtilsInit( FlagSnow ) case ( IDCloudMethodSimple ) ! 簡単雲モデル ! Simple cloud ! call CloudSimpleInit( FlagSnow ) 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 ! 主成分相変化 ! Phase change of atmospheric major component ! call MajorCompPhaseChangeInit( FlagMajCompPhaseChange, CondMajCompName ) ! 質量の補正 ! Mass fixer ! call MassFixerInit end select ! タイムフィルター (Asselin, 1972) ! Time filter (Asselin, 1972) ! call TimeFiltInit ! 予報変数の値の確認 ! 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 ! 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( xy_SurfHeight ) deallocate( xyz_Height ) if ( IDPhysMode == IDPhysModeFullPhysics ) then deallocate( xy_SurfAlbedo ) deallocate( xy_SurfHumidCoef ) deallocate( xy_SurfRoughLength ) deallocate( xy_SurfHeatCapacity ) deallocate( xy_SeaIceConc ) deallocate( xy_SurfCond ) deallocate( xy_SurfType ) deallocate( xy_DeepSubSurfHeatFlux ) deallocate( xy_SoilHeatCap ) deallocate( xy_SoilHeatDiffCoef ) deallocate( xy_PhyImplSDHIndexCalcMethod ) deallocate( xy_BucketFlagOceanGrid ) deallocate( xyr_Temp ) deallocate( xyz_VirTemp ) deallocate( xyr_VirTemp ) 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_SurfLatentHeatFlux ) deallocate( xyr_SoilHeatFlux ) deallocate( xyr_VelTransCoef ) deallocate( xyr_TempTransCoef ) deallocate( xyr_QMixTransCoef ) deallocate( xy_SurfVelTransCoef ) deallocate( xy_SurfTempTransCoef ) deallocate( xy_SurfQVapTransCoef ) deallocate( xy_DSurfTempDt ) deallocate( xyz_DSoilTempDt ) deallocate( xy_DPsDt ) deallocate( xy_DSurfMajCompIceDt ) deallocate( xy_DSoilMoistDt ) deallocate( xy_DSurfSnowDt ) deallocate( xyz_DTempDtVDiff ) deallocate( xyz_DTempDtRadL ) deallocate( xyz_DTempDtRadS ) deallocate( xy_Rain ) deallocate( xy_RainCumulus ) deallocate( xy_RainLsc ) deallocate( xy_SnowCumulus ) deallocate( xy_SnowLsc ) deallocate( xyz_DTempDtCond ) deallocate( xyz_DQVapDtCond ) deallocate( xyz_DQH2OLiqDtCum ) deallocate( xyz_DQH2OLiqDtLSC ) deallocate( xyz_QH2OLiqforRad ) deallocate( xyz_QH2OSolforRad ) deallocate( xyz_CloudCoverforRad ) end if ! FlagFullPhysics ! 各モジュール内の変数の割付解除 ! Dellocation of variables in modules ! call DynamicsHSplVAS83Finalize 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