From 1e3119264205aa4b531a2c275bf108cb0c15fe4c Mon Sep 17 00:00:00 2001 From: Quentin Rodier <quentin.rodier@meteo.fr> Date: Thu, 21 Sep 2023 18:28:34 +0200 Subject: [PATCH] Quentin 21/09/2023: PHYEX v0.6.3 impacts on MNH files (changes from PHYEX v0.4.1 which is mostly change from initialization of param --- src/MNH/advection_metsv.f90 | 2 +- src/MNH/aer_effic.f90 | 4 +- src/MNH/aer_effic3D.f90 | 6 +- src/MNH/aer_wet_dep_kmt_warm.f90 | 4 +- src/MNH/aero_effic3D.f90 | 6 +- src/MNH/boundaries.f90 | 4 +- src/MNH/ch_aqueous_sedim1mom.f90 | 4 +- src/MNH/ch_aqueous_tmicice.f90 | 4 +- src/MNH/ch_meteo_trans_kess.f90 | 2 +- src/MNH/cphase_profile.f90 | 2 +- src/MNH/deallocate_model1.f90 | 5 +- src/MNH/default_desfmn.f90 | 225 +- src/MNH/endstep.f90 | 2 +- src/MNH/flash_geom_elec.f90 | 4 +- src/MNH/goto_model_wrapper.f90 | 10 + src/MNH/ground_paramn.f90 | 4 +- src/MNH/ibm_forcing.f90 | 2 +- src/MNH/ibm_forcing_tr.f90 | 2 +- src/MNH/ibm_generls.f90 | 1 - src/MNH/ice_adjust_bis.f90 | 4 +- src/MNH/ini_budget.f90 | 4 +- src/MNH/ini_elecn.f90 | 4 +- src/MNH/ini_flash_geom_elec.f90 | 2 +- src/MNH/ini_lb.f90 | 2 +- src/MNH/ini_micron.f90 | 6 +- src/MNH/ini_modeln.f90 | 24 +- src/MNH/ini_nsv.f90 | 98 +- src/MNH/ini_radar.f90 | 9 +- src/MNH/ini_segn.f90 | 3 +- src/MNH/ini_tke_eps.f90 | 7 +- src/MNH/init_mnh.f90 | 12 +- src/MNH/ion_attach_elec.f90 | 4 +- src/MNH/latlon_to_xy.f90 | 2 +- src/MNH/lesn.f90 | 12 +- src/MNH/lidar.f90 | 4 +- src/MNH/mnh2lpdm.f90 | 2 +- src/MNH/mnh2lpdm_ech.f90 | 2 - src/MNH/mnh2lpdm_ini.f90 | 2 +- src/MNH/modeln.f90 | 20 +- src/MNH/phys_paramn.f90 | 25 +- src/MNH/prep_ideal_case.f90 | 13 +- src/MNH/prep_nest_pgd.f90 | 1 + src/MNH/prep_pgd.f90 | 1 + src/MNH/prep_real_case.f90 | 8 +- src/MNH/prep_surfex.f90 | 1 + src/MNH/radar_scattering.f90 | 4 +- src/MNH/radiations.f90 | 2 +- src/MNH/read_all_data_grib_case.f90 | 2 - src/MNH/read_desfmn.f90 | 49 +- src/MNH/read_exsegn.f90 | 130 +- src/MNH/read_field.f90 | 2 +- src/MNH/read_precip_field.f90 | 2 +- src/MNH/resolved_cloud.f90 | 43 +- src/MNH/series_cloud_elec.f90 | 4 +- src/MNH/set_conc_ice_c1r3.f90 | 2 +- src/MNH/set_msk.f90 | 4 +- src/MNH/set_rsou.f90 | 4 +- src/MNH/shallow_mf_pack.f90 | 29 +- src/MNH/spawn_model2.f90 | 2 +- src/MNH/to_elec_fieldn.f90 | 2 +- src/MNH/two_wayn.f90 | 2 +- src/MNH/update_nsv.f90 | 45 +- src/MNH/ver_interp_field.f90 | 2 +- src/MNH/write_desfmn.f90 | 41 +- src/MNH/write_lesn.f90 | 4 +- src/MNH/write_lfifm1_for_diag_supp.f90 | 3 +- src/MNH/xy_to_latlon.f90 | 2 +- src/MNH/yomhook.f90 | 1 + src/MNH/zoom_pgd.f90 | 1 + src/PHYEX/ext/advection_metsv.f90 | 719 --- src/PHYEX/ext/aer_effic.f90 | 257 - src/PHYEX/ext/aer_effic3D.f90 | 225 - src/PHYEX/ext/aer_wet_dep_kmt_warm.f90 | 1060 ---- src/PHYEX/ext/aero_effic3D.f90 | 247 - src/PHYEX/ext/aircraft_balloon_evol.f90 | 1037 ---- src/PHYEX/ext/boundaries.f90 | 1281 ----- src/PHYEX/ext/ch_aqueous_sedim1mom.f90 | 382 -- src/PHYEX/ext/ch_aqueous_tmicice.f90 | 1304 ----- src/PHYEX/ext/ch_meteo_trans_kess.f90 | 351 -- src/PHYEX/ext/cphase_profile.f90 | 140 - src/PHYEX/ext/deallocate_model1.f90 | 705 --- src/PHYEX/ext/default_desfmn.f90 | 1327 ----- src/PHYEX/ext/diagnos_les_mf.f90 | 244 - src/PHYEX/ext/endstep.f90 | 668 --- src/PHYEX/ext/flash_geom_elec.f90 | 2873 ---------- src/PHYEX/ext/goto_model_wrapper.f90 | 252 - src/PHYEX/ext/ground_paramn.f90 | 1521 ------ src/PHYEX/ext/ibm_affectv.f90 | 402 -- src/PHYEX/ext/ibm_forcing.f90 | 314 -- src/PHYEX/ext/ibm_forcing_tr.f90 | 410 -- src/PHYEX/ext/ibm_generls.f90 | 541 -- src/PHYEX/ext/ice_adjust_bis.f90 | 160 - src/PHYEX/ext/ini_budget.f90 | 4898 ------------------ src/PHYEX/ext/ini_elecn.f90 | 327 -- src/PHYEX/ext/ini_flash_geom_elec.f90 | 148 - src/PHYEX/ext/ini_lb.f90 | 730 --- src/PHYEX/ext/ini_lesn.f90 | 1995 ------- src/PHYEX/ext/ini_micron.f90 | 327 -- src/PHYEX/ext/ini_modeln.f90 | 2919 ----------- src/PHYEX/ext/ini_nsv.f90 | 1237 ----- src/PHYEX/ext/ini_radar.f90 | 234 - src/PHYEX/ext/ini_segn.f90 | 483 -- src/PHYEX/ext/ini_tke_eps.f90 | 179 - src/PHYEX/ext/init_mnh.f90 | 252 - src/PHYEX/ext/ion_attach_elec.f90 | 631 --- src/PHYEX/ext/latlon_to_xy.f90 | 225 - src/PHYEX/ext/les_cloud_masksn.f90 | 419 -- src/PHYEX/ext/les_ini_timestepn.f90 | 407 -- src/PHYEX/ext/lesn.f90 | 3582 ------------- src/PHYEX/ext/lidar.f90 | 695 --- src/PHYEX/ext/mnh2lpdm.f90 | 181 - src/PHYEX/ext/mnh2lpdm_ech.f90 | 497 -- src/PHYEX/ext/mnh2lpdm_ini.f90 | 459 -- src/PHYEX/ext/modeln.f90 | 2415 --------- src/PHYEX/ext/phys_paramn.f90 | 1764 ------- src/PHYEX/ext/prep_ideal_case.f90 | 1953 ------- src/PHYEX/ext/prep_nest_pgd.f90 | 408 -- src/PHYEX/ext/prep_pgd.f90 | 340 -- src/PHYEX/ext/prep_real_case.f90 | 1451 ------ src/PHYEX/ext/prep_surfex.f90 | 208 - src/PHYEX/ext/profilern.f90 | 383 -- src/PHYEX/ext/radar_scattering.f90 | 2088 -------- src/PHYEX/ext/radiations.f90 | 3504 ------------- src/PHYEX/ext/read_all_data_grib_case.f90 | 2615 ---------- src/PHYEX/ext/read_desfmn.f90 | 890 ---- src/PHYEX/ext/read_exsegn.f90 | 3040 ----------- src/PHYEX/ext/read_field.f90 | 1700 ------ src/PHYEX/ext/read_precip_field.f90 | 299 -- src/PHYEX/ext/resolved_cloud.f90 | 1107 ---- src/PHYEX/ext/series_cloud_elec.f90 | 618 --- src/PHYEX/ext/set_conc_ice_c1r3.f90 | 129 - src/PHYEX/ext/set_msk.f90 | 286 - src/PHYEX/ext/set_rsou.f90 | 1640 ------ src/PHYEX/ext/shallow_mf_pack.f90 | 381 -- src/PHYEX/ext/spawn_model2.f90 | 1696 ------ src/PHYEX/ext/switch_sbg_lesn.f90 | 589 --- src/PHYEX/ext/to_elec_fieldn.f90 | 184 - src/PHYEX/ext/two_wayn.f90 | 1309 ----- src/PHYEX/ext/update_nsv.f90 | 187 - src/PHYEX/ext/ver_interp_field.f90 | 327 -- src/PHYEX/ext/write_desfmn.f90 | 730 --- src/PHYEX/ext/write_lesn.f90 | 1319 ----- src/PHYEX/ext/write_lfifm1_for_diag.f90 | 4201 --------------- src/PHYEX/ext/write_lfifm1_for_diag_supp.f90 | 1664 ------ src/PHYEX/ext/xy_to_latlon.f90 | 204 - src/PHYEX/ext/yomhook.f90 | 156 - src/PHYEX/ext/zoom_pgd.f90 | 271 - 147 files changed, 322 insertions(+), 77926 deletions(-) delete mode 100644 src/PHYEX/ext/advection_metsv.f90 delete mode 100644 src/PHYEX/ext/aer_effic.f90 delete mode 100644 src/PHYEX/ext/aer_effic3D.f90 delete mode 100644 src/PHYEX/ext/aer_wet_dep_kmt_warm.f90 delete mode 100644 src/PHYEX/ext/aero_effic3D.f90 delete mode 100644 src/PHYEX/ext/aircraft_balloon_evol.f90 delete mode 100644 src/PHYEX/ext/boundaries.f90 delete mode 100644 src/PHYEX/ext/ch_aqueous_sedim1mom.f90 delete mode 100644 src/PHYEX/ext/ch_aqueous_tmicice.f90 delete mode 100644 src/PHYEX/ext/ch_meteo_trans_kess.f90 delete mode 100644 src/PHYEX/ext/cphase_profile.f90 delete mode 100644 src/PHYEX/ext/deallocate_model1.f90 delete mode 100644 src/PHYEX/ext/default_desfmn.f90 delete mode 100644 src/PHYEX/ext/diagnos_les_mf.f90 delete mode 100644 src/PHYEX/ext/endstep.f90 delete mode 100644 src/PHYEX/ext/flash_geom_elec.f90 delete mode 100644 src/PHYEX/ext/goto_model_wrapper.f90 delete mode 100644 src/PHYEX/ext/ground_paramn.f90 delete mode 100644 src/PHYEX/ext/ibm_affectv.f90 delete mode 100644 src/PHYEX/ext/ibm_forcing.f90 delete mode 100644 src/PHYEX/ext/ibm_forcing_tr.f90 delete mode 100644 src/PHYEX/ext/ibm_generls.f90 delete mode 100644 src/PHYEX/ext/ice_adjust_bis.f90 delete mode 100644 src/PHYEX/ext/ini_budget.f90 delete mode 100644 src/PHYEX/ext/ini_elecn.f90 delete mode 100644 src/PHYEX/ext/ini_flash_geom_elec.f90 delete mode 100644 src/PHYEX/ext/ini_lb.f90 delete mode 100644 src/PHYEX/ext/ini_lesn.f90 delete mode 100644 src/PHYEX/ext/ini_micron.f90 delete mode 100644 src/PHYEX/ext/ini_modeln.f90 delete mode 100644 src/PHYEX/ext/ini_nsv.f90 delete mode 100644 src/PHYEX/ext/ini_radar.f90 delete mode 100644 src/PHYEX/ext/ini_segn.f90 delete mode 100644 src/PHYEX/ext/ini_tke_eps.f90 delete mode 100644 src/PHYEX/ext/init_mnh.f90 delete mode 100644 src/PHYEX/ext/ion_attach_elec.f90 delete mode 100644 src/PHYEX/ext/latlon_to_xy.f90 delete mode 100644 src/PHYEX/ext/les_cloud_masksn.f90 delete mode 100644 src/PHYEX/ext/les_ini_timestepn.f90 delete mode 100644 src/PHYEX/ext/lesn.f90 delete mode 100644 src/PHYEX/ext/lidar.f90 delete mode 100644 src/PHYEX/ext/mnh2lpdm.f90 delete mode 100644 src/PHYEX/ext/mnh2lpdm_ech.f90 delete mode 100644 src/PHYEX/ext/mnh2lpdm_ini.f90 delete mode 100644 src/PHYEX/ext/modeln.f90 delete mode 100644 src/PHYEX/ext/phys_paramn.f90 delete mode 100644 src/PHYEX/ext/prep_ideal_case.f90 delete mode 100644 src/PHYEX/ext/prep_nest_pgd.f90 delete mode 100644 src/PHYEX/ext/prep_pgd.f90 delete mode 100644 src/PHYEX/ext/prep_real_case.f90 delete mode 100644 src/PHYEX/ext/prep_surfex.f90 delete mode 100644 src/PHYEX/ext/profilern.f90 delete mode 100644 src/PHYEX/ext/radar_scattering.f90 delete mode 100644 src/PHYEX/ext/radiations.f90 delete mode 100644 src/PHYEX/ext/read_all_data_grib_case.f90 delete mode 100644 src/PHYEX/ext/read_desfmn.f90 delete mode 100644 src/PHYEX/ext/read_exsegn.f90 delete mode 100644 src/PHYEX/ext/read_field.f90 delete mode 100644 src/PHYEX/ext/read_precip_field.f90 delete mode 100644 src/PHYEX/ext/resolved_cloud.f90 delete mode 100644 src/PHYEX/ext/series_cloud_elec.f90 delete mode 100644 src/PHYEX/ext/set_conc_ice_c1r3.f90 delete mode 100644 src/PHYEX/ext/set_msk.f90 delete mode 100644 src/PHYEX/ext/set_rsou.f90 delete mode 100644 src/PHYEX/ext/shallow_mf_pack.f90 delete mode 100644 src/PHYEX/ext/spawn_model2.f90 delete mode 100644 src/PHYEX/ext/switch_sbg_lesn.f90 delete mode 100644 src/PHYEX/ext/to_elec_fieldn.f90 delete mode 100644 src/PHYEX/ext/two_wayn.f90 delete mode 100644 src/PHYEX/ext/update_nsv.f90 delete mode 100644 src/PHYEX/ext/ver_interp_field.f90 delete mode 100644 src/PHYEX/ext/write_desfmn.f90 delete mode 100644 src/PHYEX/ext/write_lesn.f90 delete mode 100644 src/PHYEX/ext/write_lfifm1_for_diag.f90 delete mode 100644 src/PHYEX/ext/write_lfifm1_for_diag_supp.f90 delete mode 100644 src/PHYEX/ext/xy_to_latlon.f90 delete mode 100644 src/PHYEX/ext/yomhook.f90 delete mode 100644 src/PHYEX/ext/zoom_pgd.f90 diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index a0ef0da8c..8473c5a3b 100644 --- a/src/MNH/advection_metsv.f90 +++ b/src/MNH/advection_metsv.f90 @@ -151,7 +151,7 @@ use modd_budget, only: lbudget_th, lbudget_tke, lbudget_rv, lbudget_rc, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & tbudgets USE MODD_CST -USE MODD_CTURB, ONLY: XTKEMIN +USE MODD_TURB_n, ONLY: XTKEMIN USE MODD_CONF, ONLY: LNEUTRAL,NHALO,L1D, L2D use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IBM_PARAM_n, ONLY: LIBM,XIBM_LS,XIBM_EPSI diff --git a/src/MNH/aer_effic.f90 b/src/MNH/aer_effic.f90 index 8c7b7af94..7b91959ce 100644 --- a/src/MNH/aer_effic.f90 +++ b/src/MNH/aer_effic.f90 @@ -84,10 +84,10 @@ SUBROUTINE AER_EFFIC(PRG,PVGG, & !aerosol radius/fall speed (m/s) !* 0. DECLARATIONS ! ------------ ! -USE MODD_RAIN_ICE_PARAM, ONLY : YFSEDR => XFSEDR, YEXSEDR => XEXSEDR +USE MODD_RAIN_ICE_PARAM_n, ONLY : YFSEDR => XFSEDR, YEXSEDR => XEXSEDR !++cb++ !++th++ -USE MODD_RAIN_ICE_DESCR, ONLY : YCCR => XCCR, YLBR => XLBR, YLBEXR => XLBEXR, & +USE MODD_RAIN_ICE_DESCR_n, ONLY : YCCR => XCCR, YLBR => XLBR, YLBEXR => XLBEXR, & YCEXVT => XCEXVT USE MODD_PARAM_LIMA_WARM, ONLY : WCCR => XCCR, WLBR => XLBR, WLBEXR => XLBEXR, & XFSEDRR, XFSEDRC diff --git a/src/MNH/aer_effic3D.f90 b/src/MNH/aer_effic3D.f90 index c55a51929..568965581 100644 --- a/src/MNH/aer_effic3D.f90 +++ b/src/MNH/aer_effic3D.f90 @@ -83,8 +83,8 @@ SUBROUTINE AER_EFFIC3D(PRG,PVGG, & !aerosol radius/fall speed (m/s) !* 0. DECLARATIONS ! ------------ ! -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_PARAM_n +USE MODD_RAIN_ICE_DESCR_n USE MODD_CST, ONLY : XPI, XRHOLW, XP00, XRD USE MODD_PARAMETERS , ONLY : JPVEXT USE MODD_REF, ONLY : XTHVREFZ @@ -160,7 +160,7 @@ ZLBDA(:,:,:) = XLBR*(PRHODREF(:,:,:)*ZRRS(:,:,:))**XLBEXR ZNT(:,:,:) = XCCR/ZLBDA(:,:,:) !rain lwc (kg/m3) = rain m.r.(kg/kg) * rho_air(kg/m3) ZRLWC(:,:,:)=ZRRS(:,:,:)*PRHODREF(:,:,:) -!4/3 *pi *r³*NT*rho_eau(kg/m3) =rho(lwc)=rho(air)* qc(kg/kg) +!4/3 *pi *r**3*NT*rho_eau(kg/m3) =rho(lwc)=rho(air)* qc(kg/kg) ZRR(:,:,:) = (ZRLWC(:,:,:)/(XRHOLW*ZNT(:,:,:)*4./3.*XPI))**(1./3.) END WHERE diff --git a/src/MNH/aer_wet_dep_kmt_warm.f90 b/src/MNH/aer_wet_dep_kmt_warm.f90 index d0ebbdfff..441484721 100644 --- a/src/MNH/aer_wet_dep_kmt_warm.f90 +++ b/src/MNH/aer_wet_dep_kmt_warm.f90 @@ -121,11 +121,11 @@ END MODULE MODI_AER_WET_DEP_KMT_WARM ! ------------ ! USE MODD_CST -USE MODD_RAIN_ICE_PARAM, ONLY : YEXCACCR=>XEXCACCR, XFSEDC, XFCACCR,& +USE MODD_RAIN_ICE_PARAM_n, ONLY : YEXCACCR=>XEXCACCR, XFSEDC, XFCACCR,& XEXSEDR, XCRIAUTC, XFSEDR, XTIMAUTC,& YFCACCR => XFCACCR !++th++ 10/05/17 -USE MODD_RAIN_ICE_DESCR, ONLY : YRTMIN => XRTMIN, YCEXVT => XCEXVT, & +USE MODD_RAIN_ICE_DESCR_n, ONLY : YRTMIN => XRTMIN, YCEXVT => XCEXVT, & XCONC_LAND, XCONC_SEA, XCONC_URBAN, & XNUC2, XALPHAC2, XNUC, XALPHAC, & YLBC => XLBC, XLBEXC, & diff --git a/src/MNH/aero_effic3D.f90 b/src/MNH/aero_effic3D.f90 index 7dc28b471..05d5e2ce1 100644 --- a/src/MNH/aero_effic3D.f90 +++ b/src/MNH/aero_effic3D.f90 @@ -83,8 +83,8 @@ SUBROUTINE AERO_EFFIC3D(PRG,PVGG, & !aerosol radius/fall speed (m/s) !* 0. DECLARATIONS ! ------------ ! -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_PARAM_n +USE MODD_RAIN_ICE_DESCR_n USE MODD_CST, ONLY : XPI, XRHOLW, XP00, XRD USE MODD_PARAMETERS , ONLY : JPVEXT USE MODD_REF, ONLY : XTHVREFZ @@ -160,7 +160,7 @@ ZLBDA(:,:,:) = XLBR*(PRHODREF(:,:,:)*ZRRS(:,:,:))**XLBEXR ZNT(:,:,:) = XCCR/ZLBDA(:,:,:) !rain lwc (kg/m3) = rain m.r.(kg/kg) * rho_air(kg/m3) ZRLWC(:,:,:)=ZRRS(:,:,:)*PRHODREF(:,:,:) -!4/3 *pi *r³*NT*rho_eau(kg/m3) =rho(lwc)=rho(air)* qc(kg/kg) +!4/3 *pi *r**3*NT*rho_eau(kg/m3) =rho(lwc)=rho(air)* qc(kg/kg) ZRR(:,:,:) = (ZRLWC(:,:,:)/(XRHOLW*ZNT(:,:,:)*4./3.*XPI))**(1./3.) END WHERE diff --git a/src/MNH/boundaries.f90 b/src/MNH/boundaries.f90 index 111dbc701..04860f27e 100644 --- a/src/MNH/boundaries.f90 +++ b/src/MNH/boundaries.f90 @@ -183,7 +183,7 @@ USE MODD_CH_AEROSOL , ONLY : LORILAM USE MODD_CH_MNHC_n, ONLY : LUSECHEM, LUSECHIC USE MODD_CONDSAMP, ONLY : LCONDSAMP USE MODD_CONF -USE MODD_CTURB +USE MODD_TURB_n, ONLY : XTKEMIN USE MODD_DUST USE MODD_GRID_n, ONLY : XZZ USE MODD_ELEC_DESCR @@ -196,7 +196,7 @@ USE MODE_ll USE MODD_NESTING, ONLY : NDAD USE MODD_NSV USE MODD_PARAMETERS -USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN, LBOUND +USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN USE MODD_PARAM_n, ONLY : CELEC,CCLOUD USE MODD_PASPOL, ONLY : LPASPOL USE MODD_PRECISION, ONLY: MNHREAL32 diff --git a/src/MNH/ch_aqueous_sedim1mom.f90 b/src/MNH/ch_aqueous_sedim1mom.f90 index 9b4e7c6c3..ba0b6ffd5 100644 --- a/src/MNH/ch_aqueous_sedim1mom.f90 +++ b/src/MNH/ch_aqueous_sedim1mom.f90 @@ -93,8 +93,8 @@ USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT USE MODD_CONF USE MODD_CST, ONLY : XRHOLW USE MODD_CLOUDPAR, ONLY : VCEXVT=>XCEXVT, XCRS, XCEXRS -USE MODD_RAIN_ICE_DESCR, ONLY : WCEXVT=>XCEXVT, WRTMIN=>XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY : XFSEDR, XEXSEDR, & +USE MODD_RAIN_ICE_DESCR_n, ONLY : WCEXVT=>XCEXVT, WRTMIN=>XRTMIN +USE MODD_RAIN_ICE_PARAM_n, ONLY : XFSEDR, XEXSEDR, & XFSEDS, XEXSEDS, & XFSEDG, XEXSEDG diff --git a/src/MNH/ch_aqueous_tmicice.f90 b/src/MNH/ch_aqueous_tmicice.f90 index 00cfb9d6a..51255f6fd 100644 --- a/src/MNH/ch_aqueous_tmicice.f90 +++ b/src/MNH/ch_aqueous_tmicice.f90 @@ -114,9 +114,9 @@ USE MODD_PARAMETERS, ONLY : JPHEXT, &! number of horizontal External poi JPVEXT ! number of vertical External points USE MODD_CST, ONLY : XP00, XRD, XRV, XCPD, XTT, XLMTT, XLVTT, XCPV, & XCL, XCI, XESTT, XMV, XMD -USE MODD_RAIN_ICE_DESCR, ONLY : XLBR, XLBEXR, XCEXVT, XLBDAS_MAX, XLBS, XLBEXS, & +USE MODD_RAIN_ICE_DESCR_n, ONLY : XLBR, XLBEXR, XCEXVT, XLBDAS_MAX, XLBS, XLBEXS, & XLBG, XLBEXG, XCXS, XCXG, XDG, XBS -USE MODD_RAIN_ICE_PARAM, ONLY : XTIMAUTC, XCRIAUTC, XFCACCR, XEXCACCR, & +USE MODD_RAIN_ICE_PARAM_n, ONLY : XTIMAUTC, XCRIAUTC, XFCACCR, XEXCACCR, & XRIMINTP1, XRIMINTP2, XCRIMSS, XCRIMSG,& XEXCRIMSS, XEXCRIMSG, NGAMINC, XGAMINC_RIM1, & XFRACCSS, XLBRACCS1, XLBRACCS2, XLBRACCS3, & diff --git a/src/MNH/ch_meteo_trans_kess.f90 b/src/MNH/ch_meteo_trans_kess.f90 index a539ebebb..debd6ae61 100644 --- a/src/MNH/ch_meteo_trans_kess.f90 +++ b/src/MNH/ch_meteo_trans_kess.f90 @@ -117,7 +117,7 @@ USE MODD_CST, ONLY: XP00, & ! Surface pressure !! USE MODD_CONF, ONLY: LCARTESIAN ! Logical for cartesian geometry !! -USE MODD_RAIN_ICE_DESCR, ONLY: XNUC, XALPHAC, & !Cloud droplets distrib. param. +USE MODD_RAIN_ICE_DESCR_n, ONLY: XNUC, XALPHAC, & !Cloud droplets distrib. param. XRTMIN, & ! min values of the water m. r. XLBC, XLBEXC, & !shape param. of the cloud droplets XLBR, XLBEXR, & !shape param. of the raindrops diff --git a/src/MNH/cphase_profile.f90 b/src/MNH/cphase_profile.f90 index d743241db..f403e5447 100644 --- a/src/MNH/cphase_profile.f90 +++ b/src/MNH/cphase_profile.f90 @@ -54,7 +54,7 @@ END MODULE MODI_CPHASE_PROFILE !* 0. DECLARATIONS ! ------------ ! -USE MODD_CTURB +USE MODD_TURB_n, ONLY: XTKEMIN USE MODD_PARAMETERS ! IMPLICIT NONE diff --git a/src/MNH/deallocate_model1.f90 b/src/MNH/deallocate_model1.f90 index 99cc7f778..8b8f57214 100644 --- a/src/MNH/deallocate_model1.f90 +++ b/src/MNH/deallocate_model1.f90 @@ -91,8 +91,8 @@ USE MODD_FRC USE MODD_PRECIP_n USE MODD_ELEC_n USE MODD_PASPOL_n -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_PARAM_n +USE MODD_RAIN_ICE_DESCR_n USE MODD_PARAM_n , ONLY : CCLOUD USE MODE_MODELN_HANDLER ! @@ -696,6 +696,7 @@ IF ( KCALL==3 ) THEN IF (ASSOCIATED(XTR)) DEALLOCATE(XTR) IF (ASSOCIATED(XDISS)) DEALLOCATE(XDISS) IF (ASSOCIATED(XLEM)) DEALLOCATE(XLEM) + IF (ASSOCIATED(XCEI)) DEALLOCATE(XCEI) END IF !------------------------------------------------------------------------------- ! diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index ecad7e688..33466cf0a 100644 --- a/src/MNH/default_desfmn.f90 +++ b/src/MNH/default_desfmn.f90 @@ -229,6 +229,7 @@ END MODULE MODI_DEFAULT_DESFM_n !* 0. DECLARATIONS ! ------------ USE MODD_PARAMETERS +USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_CONF ! For INIT only DEFAULT_DESFM1 USE MODD_CONFZ USE MODD_DYN @@ -243,7 +244,8 @@ USE MODD_ADV_n ! missing values. This is why we affect default values USE MODD_PARAM_n ! For SPAWNING DEFAULT_DESFM2 is also used USE MODD_LBC_n USE MODD_OUT_n -USE MODD_TURB_n +USE MODD_TURB_n, ONLY: TURBN_INIT +USE MODD_NEB_n, ONLY: NEBN_INIT USE MODD_BUDGET USE MODD_LES USE MODD_PARAM_RAD_n @@ -255,11 +257,11 @@ USE MODD_RADIATIONS_n , ONLY : NSWB_MNH, NLWB_MNH #endif USE MODD_BLANK_n USE MODD_FRC -USE MODD_PARAM_ICE +USE MODD_PARAM_ICE_n, ONLY: PARAM_ICEN_INIT +USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_INIT USE MODD_PARAM_C2R2 -USE MODD_TURB_CLOUD USE MODD_PARAM_KAFR_n -USE MODD_PARAM_MFSHALL_n +USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN_INIT USE MODD_CH_MNHC_n USE MODD_SERIES_n USE MODD_NUDGING_n @@ -279,28 +281,6 @@ USE MODD_EOL_SHARED_IO USE MODD_ALLPROFILER_n USE MODD_ALLSTATION_n ! -! -USE MODD_PARAM_LIMA, ONLY : LNUCL, LSEDI, LHHONI, LMEYERS, & - NMOM_I, NMOM_S, NMOM_G, NMOM_H, & - NMOD_IFN, XIFN_CONC, LIFN_HOM, CIFN_SPECIES, & - CINT_MIXING, NMOD_IMM, NIND_SPECIE, LMURAKAMI, & - YSNOW_T=>LSNOW_T, CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, & - XFACTNUC_DEP, XFACTNUC_CON, & - LACTI, OSEDC=>LSEDC, & - OACTIT=>LACTIT, LBOUND, LSPRO, LADJ, LKHKO, NMOM_C, NMOM_R, & - NMOD_CCN, XCCN_CONC, LKESSLERAC, & - LCCN_HOM, CCCN_MODES, & - YALPHAR=>XALPHAR, YNUR=>XNUR, & - YALPHAC=>XALPHAC, YNUC=>XNUC, CINI_CCN=>HINI_CCN, & - CTYPE_CCN=>HTYPE_CCN, YFSOLUB_CCN=>XFSOLUB_CCN, & - YACTEMP_CCN=>XACTEMP_CCN, YAERDIFF=>XAERDIFF, & - YAERHEIGHT=>XAERHEIGHT, & - LSCAV, LAERO_MASS, NPHILLIPS, & - LCIBU, XNDEBRIS_CIBU, LRDSF, & - ODEPOC=>LDEPOC, OVDEPOC=>XVDEPOC, OACTTKE=>LACTTKE, & - LPTSPLIT, L_LFEEDBACKT=>LFEEDBACKT, L_NMAXITER=>NMAXITER, & - L_XMRSTEP=>XMRSTEP, L_XTSTEP_TS=>XTSTEP_TS -! USE MODD_LATZ_EDFLX USE MODD_2D_FRC USE MODD_BLOWSNOW @@ -314,6 +294,7 @@ USE MODD_IBM_LSF USE MODD_FOREFIRE #endif USE MODD_FIRE_n +USE MODD_IO, ONLY: TFILEDATA ! IMPLICIT NONE ! @@ -324,6 +305,7 @@ INTEGER, INTENT(IN) :: KMI ! Model index !* 0.2 declaration of local variables ! INTEGER :: JM ! loop index +TYPE(TFILEDATA) TFILENAM ! Empty file to satisfy interface of PHYEX_init routines which may calls POSNAM (but do not) ! !------------------------------------------------------------------------------- ! @@ -536,31 +518,15 @@ XTNUDGING = 21600. !* 10. SET DEFAULT VALUES FOR MODD_TURB_n : ! ---------------------------------- ! -XIMPL = 1. -XKEMIN = 0.01 -XCEDIS = 0.84 -XCADAP = 0.5 -CTURBLEN = 'BL89' -CTURBDIM = '1DIM' -LTURB_FLX =.FALSE. -LTURB_DIAG=.FALSE. -LSUBG_COND=.FALSE. -CSUBG_AUCV='NONE' -CSUBG_AUCV_RI='NONE' -LSIGMAS =.TRUE. -LSIG_CONV =.FALSE. -LRMC01 =.FALSE. -CTOM ='NONE' -VSIGQSAT = 0.02 -CCONDENS='CB02' -CLAMBDA3='CB' -CSUBG_MF_PDF='TRIANGLE' -LLEONARD =.FALSE. -XCOEFHGRADTHL = 1.0 -XCOEFHGRADRM = 1.0 -XALTHGRAD = 2000.0 -XCLDTHOLD = -1.0 - +CALL TURBN_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, & + &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0) +!------------------------------------------------------------------------------- +! +!* 10a. SET DEFAULT VALUES FOR MODD_NEB_n : +! ---------------------------------- +! +CALL NEBN_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, & + &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0) !------------------------------------------------------------------------------- ! !* 10b. SET DEFAULT VALUES FOR MODD_DRAGTREE : @@ -879,40 +845,8 @@ END IF !* 16. SET DEFAULT VALUES FOR MODD_PARAM_ICE : ! --------------------------------------- ! -IF (KMI == 1) THEN - LRED = .TRUE. - LWARM = .TRUE. - CPRISTINE_ICE = 'PLAT' - LSEDIC = .TRUE. - LCONVHG = .FALSE. - CSEDIM = 'SPLI' - LFEEDBACKT = .TRUE. - LEVLIMIT = .TRUE. - LNULLWETG = .TRUE. - LWETGPOST = .TRUE. - LNULLWETH = .TRUE. - LWETHPOST = .TRUE. - CSNOWRIMING = 'M90 ' - CSUBG_RC_RR_ACCR = 'NONE' - CSUBG_RR_EVAP = 'NONE' - CSUBG_PR_PDF = 'SIGM' - XFRACM90 = 0.1 - LCRFLIMIT = .TRUE. - NMAXITER = 5 - XMRSTEP = 0.00005 - XTSTEP_TS = 0. - LADJ_BEFORE = .TRUE. - LADJ_AFTER = .TRUE. - CFRAC_ICE_ADJUST = 'S' - XSPLIT_MAXCFL = 0.8 - CFRAC_ICE_SHALLOW_MF = 'S' - LSEDIM_AFTER = .FALSE. - LDEPOSC = .FALSE. - XVDEPOSC= 0.02 ! 2 cm/s - LSNOW_T=.FALSE. - LPACK_INTERP=.TRUE. - LPACK_MICRO=.TRUE. ! Meso-NH does not work with LPACK_MICRO=.FALSE. -END IF +CALL PARAM_ICEN_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, & + &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0) ! !------------------------------------------------------------------------------- ! @@ -937,38 +871,8 @@ NENSM = 0 !* 18. SET DEFAULT VALUES FOR MODD_PARAM_MFSHALL_n : ! -------------------------------------------- ! -XIMPL_MF = 1. -CMF_UPDRAFT = 'EDKF' -CMF_CLOUD = 'DIRE' -LMIXUV = .TRUE. -LMF_FLX = .FALSE. -! -XALP_PERT = 0.3 -XABUO = 1. -XBENTR = 1. -XBDETR = 0. -XCMF = 0.065 -XENTR_MF = 0.035 -XCRAD_MF = 50. -XENTR_DRY = 0.55 -XDETR_DRY = 10. -XDETR_LUP = 1. -XKCF_MF = 2.75 -XKRC_MF = 1. -XTAUSIGMF = 600. -XPRES_UV = 0.5 -XFRAC_UP_MAX= 0.33 -XALPHA_MF = 2. -XSIGMA_MF = 20. -! -XA1 = 2./3. -XB = 0.002 -XC = 0.012 -XBETA1 = 0.9 -XR = 2. -XLAMBDA_MF= 0. -LGZ = .FALSE. -XGZ = 1.83 ! between 1.83 and 1.33 +CALL PARAM_MFSHALLN_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, & + &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0) ! !------------------------------------------------------------------------------- ! @@ -1013,79 +917,8 @@ ENDIF ! ---------------------------------------- ! IF (KMI == 1) THEN - LPTSPLIT = .TRUE. - L_LFEEDBACKT = .TRUE. - L_NMAXITER = 5 - L_XMRSTEP = 0.005 - L_XTSTEP_TS = 20. -! - YNUC = 1.0 - YALPHAC = 3.0 - YNUR = 2.0 - YALPHAR = 1.0 -! - LACTI = .TRUE. - OSEDC = .TRUE. - OACTIT = .FALSE. - LADJ = .TRUE. - LSPRO = .FALSE. - LKHKO = .FALSE. - ODEPOC = .TRUE. - LBOUND = .FALSE. - OACTTKE = .TRUE. - LKESSLERAC = .FALSE. -! - NMOM_C = 2 - NMOM_R = 2 -! - OVDEPOC = 0.02 ! 2 cm/s -! - CINI_CCN = 'AER' - CTYPE_CCN(:) = 'M' -! - YAERDIFF = 0.0 - YAERHEIGHT = 2000. -! YR_MEAN_CCN = 0.0 ! In case of 'CCN' initialization -! YLOGSIG_CCN = 0.0 - YFSOLUB_CCN = 1.0 - YACTEMP_CCN = 280. -! - NMOD_CCN = 1 -! -!* AP Scavenging -! - LSCAV = .FALSE. - LAERO_MASS = .FALSE. -! - LCCN_HOM = .TRUE. - CCCN_MODES = 'COPT' - XCCN_CONC(:)=300. -! - LHHONI = .FALSE. - LNUCL = .TRUE. - LSEDI = .TRUE. - YSNOW_T = .FALSE. - LMURAKAMI = .TRUE. - CPRISTINE_ICE_LIMA = 'PLAT' - CHEVRIMED_ICE_LIMA = 'GRAU' - XFACTNUC_DEP = 1.0 - XFACTNUC_CON = 1.0 - NMOM_I = 2 - NMOM_S = 1 - NMOM_G = 1 - NMOM_H = 0 - NMOD_IFN = 1 - NIND_SPECIE = 1 - LMEYERS = .FALSE. - LIFN_HOM = .TRUE. - CIFN_SPECIES = 'PHILLIPS' - CINT_MIXING = 'DM2' - XIFN_CONC(:) = 100. - NMOD_IMM = 0 - NPHILLIPS=8 - LCIBU = .FALSE. - XNDEBRIS_CIBU = 50.0 - LRDSF = .FALSE. + CALL PARAM_LIMA_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, & + &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0) ENDIF ! !------------------------------------------------------------------------------- @@ -1149,18 +982,6 @@ NFREQSERIES = MAX(NFREQSERIES,1) ! !------------------------------------------------------------------------------- ! -!* 22. SET DEFAULT VALUES FOR MODD_TURB_CLOUD -! -------------------------------------- -! -IF (KMI == 1) THEN - NMODEL_CLOUD = NUNDEF - CTURBLEN_CLOUD = 'DELT' - XCOEF_AMPL_SAT = 5. - XCEI_MIN = 0.001E-06 - XCEI_MAX = 0.01E-06 -ENDIF -!------------------------------------------------------------------------------- -! !* 22. SET DEFAULT VALUES FOR MODD_MEAN_FIELD ! -------------------------------------- ! diff --git a/src/MNH/endstep.f90 b/src/MNH/endstep.f90 index e5e616fed..97734d72b 100644 --- a/src/MNH/endstep.f90 +++ b/src/MNH/endstep.f90 @@ -207,7 +207,7 @@ use modd_budget, only: lbudget_u, lbudget_v, lbudget_w, lbudget_th, lbudg nbustep, tbudgets USE MODD_CH_AEROSOL, ONLY: LORILAM USE MODD_CONF -USE MODD_CTURB +USE MODD_TURB_n, ONLY: XTKEMIN USE MODD_DUST, ONLY: LDUST USE MODD_SALT, ONLY: LSALT USE MODD_DYN diff --git a/src/MNH/flash_geom_elec.f90 b/src/MNH/flash_geom_elec.f90 index 14265cba1..e6eea2d03 100644 --- a/src/MNH/flash_geom_elec.f90 +++ b/src/MNH/flash_geom_elec.f90 @@ -127,7 +127,7 @@ USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZZ ! in linox_production USE MODD_NSV, ONLY: NSV_ELECBEG, NSV_ELECEND, NSV_ELEC USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT use MODD_PRECISION, only: MNHINT_MPI, MNHLOG_MPI, MNHREAL_MPI -USE MODD_RAIN_ICE_DESCR, ONLY: XLBR, XLBEXR, XLBS, XLBEXS, & +USE MODD_RAIN_ICE_DESCR_n, ONLY: XLBR, XLBEXR, XLBS, XLBEXS, & XLBG, XLBEXG, XLBH, XLBEXH, & XRTMIN USE MODD_SUB_ELEC_n @@ -2752,7 +2752,7 @@ END SUBROUTINE N8INTERCHANGE_SORT use modd_precision, only: MNHINT32 - REAL :: ZRANDOM + REAL, INTENT(OUT) :: ZRANDOM INTEGER(kind=MNHINT32), SAVE :: NSEED_MNH = 26032012_MNHINT32 ZRANDOM = real( r8_uniform_01( NSEED_MNH ), kind(ZRANDOM) ) diff --git a/src/MNH/goto_model_wrapper.f90 b/src/MNH/goto_model_wrapper.f90 index d9da799ee..e869230e2 100644 --- a/src/MNH/goto_model_wrapper.f90 +++ b/src/MNH/goto_model_wrapper.f90 @@ -54,6 +54,10 @@ USE MODD_CH_PRODLOSSTOT_n USE MODD_CH_ROSENBROCK_n USE MODD_CH_SOLVER_n USE MODD_CLOUDPAR_n +USE MODD_PARAM_ICE_n +USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_ASSOCIATE !not yet a '_n' module +USE MODD_RAIN_ICE_PARAM_n +USE MODD_RAIN_ICE_DESCR_n USE MODD_CLOUD_MF_n USE MODD_CONF_n USE MODD_CURVCOR_n @@ -115,6 +119,7 @@ USE MODD_SUB_PASPOL_n USE MODD_SUB_PHYS_PARAM_n USE MODD_TIMEZ USE MODD_TURB_n +USE MODD_NEB_n, ONLY: NEB_GOTO_MODEL ! ! use mode_field, only: Fieldlist_goto_model @@ -149,6 +154,10 @@ CALL CH_JVALUES_GOTO_MODEL(KFROM, KTO) CALL CH_MNHC_GOTO_MODEL(KFROM, KTO) CALL CH_SOLVER_GOTO_MODEL(KFROM, KTO) CALL CLOUDPAR_GOTO_MODEL(KFROM, KTO) +CALL PARAM_ICE_GOTO_MODEL(KFROM, KTO) +CALL PARAM_LIMA_ASSOCIATE() !Not yet a goto_model but put here for simplicity and to prepare the transformation into a '_n' module +CALL RAIN_ICE_PARAM_GOTO_MODEL(KFROM, KTO) +CALL RAIN_ICE_DESCR_GOTO_MODEL(KFROM, KTO) CALL CLOUD_MF_GOTO_MODEL(KFROM, KTO) CALL CONF_GOTO_MODEL(KFROM, KTO) CALL CURVCOR_GOTO_MODEL(KFROM, KTO) @@ -214,6 +223,7 @@ CALL SUB_PASPOL_GOTO_MODEL(KFROM, KTO) CALL SUB_ELEC_GOTO_MODEL(KFROM, KTO) !CALL TIME_GOTO_MODEL(KFROM, KTO) CALL TURB_GOTO_MODEL(KFROM, KTO) +CALL NEB_GOTO_MODEL(KFROM, KTO) CALL DRAG_GOTO_MODEL(KFROM, KTO) CALL TIMEZ_GOTO_MODEL(KFROM, KTO) CALL CH_PH_GOTO_MODEL(KFROM, KTO) diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index 076b35ca8..598dcdeec 100644 --- a/src/MNH/ground_paramn.f90 +++ b/src/MNH/ground_paramn.f90 @@ -13,6 +13,8 @@ INTERFACE PSFRV_ROOF, PSFSV, PSFCO2, PSFU, PSFV, PDIR_ALB, PSCA_ALB, & PEMIS, PTSRAD, KTCOUNT, TPFILE ) ! +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +! !* surface fluxes ! -------------- ! @@ -175,7 +177,7 @@ USE MODD_NSV, ONLY: CSV, NSV, NSV_AERBEG, NSV_AEREND, NSV_CHEMBEG, USE MODD_PARAM_C2R2, ONLY: LSEDC USE MODD_PREP_SNOW, ONLY: NIMPUR USE MODD_PARAMETERS, ONLY: JPVEXT -USE MODD_PARAM_ICE, ONLY: LSEDIC +USE MODD_PARAM_ICE_n, ONLY: LSEDIC USE MODD_PARAM_LIMA, ONLY: MSEDC=>LSEDC USE MODD_PARAM_n, ONLY: CDCONV, CCLOUD, CRAD, CTURB USE MODD_PRECIP_n, ONLY: XINPRC, XINPRR, XINPRS, XINPRG, XINPRH diff --git a/src/MNH/ibm_forcing.f90 b/src/MNH/ibm_forcing.f90 index 435df5ecf..aebf45609 100644 --- a/src/MNH/ibm_forcing.f90 +++ b/src/MNH/ibm_forcing.f90 @@ -79,7 +79,7 @@ SUBROUTINE IBM_FORCING(PRUS,PRVS,PRWS,PTHS,PRRS,PSVS,PTKS) USE MODD_CONF USE MODD_CONF_n USE MODD_NSV - USE MODD_CTURB + USE MODD_TURB_n, ONLY: XTKEMIN USE MODD_PARAM_n USE MODD_DYN_n, ONLY: XTSTEP ! diff --git a/src/MNH/ibm_forcing_tr.f90 b/src/MNH/ibm_forcing_tr.f90 index 832217ea1..c14ac2aa6 100644 --- a/src/MNH/ibm_forcing_tr.f90 +++ b/src/MNH/ibm_forcing_tr.f90 @@ -78,7 +78,7 @@ SUBROUTINE IBM_FORCING_TR(PRUS,PRVS,PRWS,PTHS,PRRS,PSVS,PTKS) USE MODD_CONF USE MODD_CONF_n USE MODD_NSV - USE MODD_CTURB + USE MODD_TURB_n, ONLY: XTKEMIN USE MODD_PARAM_n ! ! interface diff --git a/src/MNH/ibm_generls.f90 b/src/MNH/ibm_generls.f90 index 1b7683652..f8d7f9d7f 100644 --- a/src/MNH/ibm_generls.f90 +++ b/src/MNH/ibm_generls.f90 @@ -84,7 +84,6 @@ SUBROUTINE IBM_GENERLS(PIBM_FACES,PNORM_FACES,PV1,PV2,PV3,PX_MIN,PY_MIN,PX_MAX,P USE MODI_SHUMAN USE MODI_IBM_INTERPOS USE MODI_IBM_DETECT - USE MODI_INI_CST ! IMPLICIT NONE ! diff --git a/src/MNH/ice_adjust_bis.f90 b/src/MNH/ice_adjust_bis.f90 index 44ab0c680..e530d5c21 100644 --- a/src/MNH/ice_adjust_bis.f90 +++ b/src/MNH/ice_adjust_bis.f90 @@ -66,7 +66,7 @@ END MODULE MODI_ICE_ADJUST_BIS ! ------------ ! USE MODD_CST, ONLY : XCPD, XRD, XP00, CST -USE MODD_NEB, ONLY : NEB +USE MODD_NEB_n, ONLY : NEBN ! USE MODI_COMPUTE_FUNCTION_THERMO USE MODI_THLRT_FROM_THRVRCRI @@ -128,7 +128,7 @@ CALL COMPUTE_FUNCTION_THERMO( IRR, & CALL THLRT_FROM_THRVRCRI( IRR, PTH, PR, ZLVOCPEXN, ZLSOCPEXN,& ZTHL, ZRW ) ! -CALL TH_R_FROM_THL_RT(CST, NEB, SIZE(ZFRAC_ICE), YFRAC_ICE,ZFRAC_ICE(:,:,:),PP(:,:,:), & +CALL TH_R_FROM_THL_RT(CST, NEBN, SIZE(ZFRAC_ICE), YFRAC_ICE,ZFRAC_ICE(:,:,:),PP(:,:,:), & ZTHL(:,:,:), ZRW(:,:,:), PTH(:,:,:), & ZRV(:,:,:), ZRC(:,:,:), ZRI(:,:,:), & ZRSATW(:,:,:), ZRSATI(:,:,:),OOCEAN=.FALSE.,& diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90 index 1a48e3f1a..6e8895afc 100644 --- a/src/MNH/ini_budget.f90 +++ b/src/MNH/ini_budget.f90 @@ -246,7 +246,7 @@ use modd_nsv, only: nsv_aerbeg, nsv_aerend, nsv_aerdepbeg, nsv_aerdepe nsv_user, tsvlist use modd_parameters, only: jphext use modd_param_c2r2, only: ldepoc_c2r2 => ldepoc, lrain_c2r2 => lrain, lsedc_c2r2 => lsedc, lsupsat_c2r2 => lsupsat -use modd_param_ice, only: ladj_after, ladj_before, ldeposc_ice => ldeposc, lred, lsedic_ice => lsedic, lwarm_ice => lwarm +use modd_param_ice_n, only: ladj_after, ladj_before, ldeposc_ice => ldeposc, lred, lsedic_ice => lsedic, lwarm_ice => lwarm use modd_param_n, only: cactccn, celec use modd_param_lima, only: laero_mass_lima => laero_mass, lacti_lima => lacti, ldepoc_lima => ldepoc, & lhhoni_lima => lhhoni, lmeyers_lima => lmeyers, lnucl_lima => lnucl, & @@ -256,7 +256,7 @@ use modd_param_lima, only: laero_mass_lima => laero_mass, lacti_lima => lacti, nmom_c, nmom_r, nmom_i, nmom_s, nmom_g, nmom_h, nmod_ccn, nmod_ifn, nmod_imm use modd_ref, only: lcouples use modd_salt, only: lsalt -use modd_turb_n, only: lsubg_cond +use modd_neb_n, only: lsubg_cond use modd_viscosity, only: lvisc, lvisc_r, lvisc_sv, lvisc_th, lvisc_uvw USE MODE_ll diff --git a/src/MNH/ini_elecn.f90 b/src/MNH/ini_elecn.f90 index 1489ba1af..e00ea14d3 100644 --- a/src/MNH/ini_elecn.f90 +++ b/src/MNH/ini_elecn.f90 @@ -58,7 +58,7 @@ END MODULE MODI_INI_ELEC_n !! !! AUTHOR !! ------ -!! C. Barthe * Laboratoire de l'Atmosphère et des Cyclones * +!! C. Barthe * Laboratoire de l'Atmosphère et des Cyclones * !! !! MODIFICATIONS !! ------------- @@ -99,7 +99,7 @@ USE MODD_LBC_n, ONLY : CLBCX, CLBCY USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_PARAM_C2R2, ONLY : LDEPOC USE MODD_PARAMETERS, ONLY : JPVEXT, JPHEXT -USE MODD_PARAM_ICE, ONLY : LDEPOSC +USE MODD_PARAM_ICE_n, ONLY : LDEPOSC USE MODD_PRECIP_n, ONLY : XINPRR, XACPRR, XINPRS, XACPRS, XINPRG, XACPRG, & XINPRH, XACPRH, XINPRC, XACPRC, XINPRR3D, XEVAP3D,& XINDEP,XACDEP diff --git a/src/MNH/ini_flash_geom_elec.f90 b/src/MNH/ini_flash_geom_elec.f90 index 9ff78049a..3c5faece3 100644 --- a/src/MNH/ini_flash_geom_elec.f90 +++ b/src/MNH/ini_flash_geom_elec.f90 @@ -55,7 +55,7 @@ END MODULE MODI_INI_FLASH_GEOM_ELEC ! ------------ ! USE MODD_CST, ONLY : XPI -USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_DESCR_n USE MODD_ELEC_DESCR USE MODD_ELEC_PARAM USE MODD_DIM_n, ONLY : NKMAX diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90 index 09875b109..faa09698b 100644 --- a/src/MNH/ini_lb.f90 +++ b/src/MNH/ini_lb.f90 @@ -139,7 +139,7 @@ SUBROUTINE INI_LB(TPINIFILE,OLSOURCE,KSV, & ! !* 0. DECLARATIONS ! -USE MODD_CTURB, ONLY: XTKEMIN +USE MODD_TURB_n, ONLY: XTKEMIN USE MODD_CONF, ONLY: LCPL_AROME use modd_field, only: NMNHDIM_UNKNOWN, tfieldmetadata, TYPELOG, TYPEREAL USE MODD_IO, ONLY: TFILEDATA diff --git a/src/MNH/ini_micron.f90 b/src/MNH/ini_micron.f90 index b8ab64995..a4934ed55 100644 --- a/src/MNH/ini_micron.f90 +++ b/src/MNH/ini_micron.f90 @@ -77,14 +77,14 @@ USE MODD_REF_n, ONLY : XRHODREF USE MODD_DYN_n, ONLY : XTSTEP USE MODD_CLOUDPAR_n, ONLY : NSPLITR, NSPLITG USE MODD_PARAM_n, ONLY : CELEC -USE MODD_PARAM_ICE, ONLY : LSEDIC, LDEPOSC +USE MODD_PARAM_ICE_n, ONLY : LSEDIC, LDEPOSC USE MODD_PARAM_C2R2, ONLY : LSEDC, LACTIT, LDEPOC USE MODD_BLOWSNOW USE MODD_BLOWSNOW_n ! USE MODI_READ_PRECIP_FIELD USE MODI_INI_CLOUD -USE MODI_INI_RAIN_ICE +USE MODE_INI_RAIN_ICE, ONLY: INI_RAIN_ICE USE MODI_INI_RAIN_C2R2 USE MODI_INI_ICE_C1R3 USE MODI_CLEAN_CONC_RAIN_C2R2 @@ -104,7 +104,7 @@ USE MODD_PARAM_LIMA, ONLY : LSCAV, MSEDC=>LSEDC, MACTIT=>LACTIT, MDEPOC=>LDEPOC USE MODD_LIMA_PRECIP_SCAVENGING_n ! USE MODI_INIT_AEROSOL_CONCENTRATION -USE MODI_INI_LIMA +USE MODE_INI_LIMA, ONLY: INI_LIMA ! IMPLICIT NONE ! diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 1858fc125..f1b7d8069 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -401,8 +401,8 @@ USE MODD_STAND_ATM, only: XSTROATM, XSMLSATM, XSMLWATM, XSPOSATM, XSPOWA USE MODD_SURF_PAR, only: XUNDEF_SFX => XUNDEF USE MODD_TIME USE MODD_TIME_n -USE MODD_TURB_CLOUD, only: NMODEL_CLOUD, CTURBLEN_CLOUD,XCEI USE MODD_TURB_n +USE MODD_NEB_n, only: LSUBG_COND, LSTATNW USE MODD_VAR_ll, only: IP USE MODE_GATHER_ll @@ -447,6 +447,8 @@ USE MODI_INI_LES_N USE MODI_INI_LG USE MODI_INI_LW_SETUP USE MODI_INI_MICRO_n +USE MODE_INI_TURB, ONLY: INI_TURB +USE MODE_INI_MFSHALL, ONLY: INI_MFSHALL USE MODI_INI_POSPROFILER_n USE MODI_INI_RADIATIONS USE MODI_INI_RADIATIONS_ECMWF @@ -456,7 +458,7 @@ USE MODI_INI_SPAWN_LS_n USE MODI_INI_SURF_RAD USE MODI_INI_SURFSTATION_n USE MODI_INI_SW_SETUP -USE MODI_INIT_AEROSOL_PROPERTIES +USE MODE_INIT_AEROSOL_PROPERTIES, ONLY: INIT_AEROSOL_PROPERTIES #ifdef MNH_FOREFIRE USE MODI_INIT_FOREFIRE_n #endif @@ -933,8 +935,6 @@ IF (CTURB /= 'NONE') THEN ALLOCATE(XTR(IIU,IJU,IKU)) ALLOCATE(XDISS(IIU,IJU,IKU)) ALLOCATE(XLEM(IIU,IJU,IKU)) - XTKEMIN=XKEMIN - XCED =XCEDIS ELSE ALLOCATE(XTKET(0,0,0)) ALLOCATE(XRTKES(0,0,0)) @@ -1783,10 +1783,10 @@ END IF ! !* 3.12 Module MODD_TURB_CLOUD ! -IF (.NOT.(ALLOCATED(XCEI))) ALLOCATE(XCEI(0,0,0)) -IF (KMI == NMODEL_CLOUD .AND. CTURBLEN_CLOUD/='NONE' ) THEN - DEALLOCATE(XCEI) +IF (LCLOUDMODIFLM) THEN ALLOCATE(XCEI(IIU,IJU,IKU)) +ELSE + ALLOCATE(XCEI(0,0,0)) ENDIF ! !* 3.13 Module MODD_CH_PH_n @@ -2188,6 +2188,10 @@ CALL SET_REF( KMI, TPINIFILE, & !* 10.1 INITIALIZE THE TURBULENCE VARIABLES ! ----------------------------------- ! +IF(LSTATNW) THEN + CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','LSTATNW option not tested in Meso-NH') +ENDIF +CALL INI_TURB(CPROGRAM) IF ((CTURB == 'TKEL').AND.(CCONF=='START')) THEN CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before ini_tke_eps::XUT",PRECISION) CALL INI_TKE_EPS(CGETTKET,XTHVREF,XZZ, & @@ -2722,6 +2726,12 @@ IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN END IF ! +! +! +IF (CSCONV == 'EDKF') THEN + CALL INI_MFSHALL() +ENDIF +! !------------------------------------------------------------------------------- ! ! diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index 99bb84876..0d7358737 100644 --- a/src/MNH/ini_nsv.f90 +++ b/src/MNH/ini_nsv.f90 @@ -112,10 +112,7 @@ USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV USE MODD_PARAM_C2R2, ONLY: LSUPSAT USE MODD_PARAMETERS, ONLY: NCOMMENTLGTMAX, NLONGNAMELGTMAX, NUNITLGTMAX -USE MODD_PARAM_LIMA, ONLY: NINDICE_CCN_IMM, NIMM, NMOD_CCN, LSCAV, LAERO_MASS, & - NMOD_IFN, NMOD_IMM, LHHONI, & - LSPRO, & - NMOM_C, NMOM_R, NMOM_I, NMOM_S, NMOM_G, NMOM_H +USE MODD_PARAM_LIMA, ONLY: NINDICE_CCN_IMM, NIMM, NMOD_CCN, NMOD_IFN, NMOD_IMM, PARAM_LIMA_ALLOCATE, PARAM_LIMA_DEALLOCATE USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES USE MODD_PARAM_LIMA_WARM, ONLY: CAERO_MASS, CLIMA_WARM_NAMES USE MODD_PARAM_n, ONLY: CCLOUD, CELEC @@ -126,6 +123,7 @@ USE MODD_SALT, ONLY: CSALTNAMES, CDESLTNAMES, JPSALTORDER, & LRGFIX_SLT, LSALT, LSLTINIT, LSLTPRES, LDEPOS_SLT, LVARSIG_SLT, NMODE_SLT, YPDESLT_INI, YPSALT_INI USE MODE_MSG +USE MODE_LIMA_UPDATE_NSV, ONLY: LIMA_UPDATE_NSV USE MODI_CH_AER_INIT_SOA, ONLY: CH_AER_INIT_SOA USE MODI_CH_INIT_SCHEME_n, ONLY: CH_INIT_SCHEME_n @@ -159,6 +157,10 @@ INTEGER :: INMOMENTS_DST, INMOMENTS_SLT !Number of moments for dust or salt ! !------------------------------------------------------------------------------- ! + +!Associate the pointers +CALL NSV_ASSOCIATE +! LINI_NSV(KMI) = .TRUE. ILUOUT = TLUOUT%NLU @@ -208,69 +210,14 @@ END IF ! ! scalar variables used in the LIMA microphysical scheme ! +CALL LIMA_UPDATE_NSV(LDINIT=.TRUE., KMI=KMI, KSV=ISV, CDCLOUD=CCLOUD, LDUPDATE=.FALSE.) IF (CCLOUD == 'LIMA' ) THEN - ISV = ISV+1 - NSV_LIMA_BEG_A(KMI) = ISV - IF (NMOM_C.GE.2) THEN -! Nc - NSV_LIMA_NC_A(KMI) = ISV - ISV = ISV+1 - END IF -! Nr - IF (NMOM_R.GE.2) THEN - NSV_LIMA_NR_A(KMI) = ISV - ISV = ISV+1 - END IF -! CCN - IF (NMOD_CCN .GT. 0) THEN - NSV_LIMA_CCN_FREE_A(KMI) = ISV - ISV = ISV + NMOD_CCN - NSV_LIMA_CCN_ACTI_A(KMI) = ISV - ISV = ISV + NMOD_CCN - END IF -! Scavenging - IF (LSCAV .AND. LAERO_MASS) THEN - NSV_LIMA_SCAVMASS_A(KMI) = ISV - ISV = ISV+1 - END IF -! Ni - IF (NMOM_I.GE.2) THEN - NSV_LIMA_NI_A(KMI) = ISV - ISV = ISV+1 - END IF -! Ns - IF (NMOM_S.GE.2) THEN - NSV_LIMA_NS_A(KMI) = ISV - ISV = ISV+1 - END IF -! Ng - IF (NMOM_G.GE.2) THEN - NSV_LIMA_NG_A(KMI) = ISV - ISV = ISV+1 - END IF -! Nh - IF (NMOM_H.GE.2) THEN - NSV_LIMA_NH_A(KMI) = ISV - ISV = ISV+1 - END IF -! IFN - IF (NMOD_IFN .GT. 0) THEN - NSV_LIMA_IFN_FREE_A(KMI) = ISV - ISV = ISV + NMOD_IFN - NSV_LIMA_IFN_NUCL_A(KMI) = ISV - ISV = ISV + NMOD_IFN - END IF -! IMM - IF (NMOD_IMM .GT. 0) THEN - NSV_LIMA_IMM_NUCL_A(KMI) = ISV - ISV = ISV + MAX(1,NMOD_IMM) - END IF IF ( NMOD_IFN > 0 ) THEN - IF ( .NOT. ALLOCATED( NIMM ) ) ALLOCATE( NIMM(NMOD_CCN) ) + IF ( .NOT. ASSOCIATED( NIMM ) ) CALL PARAM_LIMA_ALLOCATE('NIMM', NMOD_CCN) NIMM(:) = 0 - IF ( ALLOCATED( NINDICE_CCN_IMM ) ) DEALLOCATE( NINDICE_CCN_IMM ) - ALLOCATE( NINDICE_CCN_IMM(MAX( 1, NMOD_IMM )) ) + IF ( ASSOCIATED( NINDICE_CCN_IMM ) ) CALL PARAM_LIMA_DEALLOCATE('NINDICE_CCN_IMM') + CALL PARAM_LIMA_ALLOCATE('NINDICE_CCN_IMM', MAX( 1, NMOD_IMM )) IF (NMOD_IMM > 0 ) THEN DO JI = 0, NMOD_IMM - 1 NIMM(NMOD_CCN - JI) = 1 @@ -281,31 +228,6 @@ IF (CCLOUD == 'LIMA' ) THEN ! NINDICE_CCN_IMM(1) = 0 END IF END IF - -! Homogeneous freezing of CCN - IF (LHHONI) THEN - NSV_LIMA_HOM_HAZE_A(KMI) = ISV - ISV = ISV + 1 - END IF -! Supersaturation - IF (LSPRO) THEN - NSV_LIMA_SPRO_A(KMI) = ISV - ISV = ISV + 1 - END IF -! -! End and total variables -! - ISV = ISV - 1 - NSV_LIMA_END_A(KMI) = ISV - NSV_LIMA_A(KMI) = NSV_LIMA_END_A(KMI) - NSV_LIMA_BEG_A(KMI) + 1 -ELSE - NSV_LIMA_A(KMI) = 0 -! -! force First index to be superior to last index -! in order to create a null section -! - NSV_LIMA_BEG_A(KMI) = 1 - NSV_LIMA_END_A(KMI) = 0 END IF ! CCLOUD = LIMA ! ! diff --git a/src/MNH/ini_radar.f90 b/src/MNH/ini_radar.f90 index 77002163b..efe222510 100644 --- a/src/MNH/ini_radar.f90 +++ b/src/MNH/ini_radar.f90 @@ -70,7 +70,7 @@ END MODULE MODI_INI_RADAR ! ------------ ! USE MODD_CST -USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_DESCR_n ! IMPLICIT NONE ! @@ -82,7 +82,6 @@ CHARACTER (LEN=4), INTENT(IN) :: HPRISTINE_ICE ! Indicator of ice cryst !------------------------------------------------------------------------------- ! ! -CALL RAIN_ICE_DESCR_ASSOCIATE() ! !* 1.1 Raindrop characteristics ! @@ -215,9 +214,9 @@ CONTAINS IMPLICIT NONE - REAL :: PALPHA ! first shape parameter of the dimensionnal distribution - REAL :: PNU ! second shape parameter of the dimensionnal distribution - REAL :: PP ! order of the moment + REAL, INTENT(IN) :: PALPHA ! first shape parameter of the dimensionnal distribution + REAL, INTENT(IN) :: PNU ! second shape parameter of the dimensionnal distribution + REAL, INTENT(IN) :: PP ! order of the moment REAL :: PMOMG ! result: moment of order ZP !------------------------------------------------------------------------------ diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90 index f7f5ea115..9299f713c 100644 --- a/src/MNH/ini_segn.f90 +++ b/src/MNH/ini_segn.f90 @@ -179,7 +179,7 @@ USE MODD_LES, ONLY: LES_ASSOCIATE USE MODD_LUNIT USE MODD_LUNIT_n, ONLY: CINIFILE_n=> CINIFILE, TINIFILE_n => TINIFILE, CINIFILEPGD_n=> CINIFILEPGD, TLUOUT, LUNIT_MODEL USE MODD_PARAM_n, ONLY: CSURF -USE MODD_PARAM_ICE +USE MODD_PARAM_ICE_n USE MODD_PARAMETERS USE MODD_REF, ONLY: LBOUSS ! @@ -315,7 +315,6 @@ ILUSEG = TZFILE_DES%NLU !* 2. SET DEFAULT VALUES ! ------------------ ! -CALL PARAM_ICE_ASSOCIATE() CALL LES_ASSOCIATE() CALL DEFAULT_DESFM_n(KMI) ! diff --git a/src/MNH/ini_tke_eps.f90 b/src/MNH/ini_tke_eps.f90 index 3959afe70..a07160722 100644 --- a/src/MNH/ini_tke_eps.f90 +++ b/src/MNH/ini_tke_eps.f90 @@ -24,7 +24,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT):: PUT ! x-component of wind REAL, DIMENSION(:,:,:), INTENT(INOUT):: PVT ! y-component of wind REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTHT ! potential temperature REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTKET ! TKE fields -TYPE(LIST_ll), POINTER :: TPINITHALO3D_ll ! pointer for the list of fields +TYPE(LIST_ll), POINTER, INTENT(INOUT):: TPINITHALO3D_ll ! pointer for the list of fields ! which must be communicated in INIT ! END SUBROUTINE INI_TKE_EPS @@ -92,7 +92,8 @@ END MODULE MODI_INI_TKE_EPS ! USE MODD_ARGSLIST_ll, ONLY: LIST_ll USE MODD_CST, ONLY: XG, XALPHAOC -USE MODD_CTURB, ONLY: XLINI, XCED, XCMFS, XTKEMIN, XCSHF +USE MODD_CTURB, ONLY: XCMFS +USE MODD_TURB_n, ONLY: XLINI, XCED, XTKEMIN, XCSHF USE MODD_DYN_n, ONLY: LOCEAN USE MODD_PARAMETERS, ONLY: JPVEXT ! @@ -115,7 +116,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT):: PUT ! x-component of wind REAL, DIMENSION(:,:,:), INTENT(INOUT):: PVT ! y-component of wind REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTHT ! potential temperature REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTKET ! TKE field -TYPE(LIST_ll), POINTER :: TPINITHALO3D_ll ! pointer for the list of fields +TYPE(LIST_ll), POINTER, INTENT(INOUT):: TPINITHALO3D_ll ! pointer for the list of fields ! which must be communicated in INIT ! !* 0.2 Declaration of local variables diff --git a/src/MNH/init_mnh.f90 b/src/MNH/init_mnh.f90 index d2d7b1949..4170ca68e 100644 --- a/src/MNH/init_mnh.f90 +++ b/src/MNH/init_mnh.f90 @@ -83,6 +83,7 @@ USE MODD_LUNIT USE MODD_LUNIT_n USE MODD_MNH_SURFEX_n USE MODD_PARAMETERS +USE MODD_NSV, ONLY: NSV_ASSOCIATE ! use mode_field, only: Alloc_field_scalars, Fieldlist_goto_model USE MODE_IO_FILE, ONLY: IO_File_open @@ -91,8 +92,7 @@ USE MODE_ll USE MODE_MODELN_HANDLER USE MODE_SPLITTINGZ_ll ! -USE MODI_INI_CST -USE MODI_INI_CTURB +USE MODE_INI_CST, ONLY: INI_CST USE MODI_INI_MODEL_n USE MODI_INI_SEG_n USE MODI_INI_SIZE_n @@ -141,6 +141,8 @@ WRITE(UNIT=ILUOUT0,FMT="(50('*'),/,'*',48X,'*',/, & & 7('*'),12X,' CNRM - LA ',12X,8('*'),/, & & '*',48X,'*',/, 50('*'))") ! +CALL NSV_ASSOCIATE() +! ! !* 1.2 initialize physical constants ! @@ -149,12 +151,8 @@ CALL INI_CST ! !* 1.3 initialize constants for the turbulence scheme ! -CALL INI_CTURB -! -! -!* 1.4 initialize constants for nebulosity computation +!Now done in ini_modeln ! -CALL INI_NEB ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/ion_attach_elec.f90 b/src/MNH/ion_attach_elec.f90 index dfda780c2..cd0fcf1c3 100644 --- a/src/MNH/ion_attach_elec.f90 +++ b/src/MNH/ion_attach_elec.f90 @@ -90,8 +90,8 @@ USE MODD_ELEC_n USE MODD_ELEC_PARAM USE MODD_NSV, ONLY: NSV_ELECBEG, NSV_ELEC USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT -USE MODD_RAIN_ICE_DESCR -USE MODD_RAIN_ICE_PARAM +USE MODD_RAIN_ICE_DESCR_n +USE MODD_RAIN_ICE_PARAM_n USE MODD_REF, ONLY: XTHVREFZ use mode_budget, only: Budget_store_init, Budget_store_end diff --git a/src/MNH/latlon_to_xy.f90 b/src/MNH/latlon_to_xy.f90 index ae3cfb6ca..d58793565 100644 --- a/src/MNH/latlon_to_xy.f90 +++ b/src/MNH/latlon_to_xy.f90 @@ -84,7 +84,7 @@ USE MODE_MODELN_HANDLER, ONLY: GOTO_MODEL USE MODE_POS, ONLY: POSNAM use MODE_SPLITTINGZ_ll ! -USE MODI_INI_CST +USE MODE_INI_CST, ONLY: INI_CST USE MODI_READ_HGRID USE MODI_VERSION ! diff --git a/src/MNH/lesn.f90 b/src/MNH/lesn.f90 index 11905f8b2..6411b6cc5 100644 --- a/src/MNH/lesn.f90 +++ b/src/MNH/lesn.f90 @@ -68,15 +68,10 @@ USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_PARAM_n, ONLY: CCLOUD USE MODD_PRECIP_n, ONLY: XINPRR,XACPRR,XINPRR3D,XEVAP3D,XINPRC,XINDEP USE MODD_NSV, ONLY : NSV, NSV_CS -USE MODD_PARAM_ICE, ONLY: LDEPOSC,LSEDIC +USE MODD_PARAM_ICE_n, ONLY: LDEPOSC,LSEDIC USE MODD_PARAM_C2R2, ONLY: LDEPOC,LSEDC USE MODD_PARAM_LIMA, ONLY : MSEDC=>LSEDC ! -USE MODE_BL_DEPTH_DIAG -USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX -USE MODE_ll -USE MODE_MODELN_HANDLER -! USE MODI_SHUMAN USE MODI_GRADIENT_M USE MODI_GRADIENT_U @@ -89,6 +84,11 @@ USE MODI_THL_RT_FROM_TH_R USE MODI_LES_RES_TR USE MODI_BUDGET_FLAGS USE MODI_LES_BUDGET_TEND_n +USE MODE_BL_DEPTH_DIAG +! +USE MODE_ll +USE MODE_MODELN_HANDLER +USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX ! IMPLICIT NONE ! diff --git a/src/MNH/lidar.f90 b/src/MNH/lidar.f90 index e838af284..93cfad846 100644 --- a/src/MNH/lidar.f90 +++ b/src/MNH/lidar.f90 @@ -99,8 +99,8 @@ USE MODD_RAIN_C2R2_DESCR, ONLY : XLBEXC, XLBEXR, & XRTMIN, XCTMIN USE MODD_PARAM_C2R2, ONLY : YALPHAC=>XALPHAC,YNUC=>XNUC, & YALPHAR=>XALPHAR,YNUR=>XNUR -USE MODD_PARAM_ICE, ONLY: WSNOW_T=>LSNOW_T -USE MODD_RAIN_ICE_DESCR, ONLY : XCCR, WLBEXR=>XLBEXR, XLBR, & +USE MODD_PARAM_ICE_n, ONLY: WSNOW_T=>LSNOW_T +USE MODD_RAIN_ICE_DESCR_n, ONLY : XCCR, WLBEXR=>XLBEXR, XLBR, & XCCS, XCXS, XLBEXS, XLBS, WNS=>XNS, WBS=>XBS, & XCCG, XCXG, XLBEXG, XLBG, & XCCH, XCXH, XLBEXH, XLBH, & diff --git a/src/MNH/mnh2lpdm.f90 b/src/MNH/mnh2lpdm.f90 index 7a37fde0f..e5472663f 100644 --- a/src/MNH/mnh2lpdm.f90 +++ b/src/MNH/mnh2lpdm.f90 @@ -41,7 +41,7 @@ USE MODE_MODELN_HANDLER use mode_msg USE MODE_POS ! -USE MODI_INI_CST +USE MODE_INI_CST, ONLY: INI_CST USE MODI_MNH2LPDM_ECH USE MODI_MNH2LPDM_INI USE MODI_VERSION diff --git a/src/MNH/mnh2lpdm_ech.f90 b/src/MNH/mnh2lpdm_ech.f90 index 37bd578e9..a916c8922 100644 --- a/src/MNH/mnh2lpdm_ech.f90 +++ b/src/MNH/mnh2lpdm_ech.f90 @@ -41,8 +41,6 @@ USE MODE_IO_FILE, only: IO_File_close, IO_File_open USE MODE_IO_FIELD_READ, only: IO_Field_read USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list ! -USE MODI_INI_CST -! IMPLICIT NONE ! ! diff --git a/src/MNH/mnh2lpdm_ini.f90 b/src/MNH/mnh2lpdm_ini.f90 index 4993f4c29..a18acfcbe 100644 --- a/src/MNH/mnh2lpdm_ini.f90 +++ b/src/MNH/mnh2lpdm_ini.f90 @@ -50,7 +50,7 @@ USE MODE_IO_FILE, only: IO_File_close, IO_File_open USE MODE_IO_FIELD_READ, only: IO_Field_read USE MODE_MODELN_HANDLER ! -USE MODI_INI_CST +USE MODE_INI_CST, ONLY: INI_CST USE MODI_READ_HGRID USE MODI_XYTOLATLON ! diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 444d56dd3..8079f0d34 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -350,7 +350,7 @@ USE MODD_OUT_n USE MODD_PARAM_C1R3, ONLY: NSEDI => LSEDI, NHHONI => LHHONI USE MODD_PARAM_C2R2, ONLY: NSEDC => LSEDC, NRAIN => LRAIN, NACTIT => LACTIT,LACTTKE,LDEPOC USE MODD_PARAMETERS -USE MODD_PARAM_ICE, ONLY: LWARM,LSEDIC,LCONVHG,LDEPOSC +USE MODD_PARAM_ICE_n, ONLY: LWARM,LSEDIC,LCONVHG,LDEPOSC, CSUBG_AUCV_RC USE MODD_PARAM_LIMA, ONLY: MSEDC => LSEDC, NMOM_C, NMOM_R, & MACTIT => LACTIT, LSCAV, NMOM_I, & MSEDI => LSEDI, MHHONI => LHHONI, NMOM_H, & @@ -362,7 +362,7 @@ USE MODD_PRECIP_n use modd_precision, only: MNHTIME USE MODD_PROFILER_n USE MODD_RADIATIONS_n, ONLY: XTSRAD,XSCAFLASWD,XDIRFLASWD,XDIRSRFSWD, XAER, XDTHRAD -USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN +USE MODD_RAIN_ICE_DESCR_n, ONLY: XRTMIN USE MODD_RECYCL_PARAM_n, ONLY: LRECYCL USE MODD_REF, ONLY: LCOUPLES USE MODD_REF_n @@ -374,8 +374,8 @@ USE MODD_SUB_MODEL_n USE MODD_TIME USE MODD_TIME_n USE MODD_TIMEZ -USE MODD_TURB_CLOUD, ONLY: NMODEL_CLOUD,CTURBLEN_CLOUD,XCEI USE MODD_TURB_n +USE MODD_NEB_n, ONLY: VSIGQSAT, LSIGMAS, LSUBG_COND USE MODD_TYPE_DATE, ONLY: DATE_TIME USE MODD_VISCOSITY ! @@ -1764,7 +1764,7 @@ XT_ADVUVW = XT_ADVUVW + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCES ! !------------------------------------------------------------------------------- ! -IF (NMODEL_CLOUD==IMI .AND. CTURBLEN_CLOUD/='NONE') THEN +IF (LCLOUDMODIFLM) THEN CALL TURB_CLOUD_INDEX( XTSTEP, TPBAKFILE, & LTURB_DIAG, NRRI, & XRRS, XRT, XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, & @@ -1782,7 +1782,7 @@ CALL MPPDB_CHECK3DM("before RAD_BOUND :XRU/V/WS",PRECISION,XRUS,XRVS,XRWS) ZRUS=XRUS ZRVS=XRVS ZRWS=XRWS - +! if ( .not. l1d ) then if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U), 'PRES', xrus(:, :, :) ) if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V), 'PRES', xrvs(:, :, :) ) @@ -1953,7 +1953,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR, & NSPLITG, IMI, KTCOUNT, & CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM, & - LSUBG_COND,LSIGMAS,CSUBG_AUCV,XTSTEP, & + LSUBG_COND,LSIGMAS,CSUBG_AUCV_RC,XTSTEP, & XZZ, XRHODJ, XRHODREF, XEXNREF, & ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & XPABST, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & @@ -1973,7 +1973,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR, & NSPLITG, IMI, KTCOUNT, & CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM, & - LSUBG_COND,LSIGMAS,CSUBG_AUCV, & + LSUBG_COND,LSIGMAS,CSUBG_AUCV_RC, & XTSTEP,XZZ, XRHODJ, XRHODREF, XEXNREF, & ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & XPABST, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & @@ -2010,7 +2010,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN ! IF (LSCAV .AND. (CCLOUD == 'LIMA')) THEN CALL LIMA_PRECIP_SCAVENGING( YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS), & - CCLOUD, ILUOUT, KTCOUNT,XTSTEP,XRT(:,:,:,3), & + CCLOUD, CCONF, ILUOUT, KTCOUNT,XTSTEP,XRT(:,:,:,3), & XRHODREF, XRHODJ, XZZ, XPABST, XTHT, & XSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & XRSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), XINPAP ) @@ -2052,7 +2052,7 @@ IF (CELEC /= 'NONE' .AND. (CCLOUD(1:3) == 'ICE')) THEN CALL RESOLVED_ELEC_n (CCLOUD, CSCONV, CMF_CLOUD, & NRR, NSPLITR, IMI, KTCOUNT, OEXIT, & CLBCX, CLBCY, CRAD, CTURBDIM, & - LSUBG_COND, LSIGMAS,VSIGQSAT,CSUBG_AUCV, & + LSUBG_COND, LSIGMAS,VSIGQSAT,CSUBG_AUCV_RC, & XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & ZPABST, XTHT, XRTHS, XWT, XRT, XRRS, & XSVT, XRSVS, XCIT, & @@ -2067,7 +2067,7 @@ IF (CELEC /= 'NONE' .AND. (CCLOUD(1:3) == 'ICE')) THEN CALL RESOLVED_ELEC_n (CCLOUD, CSCONV, CMF_CLOUD, & NRR, NSPLITR, IMI, KTCOUNT, OEXIT, & CLBCX, CLBCY, CRAD, CTURBDIM, & - LSUBG_COND, LSIGMAS,VSIGQSAT, CSUBG_AUCV, & + LSUBG_COND, LSIGMAS,VSIGQSAT, CSUBG_AUCV_RC, & XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & ZPABST, XTHT, XRTHS, XWT, & XRT, XRRS, XSVT, XRSVS, XCIT, & diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90 index f69cb3f18..ef93f2ccc 100644 --- a/src/MNH/phys_paramn.f90 +++ b/src/MNH/phys_paramn.f90 @@ -246,7 +246,7 @@ END MODULE MODI_PHYS_PARAM_n !* 0. DECLARATIONS ! ------------ ! -USE MODD_ADV_n, ONLY : XRTKEMS +USE MODD_ADV_n, ONLY : XRTKEMS USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER USE MODD_ARGSLIST_ll, ONLY : LIST_ll USE MODD_BLOWSNOW, ONLY : LBLOWSNOW,XRSNOW @@ -301,10 +301,10 @@ USE MODD_OCEANH USE MODD_OUT_n USE MODD_PARAM_C2R2, ONLY : LSEDC USE MODD_PARAMETERS -USE MODD_PARAM_ICE, ONLY : LSEDIC +USE MODD_PARAM_ICE_n, ONLY : LSEDIC USE MODD_PARAM_KAFR_n USE MODD_PARAM_LIMA, ONLY : MSEDC => LSEDC, XRTMIN_LIMA=>XRTMIN -USE MODD_PARAM_MFSHALL_n +USE MODD_PARAM_MFSHALL_n, ONLY: CMF_CLOUD USE MODD_PARAM_n USE MODD_PARAM_RAD_n USE MODD_PASPOL @@ -313,7 +313,7 @@ USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_PRECIP_n use modd_precision, only: MNHTIME USE MODD_RADIATIONS_n -USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN +USE MODD_RAIN_ICE_DESCR_n, ONLY: XRTMIN USE MODD_REF, ONLY: LCOUPLES USE MODD_REF_n USE MODD_SALT @@ -322,10 +322,9 @@ USE MODD_SUB_PHYS_PARAM_n USE MODD_TIME_n USE MODD_TIME_n USE MODD_TIME, ONLY : TDTEXP ! Ajout PP -USE MODD_TURB_CLOUD, ONLY : CTURBLEN_CLOUD,NMODEL_CLOUD, & - XCEI,XCEI_MIN,XCEI_MAX,XCOEF_AMPL_SAT USE MODD_TURB_FLUX_AIRCRAFT_BALLOON, ONLY : XTHW_FLUX, XRCW_FLUX, XSVW_FLUX USE MODD_TURB_n +USE MODD_NEB_n, ONLY: NEBN USE MODE_AERO_PSD use mode_budget, only: Budget_store_end, Budget_store_init @@ -1621,9 +1620,6 @@ IF (LOCEAN .AND. LDEEPOC) THEN END DO END IF !END DEEP OCEAN CONV CASE ! -LSTATNW = .FALSE. -LHARAT = .FALSE. -! IF(LLEONARD) THEN IGRADIENTS=6 ALLOCATE(ZHGRAD(IIU,IJU,IKU,IGRADIENTS)) @@ -1634,10 +1630,9 @@ IF(LLEONARD) THEN ZHGRAD(:,:,:,5) = GX_M_M(XRT(:,:,:,1), XDXX,XDZZ,XDZX,1,IKU,1) ZHGRAD(:,:,:,6) = GY_M_M(XRT(:,:,:,1), XDXX,XDZZ,XDZX,1,IKU,1) END IF - CALL TURB( CST,CSTURB, TBUCONF, TURBN,YLDIMPHYEX,TLES, & - IMI, NRR, NRRL, NRRI, CLBCX, CLBCY, IGRADIENTS, NHALO, & - 1, NMODEL_CLOUD, & - NSV, NSV_LGBEG, NSV_LGEND,CPROGRAM, & + CALL TURB( CST,CSTURB, TBUCONF, TURBN, NEBN, YLDIMPHYEX,TLES, & + NRR, NRRL, NRRI, CLBCX, CLBCY, IGRADIENTS, NHALO, NTURBSPLIT, & + LCLOUDMODIFLM, NSV, NSV_LGBEG, NSV_LGEND, & NSV_LIMA_NR, NSV_LIMA_NS, NSV_LIMA_NG, NSV_LIMA_NH, & L2D, LNOMIXLG,LFLAT, & LCOUPLES, LBLOWSNOW, LIBM,LFLYER, & @@ -1705,8 +1700,8 @@ IF (CSCONV == 'EDKF') THEN CALL MPPDB_CHECK3D(ZEXN,"physparam.7::ZEXN",PRECISION) ! CALL SHALLOW_MF_PACK(NRR,NRRL,NRRI, & - LMF_FLX,TPFILE,ZTIME_LES_MF, & - XIMPL_MF, XTSTEP, & + TPFILE,ZTIME_LES_MF, & + XTSTEP, & XDZZ, XZZ,XDXHAT(1),XDYHAT(1), & XRHODJ, XRHODREF, XPABST, ZEXN, ZSFTH, ZSFRV, & XTHT,XRT,XUT,XVT,XTKET,XSVT, & diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index ee75625e8..25eac5bc1 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -343,7 +343,6 @@ USE MODD_PGDDIM USE MODD_PGDGRID USE MODD_TIME USE MODD_TIME_n -USE MODD_PARAM_ICE, ONLY: PARAM_ICE_ASSOCIATE USE MODD_REF USE MODD_REF_n USE MODD_LUNIT @@ -362,7 +361,7 @@ USE MODD_LUNIT, ONLY: TLUOUT0, TOUTDATAFILE USE MODD_LUNIT_n USE MODD_IO, ONLY: TFILE_DUMMY, TFILE_OUTPUTLISTING USE MODD_CONF_n -USE MODD_NSV, ONLY: NSV +USE MODD_NSV, ONLY: NSV, NSV_ASSOCIATE use modd_precision, only: LFIINT, MNHREAL_MPI, MNHTIME ! USE MODN_BLANK_n @@ -435,9 +434,8 @@ USE MODI_SETADVFRC USE MODD_RELFRC_n ! Modif for grid-nesting USE MODI_SET_RELFRC ! -USE MODI_INI_CST -USE MODI_INI_NEB -USE MODD_NEB, ONLY: NEB +USE MODE_INI_CST, ONLY: INI_CST +USE MODD_NEB_n, ONLY: NEBN USE MODI_WRITE_HGRID USE MODD_MPIF USE MODD_VAR_ll @@ -644,7 +642,6 @@ CPROGRAM='IDEAL ' ! NVERB = 5 CALL INI_CST -CALL INI_NEB ! !------------------------------------------------------------------------------- ! @@ -656,10 +653,10 @@ CALL INI_NEB !* 2.1 For variables in DESFM file ! CALL ALLOC_FIELD_SCALARS() -CALL PARAM_ICE_ASSOCIATE() CALL TBUCONF_ASSOCIATE() CALL LES_ASSOCIATE() CALL DEFAULT_DESFM_n(1) +CALL NSV_ASSOCIATE() ! CSURF = "NONE" ! @@ -1696,7 +1693,7 @@ ELSE ZLVOCPEXN = (XLVTT + (XCPV-XCL) * (ZT-XTT))/(ZCPH*ZEXN) ZLSOCPEXN = (XLSTT + (XCPV-XCI) * (ZT-XTT))/(ZCPH*ZEXN) ZTHL=XTHT-ZLVOCPEXN*XRT(:,:,:,2)-ZLSOCPEXN*XRT(:,:,:,4) - CALL TH_R_FROM_THL_RT(CST, NEB, SIZE(ZFRAC_ICE), 'T',ZFRAC_ICE,XPABST,ZTHL,ZRT,XTHT,XRT(:,:,:,1), & + CALL TH_R_FROM_THL_RT(CST, NEBN, SIZE(ZFRAC_ICE), 'T',ZFRAC_ICE,XPABST,ZTHL,ZRT,XTHT,XRT(:,:,:,1), & XRT(:,:,:,2),XRT(:,:,:,4),ZRSATW, ZRSATI,OOCEAN=.FALSE.,& PBUF=ZBUF) END IF diff --git a/src/MNH/prep_nest_pgd.f90 b/src/MNH/prep_nest_pgd.f90 index e894cd407..4a2352d77 100644 --- a/src/MNH/prep_nest_pgd.f90 +++ b/src/MNH/prep_nest_pgd.f90 @@ -134,6 +134,7 @@ USE MODI_READ_HGRID USE MODI_RETRIEVE1_NEST_INFO_n USE MODI_VERSION USE MODI_WRITE_PGD_SURF_ATM_N +USE MODE_INI_CST, ONLY: INI_CST ! IMPLICIT NONE ! diff --git a/src/MNH/prep_pgd.f90 b/src/MNH/prep_pgd.f90 index 64c43fb8c..617389344 100644 --- a/src/MNH/prep_pgd.f90 +++ b/src/MNH/prep_pgd.f90 @@ -125,6 +125,7 @@ USE MODE_MPPDB USE MODI_EXTEND_GRID_ON_HALO ! USE MODN_CONFIO, ONLY : NAM_CONFIO +USE MODE_INI_CST, ONLY: INI_CST ! IMPLICIT NONE ! diff --git a/src/MNH/prep_real_case.f90 b/src/MNH/prep_real_case.f90 index 0ed4641b5..8cedd2db6 100644 --- a/src/MNH/prep_real_case.f90 +++ b/src/MNH/prep_real_case.f90 @@ -431,7 +431,6 @@ USE MODD_NESTING USE MODD_NSV USE MODD_PARAMETERS USE MODD_PARAM_n -USE MODD_PARAM_ICE, ONLY: PARAM_ICE_ASSOCIATE USE MODD_PREP_REAL USE MODD_REF_n !UPG*PT @@ -501,7 +500,8 @@ USE MODI_WRITE_LFIFM_n ! USE MODN_CONF, ONLY: JPHEXT , NHALO USE MODN_CONFZ -USE MODN_PARAM_LIMA +USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_INIT, NMOD_CCN, NMOD_IFN +USE MODE_INI_CST, ONLY: INI_CST ! IMPLICIT NONE ! @@ -616,7 +616,6 @@ CALL VERSION CPROGRAM='REAL ' ! CALL ALLOC_FIELD_SCALARS() -CALL PARAM_ICE_ASSOCIATE() CALL TBUCONF_ASSOCIATE() CALL LES_ASSOCIATE() CALL DEFAULT_DESFM_n(1) @@ -676,8 +675,7 @@ IPRE_REAL1 = TZPRE_REAL1FILE%NLU CALL INIT_NMLVAR CALL POSNAM( TZPRE_REAL1FILE, 'NAM_REAL_CONF', GFOUND ) IF (GFOUND) READ(IPRE_REAL1,NAM_REAL_CONF) -CALL POSNAM( TZPRE_REAL1FILE, 'NAM_PARAM_LIMA', GFOUND ) -IF (GFOUND) READ(IPRE_REAL1,NAM_PARAM_LIMA) +CALL PARAM_LIMA_INIT(CPROGRAM, TZPRE_REAL1FILE, .FALSE., ILUOUT0, .FALSE., .TRUE., .FALSE., 0) ! CALL INI_FIELD_LIST() ! diff --git a/src/MNH/prep_surfex.f90 b/src/MNH/prep_surfex.f90 index 547f5b1bc..6c3c81277 100644 --- a/src/MNH/prep_surfex.f90 +++ b/src/MNH/prep_surfex.f90 @@ -59,6 +59,7 @@ USE MODI_OPEN_PRC_FILES USE MODI_PREP_SURF_MNH USE MODI_READ_ALL_NAMELISTS USE MODI_VERSION +USE MODE_INI_CST, ONLY: INI_CST ! IMPLICIT NONE ! diff --git a/src/MNH/radar_scattering.f90 b/src/MNH/radar_scattering.f90 index 4c3ac1118..047cb5800 100644 --- a/src/MNH/radar_scattering.f90 +++ b/src/MNH/radar_scattering.f90 @@ -105,8 +105,8 @@ USE MODD_CST USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT USE MODD_PARAMETERS -USE MODD_PARAM_ICE, ONLY: LSNOW_T_I=>LSNOW_T -USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XDR_I=>XDR,XLBEXR_I=>XLBEXR,& +USE MODD_PARAM_ICE_n, ONLY: LSNOW_T_I=>LSNOW_T +USE MODD_RAIN_ICE_DESCR_n, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XDR_I=>XDR,XLBEXR_I=>XLBEXR,& XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XCR_I=>XCR,& XALPHAS_I=>XALPHAS,XNUS_I=>XNUS,XDS_I=>XDS,XLBEXS_I=>XLBEXS,& XLBS_I=>XLBS,XCCS_I=>XCCS,XNS_I=>XNS,XAS_I=>XAS,XBS_I=>XBS,XCXS_I=>XCXS,XCS_I=>XCS,& diff --git a/src/MNH/radiations.f90 b/src/MNH/radiations.f90 index 2ce3ff7dd..f4db08bfc 100644 --- a/src/MNH/radiations.f90 +++ b/src/MNH/radiations.f90 @@ -150,7 +150,7 @@ USE MODD_PARAMETERS USE MODD_PARAM_LIMA USE MODD_PARAM_n, ONLY: CCLOUD, CRAD USE MODD_PARAM_RAD_n, ONLY: CAOP -USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_DESCR_n USE MODD_SALT, ONLY: LSALT USE MODD_TIME ! diff --git a/src/MNH/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90 index 14925cb2b..af2db5f9e 100644 --- a/src/MNH/read_all_data_grib_case.f90 +++ b/src/MNH/read_all_data_grib_case.f90 @@ -157,7 +157,6 @@ USE MODI_XYTOLATLON USE MODI_HORIBL USE MODI_INI_NSV USE MODI_REMOVAL_VORTEX -USE MODI_INI_CTURB USE MODI_CH_OPEN_INPUT ! USE MODD_IO, ONLY: TFILEDATA @@ -1003,7 +1002,6 @@ END IF IF (CTURB=='TKEL') THEN IF (ALLOCATED(XTKE_LS)) DEALLOCATE(XTKE_LS) ALLOCATE(XTKE_LS(IIU,IJU,INLEVEL)) ; XTKE_LS=0. - CALL INI_CTURB ELSE IF (ALLOCATED(XTKE_LS)) DEALLOCATE(XTKE_LS) ALLOCATE(XTKE_LS(0,0,0)) diff --git a/src/MNH/read_desfmn.f90 b/src/MNH/read_desfmn.f90 index ea6c0f704..39e599098 100644 --- a/src/MNH/read_desfmn.f90 +++ b/src/MNH/read_desfmn.f90 @@ -220,13 +220,14 @@ USE MODN_PARAM_n USE MODN_PARAM_RAD_n USE MODN_PARAM_ECRAD_n USE MODN_PARAM_KAFR_n -USE MODN_PARAM_MFSHALL_n -USE MODN_PARAM_ICE, ONLY : NAM_PARAM_ICE, ZWARM=>LWARM, ZSEDIC=>LSEDIC, & - ZPRISTINE_ICE=>CPRISTINE_ICE, ZSEDIM=>CSEDIM +USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN_INIT +USE MODD_PARAM_ICE_n, ONLY : PARAM_ICEN_INIT +USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_INIT USE MODN_LUNIT_n USE MODN_LBC_n USE MODN_NUDGING_n -USE MODN_TURB_n +USE MODD_TURB_n, ONLY: TURBN_INIT, CTOM, LRMC01 +USE MODD_NEB_n, ONLY: NEBN_INIT USE MODN_FRC USE MODN_BLANK_n USE MODN_CH_SOLVER_n @@ -251,7 +252,6 @@ USE MODN_ELEC USE MODN_SERIES USE MODN_SERIES_n USE MODN_TURB_CLOUD -USE MODN_TURB USE MODN_CH_ORILAM USE MODN_DUST USE MODN_SALT @@ -267,7 +267,6 @@ USE MODN_2D_FRC USE MODN_BLOWSNOW_n USE MODN_BLOWSNOW ! -USE MODN_PARAM_LIMA ! USE MODN_FLYERS ! USE MODE_MSG @@ -407,12 +406,7 @@ IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_PARAM_KAFRn) CALL UPDATE_NAM_PARAM_KAFRn END IF -CALL POSNAM( TZDESFILE, 'NAM_PARAM_MFSHALLN', GFOUND ) -CALL INIT_NAM_PARAM_MFSHALLn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_PARAM_MFSHALLn) - CALL UPDATE_NAM_PARAM_MFSHALLn -END IF +CALL PARAM_MFSHALLN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) CALL POSNAM( TZDESFILE, 'NAM_LBCN', GFOUND ) CALL INIT_NAM_LBCn IF (GFOUND) THEN @@ -425,12 +419,9 @@ IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_NUDGINGn) CALL UPDATE_NAM_NUDGINGn END IF -CALL POSNAM( TZDESFILE, 'NAM_TURBN', GFOUND ) -CALL INIT_NAM_TURBn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_TURBn) - CALL UPDATE_NAM_TURBn -END IF +CALL TURBN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) +CALL NEBN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) +CALL PARAM_ICEN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) CALL POSNAM( TZDESFILE, 'NAM_CH_MNHCN', GFOUND ) CALL INIT_NAM_CH_MNHCn IF (GFOUND) THEN @@ -595,22 +586,17 @@ IF (KMI == 1) THEN IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PDF) CALL POSNAM( TZDESFILE, 'NAM_FRC', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_FRC) - CALL POSNAM( TZDESFILE, 'NAM_PARAM_ICE', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PARAM_ICE) CALL POSNAM( TZDESFILE, 'NAM_PARAM_C2R2', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PARAM_C2R2) CALL POSNAM( TZDESFILE, 'NAM_PARAM_C1R3', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PARAM_C1R3) - CALL POSNAM( TZDESFILE, 'NAM_PARAM_LIMA', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PARAM_LIMA) + CALL PARAM_LIMA_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) CALL POSNAM( TZDESFILE, 'NAM_ELEC', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_ELEC) CALL POSNAM( TZDESFILE, 'NAM_SERIES', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_SERIES) CALL POSNAM( TZDESFILE, 'NAM_TURB_CLOUD', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_TURB_CLOUD) - CALL POSNAM( TZDESFILE, 'NAM_TURB', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_TURB) CALL POSNAM( TZDESFILE, 'NAM_CH_ORILAM', GFOUND ) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_CH_ORILAM) CALL POSNAM( TZDESFILE, 'NAM_DUST', GFOUND ) @@ -732,13 +718,16 @@ IF (NVERB >= 10) THEN WRITE(UNIT=ILUOUT,NML=NAM_PARAM_KAFRn) ! WRITE(UNIT=ILUOUT,FMT="('*** MASS FLUX SHALLOW CONVECTION ***')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_MFSHALLn) + CALL PARAM_MFSHALLN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) ! WRITE(UNIT=ILUOUT,FMT="('********** LBCn ********************')") WRITE(UNIT=ILUOUT,NML=NAM_LBCn) ! WRITE(UNIT=ILUOUT,FMT="('********** TURBn *******************')") - WRITE(UNIT=ILUOUT,NML=NAM_TURBn) + CALL TURBN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) +! + WRITE(UNIT=ILUOUT,FMT="('********** NEBn *******************')") + CALL NEBN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) ! WRITE(UNIT=ILUOUT,FMT="('********** DRAGn *******************')") WRITE(UNIT=ILUOUT,NML=NAM_DRAGn) @@ -771,6 +760,9 @@ IF (NVERB >= 10) THEN ! WRITE(UNIT=ILUOUT,FMT="('********** STATIONn ******************')") ! WRITE(UNIT=ILUOUT,NML=NAM_STATIONn) ! + WRITE(UNIT=ILUOUT,FMT="('************ ICE SCHEME ***********************')") + CALL PARAM_ICEN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) +! WRITE(UNIT=ILUOUT,FMT="('********** BLAZE *******************')") WRITE(UNIT=ILUOUT,NML=NAM_FIREn) ! @@ -835,9 +827,6 @@ IF (NVERB >= 10) THEN ! WRITE(UNIT=ILUOUT,FMT="('************ FORCING **************************')") WRITE(UNIT=ILUOUT,NML=NAM_FRC) -! - WRITE(UNIT=ILUOUT,FMT="('************ ICE SCHEME ***********************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_ICE) ! WRITE(UNIT=ILUOUT,FMT="('************ ORILAM SCHEME ********************')") WRITE(UNIT=ILUOUT,NML=NAM_CH_ORILAM) @@ -884,7 +873,7 @@ IF (NVERB >= 10) THEN ! IF( CCLOUD == 'LIMA' ) THEN WRITE(UNIT=ILUOUT,FMT="('************ LIMA SCHEME **********************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_LIMA) + CALL PARAM_LIMA_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) END IF ! IF (CELEC /= 'NONE') THEN diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 9d9639c35..1aa20763f 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -21,7 +21,7 @@ INTERFACE OCONDSAMP,OBLOWSNOW, & KRIMX,KRIMY, KSV_USER, & HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC, & - HEQNSYS,PTSTEP_ALL,HINIFILEPGD ) + HEQNSYS,PTSTEP_ALL,HINIFILEPGD ) ! USE MODD_IO, ONLY: TFILEDATA ! @@ -94,7 +94,7 @@ END MODULE MODI_READ_EXSEG_n OCONDSAMP, OBLOWSNOW, & KRIMX,KRIMY, KSV_USER, & HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC, & - HEQNSYS,PTSTEP_ALL,HINIFILEPGD ) + HEQNSYS,PTSTEP_ALL,HINIFILEPGD ) ! ######################################################################### ! !!**** *READ_EXSEG_n * - routine to read the descriptor file EXSEG @@ -393,14 +393,14 @@ USE MODN_PARAM_C1R3, ONLY : NAM_PARAM_C1R3, CPRISTINE_ICE_C1R3, & USE MODN_PARAM_C2R2, ONLY : EPARAM_CCN=>HPARAM_CCN, EINI_CCN=>HINI_CCN, & WNUC=>XNUC, WALPHAC=>XALPHAC, NAM_PARAM_C2R2 USE MODN_PARAM_ECRAD_n -USE MODN_PARAM_ICE +USE MODD_PARAM_ICE_n, ONLY : PARAM_ICEN_INIT, PARAM_ICEN, CSUBG_AUCV_RC, CSUBG_AUCV_RI USE MODN_PARAM_KAFR_n -USE MODN_PARAM_LIMA, ONLY : FINI_CCN=>HINI_CCN,NAM_PARAM_LIMA,NMOD_CCN,LSCAV, & +USE MODD_PARAM_LIMA, ONLY : FINI_CCN=>HINI_CCN,PARAM_LIMA_INIT,NMOD_CCN,LSCAV, & CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, NMOD_IFN, NMOD_IMM, & LACTI, LNUCL, XALPHAC, XNUC, LMEYERS, & LPTSPLIT, LSPRO, LADJ, LKHKO, & NMOM_C, NMOM_R, NMOM_I, NMOM_S, NMOM_G, NMOM_H -USE MODN_PARAM_MFSHALL_n +USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN_INIT USE MODN_PARAM_n ! realized in subroutine ini_model n USE MODN_PARAM_RAD_n USE MODN_PASPOL @@ -410,9 +410,9 @@ USE MODN_SALT USE MODN_SERIES USE MODN_SERIES_n USE MODN_STATION_n, LDIAG_SURFRAD_STAT => LDIAG_SURFRAD -USE MODN_TURB -USE MODN_TURB_CLOUD -USE MODN_TURB_n +USE MODD_TURB_n, ONLY: TURBN_INIT, CTOM, CTURBDIM, LRMC01, LHARAT, & + LCLOUDMODIFLM, CTURBLEN_CLOUD, XCEI_MIN, XCEI_MAX +USE MODD_NEB_n, ONLY: NEBN_INIT, LSIGMAS, LSUBG_COND, CCONDENS, LSTATNW USE MODN_VISCOSITY ! IMPLICIT NONE @@ -502,10 +502,8 @@ CALL INIT_NAM_PARAM_RADN CALL INIT_NAM_PARAM_ECRADN #endif CALL INIT_NAM_PARAM_KAFRN -CALL INIT_NAM_PARAM_MFSHALLN CALL INIT_NAM_LBCN CALL INIT_NAM_NUDGINGN -CALL INIT_NAM_TURBN CALL INIT_NAM_BLANKN CALL INIT_NAM_DRAGN CALL INIT_NAM_IBM_PARAMN @@ -537,14 +535,14 @@ IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_ECRADn) #endif CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_KAFRN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_KAFRn) -CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_MFSHALLN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_MFSHALLn) +CALL PARAM_MFSHALLN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) CALL POSNAM( TPEXSEGFILE, 'NAM_LBCN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LBCn) CALL POSNAM( TPEXSEGFILE, 'NAM_NUDGINGN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_NUDGINGn) -CALL POSNAM( TPEXSEGFILE, 'NAM_TURBN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_TURBn) +CALL TURBN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) +CALL NEBN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) +CALL PARAM_ICEN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) CALL POSNAM( TPEXSEGFILE, 'NAM_DRAGN', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGn) CALL POSNAM( TPEXSEGFILE, 'NAM_IBM_PARAMN', GFOUND ) @@ -827,22 +825,15 @@ IF (KMI == 1) THEN IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PDF) CALL POSNAM( TPEXSEGFILE, 'NAM_FRC', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FRC) - CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_ICE', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_ICE) CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_C2R2', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_C2R2) CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_C1R3', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_C1R3) - CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_LIMA', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_LIMA) + CALL PARAM_LIMA_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) CALL POSNAM( TPEXSEGFILE, 'NAM_ELEC', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_ELEC) CALL POSNAM( TPEXSEGFILE, 'NAM_SERIES', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SERIES) - CALL POSNAM( TPEXSEGFILE, 'NAM_TURB_CLOUD', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_TURB_CLOUD) - CALL POSNAM( TPEXSEGFILE, 'NAM_TURB', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_TURB) CALL POSNAM( TPEXSEGFILE, 'NAM_CH_ORILAM', GFOUND ) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CH_ORILAM) CALL POSNAM( TPEXSEGFILE, 'NAM_DUST', GFOUND ) @@ -922,14 +913,8 @@ CALL TEST_NAM_VAR(ILUOUT,'CLBCX(2)',CLBCX(2),'CYCL','WALL','OPEN') CALL TEST_NAM_VAR(ILUOUT,'CLBCY(1)',CLBCY(1),'CYCL','WALL','OPEN') CALL TEST_NAM_VAR(ILUOUT,'CLBCY(2)',CLBCY(2),'CYCL','WALL','OPEN') ! -CALL TEST_NAM_VAR(ILUOUT,'CTURBDIM',CTURBDIM,'1DIM','3DIM') -CALL TEST_NAM_VAR(ILUOUT,'CTURBLEN',CTURBLEN,'DELT','BL89','RM17','DEAR','BLKR','HM21') -CALL TEST_NAM_VAR(ILUOUT,'CTOM',CTOM,'NONE','TM06') -CALL TEST_NAM_VAR(ILUOUT,'CSUBG_AUCV',CSUBG_AUCV,'NONE','CLFR','SIGM','PDF','ADJU') -CALL TEST_NAM_VAR(ILUOUT,'CSUBG_AUCV_RI',CSUBG_AUCV_RI,'NONE','CLFR','ADJU') -CALL TEST_NAM_VAR(ILUOUT,'CCONDENS',CCONDENS,'CB02','GAUS') -CALL TEST_NAM_VAR(ILUOUT,'CLAMBDA3',CLAMBDA3,'CB','NONE') -CALL TEST_NAM_VAR(ILUOUT,'CSUBG_MF_PDF',CSUBG_MF_PDF,'NONE','TRIANGLE') +CALL TURBN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0) +CALL NEBN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0) ! CALL TEST_NAM_VAR(ILUOUT,'CCH_TDISCRETIZATION',CCH_TDISCRETIZATION, & 'SPLIT ','CENTER ','LAGGED ') @@ -948,13 +933,11 @@ CALL TEST_NAM_VAR(ILUOUT,'CTURBLEN_CLOUD',CTURBLEN_CLOUD,'NONE','DEAR','DELT','B ! ! The test on the mass flux scheme for shallow convection ! -CALL TEST_NAM_VAR(ILUOUT,'CMF_UPDRAFT',CMF_UPDRAFT,'NONE','EDKF','RHCJ') -CALL TEST_NAM_VAR(ILUOUT,'CMF_CLOUD',CMF_CLOUD,'NONE','STAT','DIRE') +CALL PARAM_MFSHALLN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0) ! ! The test on the CSOLVER name is made elsewhere ! -CALL TEST_NAM_VAR(ILUOUT,'CPRISTINE_ICE',CPRISTINE_ICE,'PLAT','COLU','BURO') -CALL TEST_NAM_VAR(ILUOUT,'CSEDIM',CSEDIM,'SPLI','STAT','NONE') +CALL PARAM_ICEN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0) IF( CCLOUD == 'C3R5' ) THEN CALL TEST_NAM_VAR(ILUOUT,'CPRISTINE_ICE_C1R3',CPRISTINE_ICE_C1R3, & 'PLAT','COLU','BURO') @@ -963,10 +946,7 @@ IF( CCLOUD == 'C3R5' ) THEN END IF ! IF( CCLOUD == 'LIMA' ) THEN - CALL TEST_NAM_VAR(ILUOUT,'CPRISTINE_ICE_LIMA',CPRISTINE_ICE_LIMA, & - 'PLAT','COLU','BURO') - CALL TEST_NAM_VAR(ILUOUT,'CHEVRIMED_ICE_LIMA',CHEVRIMED_ICE_LIMA, & - 'GRAU','HAIL') + CALL PARAM_LIMA_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0) END IF ! Blaze CALL UPDATE_NAM_FIREn @@ -1001,6 +981,15 @@ IF(LBLOWSNOW) THEN CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') ENDIF END IF +! Consistency checks between phyex modules +IF ((CSUBG_AUCV_RC == 'ADJU' .OR. CSUBG_AUCV_RI == 'ADJU') .AND. CCONDENS /= 'GAUS') THEN + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'READ_EXSEGN', & + &"CSUBG_AUCV_RC and/or CSUBG_AUCV_RI cannot be 'ADJU' if CCONDENS is not 'GAUS'") +ENDIF +IF (.NOT. LHARAT .AND. LSTATNW) THEN + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'READ_EXSEGN', & + &'LSTATNW only tested in combination with HARATU and EDMFm!') +ENDIF ! !-------------------------------------------------------------------------------! !* 2. FIRST INITIALIZATIONS @@ -1031,14 +1020,14 @@ SELECT CASE ( CCLOUD ) ! END IF ! - IF (CSUBG_AUCV == 'SIGM') THEN + IF (CSUBG_AUCV_RC == 'SIGM') THEN ! WRITE(UNIT=ILUOUT,FMT=9002) KMI WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE THE SUBGRID AUTOCONVERSION SCHEME ' WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT MICROPHYSICS' WRITE(UNIT=ILUOUT,FMT=*) ' CSUBG_AUCV IS PUT TO "NONE"' ! - CSUBG_AUCV = 'NONE' + CSUBG_AUCV_RC = 'NONE' ! END IF ! @@ -1058,15 +1047,15 @@ SELECT CASE ( CCLOUD ) LUSERH=.FALSE. END IF ! - IF (CSUBG_AUCV == 'SIGM') THEN + IF (CSUBG_AUCV_RC == 'SIGM') THEN ! WRITE(UNIT=ILUOUT,FMT=9003) KMI WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE BOTH A REVERSIBLE MICROPHYSICAL SCHEME ' WRITE(UNIT=ILUOUT,FMT=*) ' AND THE SUBGRID AUTOCONVERSION SCHEME ' WRITE(UNIT=ILUOUT,FMT=*) 'BUT YOU DO NOT HAVE RAIN in the "REVE" SCHEME' - WRITE(UNIT=ILUOUT,FMT=*) ' CSUBG_AUCV IS PUT TO "NONE"' + WRITE(UNIT=ILUOUT,FMT=*) ' CSUBG_AUCV_RC IS PUT TO "NONE"' ! - CSUBG_AUCV = 'NONE' + CSUBG_AUCV_RC = 'NONE' ! END IF ! @@ -1085,14 +1074,14 @@ SELECT CASE ( CCLOUD ) LUSERG=.FALSE.; LUSERH=.FALSE. END IF ! - IF (CSUBG_AUCV == 'SIGM') THEN + IF (CSUBG_AUCV_RC == 'SIGM') THEN ! WRITE(UNIT=ILUOUT,FMT=9003) KMI WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE BOTH A KESSLER MICROPHYSICAL SCHEME ' WRITE(UNIT=ILUOUT,FMT=*) ' AND THE SUBGRID AUTOCONVERSION SCHEME USING' WRITE(UNIT=ILUOUT,FMT=*) 'SIGMA_RC.' WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT YET AVAILABLE.' - WRITE(UNIT=ILUOUT,FMT=*) 'SET CSUBG_AUCV TO "CLFR" or "NONE" OR CCLOUD TO "ICE3"' + WRITE(UNIT=ILUOUT,FMT=*) 'SET CSUBG_AUCV_RC TO "CLFR" or "NONE" OR CCLOUD TO "ICE3"' ! !callabortstop CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') @@ -1117,20 +1106,20 @@ SELECT CASE ( CCLOUD ) LUSERH=.FALSE. END IF ! - IF (CSUBG_AUCV == 'SIGM' .AND. .NOT. LSUBG_COND) THEN + IF (CSUBG_AUCV_RC == 'SIGM' .AND. .NOT. LSUBG_COND) THEN WRITE(UNIT=ILUOUT,FMT=9002) KMI WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID AUTOCONVERSION SCHEME' WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT THE SUBGRID CONDENSATION SCHEME.' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV is SET to NONE' - CSUBG_AUCV='NONE' + WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV_RC is SET to NONE' + CSUBG_AUCV_RC='NONE' END IF ! - IF (CSUBG_AUCV == 'CLFR' .AND. CSCONV /= 'EDKF') THEN + IF (CSUBG_AUCV_RC == 'CLFR' .AND. CSCONV /= 'EDKF') THEN WRITE(UNIT=ILUOUT,FMT=9002) KMI WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID AUTOCONVERSION SCHEME' WRITE(UNIT=ILUOUT,FMT=*) 'WITH THE CONVECTIVE CLOUD FRACTION WITHOUT EDKF' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV is SET to NONE' - CSUBG_AUCV='NONE' + WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV_RC is SET to NONE' + CSUBG_AUCV_RC='NONE' END IF ! CASE ( 'ICE4' ) @@ -1151,12 +1140,12 @@ SELECT CASE ( CCLOUD ) LUSERS=.TRUE. ; LUSERG=.TRUE. ; LUSERH=.TRUE. END IF ! - IF (CSUBG_AUCV /= 'NONE' .AND. .NOT. LSUBG_COND) THEN + IF (CSUBG_AUCV_RC /= 'NONE' .AND. .NOT. LSUBG_COND) THEN WRITE(UNIT=ILUOUT,FMT=9002) KMI WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID AUTOCONVERSION SCHEME' WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT THE SUBGRID CONDENSATION SCHEME.' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV is SET to NONE' - CSUBG_AUCV='NONE' + WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV_RC is SET to NONE' + CSUBG_AUCV_RC='NONE' END IF ! CASE ( 'C2R2','C3R5', 'KHKO' ) @@ -1269,29 +1258,6 @@ SELECT CASE ( CCLOUD ) END IF ! CASE ( 'LIMA') - IF ((LACTI .AND. FINI_CCN == 'XXX')) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A 2-MOMENT MICROPHYSICAL ", & - &" SCHEME BUT YOU DIDNT FILL CORRECTLY NAM_PARAM_LIMA", & - &" YOU HAVE TO FILL FINI_CCN ")') - call Print_msg( NVERB_FATAL, 'GEN', 'READ_EXSEG_n', '' ) - END IF -! - IF(LACTI .AND. NMOD_CCN == 0) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("ACTIVATION OF AEROSOL PARTICLES IS NOT ", & - &"POSSIBLE IF NMOD_CCN HAS VALUE ZERO. YOU HAVE TO SET AN UPPER ", & - &"VALUE OF NMOD_CCN IN ORDER TO USE LIMA WARM ACTIVATION SCHEME.")') - call Print_msg( NVERB_FATAL, 'GEN', 'READ_EXSEG_n', '' ) - END IF -! - IF(LNUCL .AND. NMOD_IFN == 0 .AND. (.NOT.LMEYERS)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("NUCLEATION BY DEPOSITION AND CONTACT IS NOT ", & - &"POSSIBLE IF NMOD_IFN HAS VALUE ZERO. YOU HAVE TO SET AN UPPER", & - &"VALUE OF NMOD_IFN IN ORDER TO USE LIMA COLD NUCLEATION SCHEME.")') - END IF -! IF (HCLOUD == 'NONE') THEN CGETCLOUD = 'SKIP' ELSE IF (HCLOUD == 'REVE' ) THEN @@ -1666,11 +1632,6 @@ ELSE END IF END IF ! -IF(CTURBLEN=='RM17' .OR. CTURBLEN=='HM21') THEN - XCEDIS=0.34 -ELSE - XCEDIS=0.84 -END IF ! !* 3.3 Moist turbulence ! @@ -1692,11 +1653,10 @@ ELSE CGETSIGS ='SKIP' END IF ! -IF(NMODEL_CLOUD==KMI .AND. CTURBLEN_CLOUD/='NONE') THEN +IF(LCLOUDMODIFLM .AND. CTURBLEN_CLOUD/='NONE') THEN IF (CTURB=='NONE' .OR. .NOT.LUSERC) THEN WRITE(UNIT=ILUOUT,FMT=9001) KMI WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO COMPUTE A MIXING LENGTH FOR CLOUD=", & - & A4,/, & & ", WHEREAS YOU DO NOT SPECIFY A TURBULENCE SCHEME OR ", & & "USE OF RC,",/," CTURBLEN_CLOUD IS SET TO NONE")') & CTURBLEN_CLOUD @@ -3049,10 +3009,8 @@ CALL UPDATE_NAM_PARAM_RADN CALL UPDATE_NAM_PARAM_ECRADN #endif CALL UPDATE_NAM_PARAM_KAFRN -CALL UPDATE_NAM_PARAM_MFSHALLN CALL UPDATE_NAM_LBCN CALL UPDATE_NAM_NUDGINGN -CALL UPDATE_NAM_TURBN CALL UPDATE_NAM_BLANKN CALL UPDATE_NAM_CH_MNHCN CALL UPDATE_NAM_CH_SOLVERN diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90 index f32ec5b94..d86c67557 100644 --- a/src/MNH/read_field.f90 +++ b/src/MNH/read_field.f90 @@ -283,7 +283,7 @@ USE MODD_BLOWSNOW_n, ONLY: XSNWCANO USE MODD_CONF, ONLY: CCONF, CPROGRAM, L1D, LFORCING, NVERB USE MODD_CONF_n, ONLY: IDX_RVT, IDX_RCT, IDX_RRT, IDX_RIT, IDX_RST, IDX_RGT, IDX_RHT USE MODD_CST, ONLY: XALPW, XBETAW, XCPD, XGAMW, XMD, XMV, XP00, XRD -USE MODD_CTURB, ONLY: XTKEMIN +USE MODD_TURB_n, ONLY: XTKEMIN USE MODD_DYN_n, ONLY: LOCEAN use modd_field, only: tfieldmetadata, tfieldlist, NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED, & TYPEDATE, TYPEREAL, TYPELOG, TYPEINT diff --git a/src/MNH/read_precip_field.f90 b/src/MNH/read_precip_field.f90 index 0d74aaf46..1267beea7 100644 --- a/src/MNH/read_precip_field.f90 +++ b/src/MNH/read_precip_field.f90 @@ -100,7 +100,7 @@ END MODULE MODI_READ_PRECIP_FIELD use modd_field, only: tfieldmetadata, tfieldlist USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAM_ICE, ONLY: LDEPOSC +USE MODD_PARAM_ICE_n, ONLY: LDEPOSC USE MODD_PARAM_C2R2, ONLY: LDEPOC USE MODD_PARAM_LIMA, ONLY: MDEPOC=>LDEPOC ! diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index 64d5eec3a..aec42c053 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -295,19 +295,18 @@ USE MODD_CST, ONLY: CST USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_DUST , ONLY: LDUST USE MODD_IO, ONLY: TFILEDATA -USE MODD_NEB, ONLY: NEB +USE MODD_NEB_n, ONLY: NEBN, CCONDENS, CLAMBDA3 USE MODD_NSV, ONLY: NSV, NSV_C1R3END, NSV_C2R2BEG, NSV_C2R2END, & NSV_LIMA_BEG, NSV_LIMA_END, NSV_LIMA_CCN_FREE, NSV_LIMA_IFN_FREE, & NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR, NSV_AEREND,NSV_DSTEND,NSV_SLTEND USE MODD_PARAM_C2R2, ONLY: LSUPSAT USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT -USE MODD_PARAM_ICE, ONLY: CSEDIM, LADJ_BEFORE, LADJ_AFTER, CFRAC_ICE_ADJUST, LRED, & - PARAM_ICE +USE MODD_PARAM_ICE_n, ONLY: CSEDIM, LADJ_BEFORE, LADJ_AFTER, LRED, PARAM_ICEN USE MODD_PARAM_LIMA, ONLY: LADJ, LPTSPLIT, LSPRO, NMOD_CCN, NMOD_IFN, NMOD_IMM, NMOM_I -USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN, RAIN_ICE_DESCR -USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM +USE MODD_RAIN_ICE_DESCR_n, ONLY: XRTMIN, RAIN_ICE_DESCRN +USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAMN USE MODD_SALT, ONLY: LSALT -USE MODD_TURB_n, ONLY: TURBN, CSUBG_AUCV_RI, CCONDENS, CLAMBDA3, CSUBG_MF_PDF +USE MODD_TURB_n, ONLY: TURBN ! USE MODE_ll USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX @@ -806,9 +805,9 @@ SELECT CASE ( HCLOUD ) ENDDO ZZZ = MZF( PZZ ) IF(LRED .AND. LADJ_BEFORE) THEN - CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAM, NEB, TURBN, TBUCONF, KRR, & - CFRAC_ICE_ADJUST, & - 'ADJU', .FALSE., .FALSE., & + CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN, & + PARAM_ICEN, TBUCONF, KRR, & + 'ADJU', & PTSTEP, ZSIGQSAT2D, & PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV,PMFCONV, PPABST, ZZZ, & ZEXN, PCF_MF, PRC_MF, PRI_MF, & @@ -826,8 +825,8 @@ SELECT CASE ( HCLOUD ) PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) ENDIF IF (LRED) THEN - CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICE, RAIN_ICE_PARAM, RAIN_ICE_DESCR,TBUCONF,& - 0, .FALSE., HSUBG_AUCV, CSUBG_AUCV_RI, & + CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICEN, RAIN_ICE_PARAMN, & + RAIN_ICE_DESCRN, TBUCONF, & PTSTEP, KRR, ZEXN, & ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT,PCLDFR,& PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & @@ -859,9 +858,9 @@ SELECT CASE ( HCLOUD ) ! ! IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN - CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAM, NEB, TURBN, TBUCONF, KRR, & - CFRAC_ICE_ADJUST, & - 'DEPI', .FALSE., .FALSE., & + CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN, & + PARAM_ICEN, TBUCONF, KRR, & + 'DEPI', & PTSTEP, ZSIGQSAT2D, & PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,PPABST, ZZZ, & ZEXN, PCF_MF, PRC_MF, PRI_MF, & @@ -897,9 +896,9 @@ SELECT CASE ( HCLOUD ) ENDDO ZZZ = MZF( PZZ ) IF(LRED .AND. LADJ_BEFORE) THEN - CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAM, NEB, TURBN, TBUCONF, KRR, & - CFRAC_ICE_ADJUST, & - 'ADJU', .FALSE., .FALSE., & + CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN, & + PARAM_ICEN, TBUCONF, KRR, & + 'ADJU', & PTSTEP, ZSIGQSAT2D, & PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV,PMFCONV, PPABST, ZZZ, & ZEXN, PCF_MF, PRC_MF, PRI_MF, & @@ -918,8 +917,8 @@ SELECT CASE ( HCLOUD ) PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) ENDIF IF (LRED) THEN - CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICE, RAIN_ICE_PARAM, RAIN_ICE_DESCR,TBUCONF,& - 0, .FALSE., HSUBG_AUCV, CSUBG_AUCV_RI, & + CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICEN, RAIN_ICE_PARAMN, & + RAIN_ICE_DESCRN, TBUCONF, & PTSTEP, KRR, ZEXN, & ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & @@ -953,9 +952,9 @@ SELECT CASE ( HCLOUD ) !* 10.2 Perform the saturation adjustment over cloud ice and cloud water ! IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN - CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAM, NEB, TURBN, TBUCONF, KRR, & - CFRAC_ICE_ADJUST, & - 'DEPI', .FALSE., .FALSE., & + CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN, & + PARAM_ICEN, TBUCONF, KRR, & + 'DEPI', & PTSTEP, ZSIGQSAT2D, & PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,PPABST, ZZZ, & ZEXN, PCF_MF, PRC_MF, PRI_MF, & diff --git a/src/MNH/series_cloud_elec.f90 b/src/MNH/series_cloud_elec.f90 index 05ced2f2a..c740922db 100644 --- a/src/MNH/series_cloud_elec.f90 +++ b/src/MNH/series_cloud_elec.f90 @@ -97,8 +97,8 @@ USE MODD_ELEC_PARAM USE MODD_IO, ONLY: TFILEDATA USE MODD_NSV, ONLY: NSV_ELECBEG, NSV_ELECEND USE MODD_PARAMETERS -USE MODD_RAIN_ICE_DESCR -USE MODD_RAIN_ICE_PARAM +USE MODD_RAIN_ICE_DESCR_n +USE MODD_RAIN_ICE_PARAM_n USE MODD_REF USE MODI_MOMG diff --git a/src/MNH/set_conc_ice_c1r3.f90 b/src/MNH/set_conc_ice_c1r3.f90 index ac965cb2e..0dfe34119 100644 --- a/src/MNH/set_conc_ice_c1r3.f90 +++ b/src/MNH/set_conc_ice_c1r3.f90 @@ -80,7 +80,7 @@ USE MODD_CONF, ONLY : NVERB USE MODD_ICE_C1R3_DESCR, ONLY : XRTMIN, XCTMIN USE MODD_ICE_C1R3_PARAM, ONLY : XCONCI_MAX, XNUC_CON, XEXTT_CON, XEX_CON USE MODD_LUNIT_n, ONLY : TLUOUT -USE MODD_RAIN_ICE_DESCR, ONLY : XAI, XBI +USE MODD_RAIN_ICE_DESCR_n, ONLY : XAI, XBI ! IMPLICIT NONE ! diff --git a/src/MNH/set_msk.f90 b/src/MNH/set_msk.f90 index 0e6a7d353..ba4da88bf 100644 --- a/src/MNH/set_msk.f90 +++ b/src/MNH/set_msk.f90 @@ -72,8 +72,8 @@ END MODULE MODI_SET_MSK ! ------------ ! USE MODD_FIELD_n -USE MODD_RAIN_ICE_PARAM , ONLY : XFSEDR,XEXSEDR -USE MODD_RAIN_ICE_DESCR , ONLY : XCEXVT +USE MODD_RAIN_ICE_PARAM_n , ONLY : XFSEDR,XEXSEDR +USE MODD_RAIN_ICE_DESCR_n , ONLY : XCEXVT USE MODD_CST , ONLY : XRHOLW USE MODD_PARAMETERS USE MODD_CONF diff --git a/src/MNH/set_rsou.f90 b/src/MNH/set_rsou.f90 index 352af8a53..6c2ea6b2f 100644 --- a/src/MNH/set_rsou.f90 +++ b/src/MNH/set_rsou.f90 @@ -261,7 +261,7 @@ END MODULE MODI_SET_RSOU USE MODD_CONF USE MODD_CONF_n USE MODD_CST -USE MODD_NEB, ONLY: NEB +USE MODD_NEB_n, ONLY: NEBN USE MODD_DYN_n, ONLY: LOCEAN USE MODD_FIELD_n USE MODD_GRID @@ -1594,7 +1594,7 @@ ELSE DO JLOOP=1,20 ! loop for pression CALL COMPUTE_EXNER_FROM_GROUND(ZTHVM,ZZMASS_PROFILE(:),ZEXNSURF,ZEXNFLUX,ZEXNMASS) ZPRESS(:)=XP00*(ZEXNMASS(:))**(XCPD/XRD) - CALL TH_R_FROM_THL_RT(CST,NEB,SIZE(ZPRESS,1),'T',ZFRAC_ICE,ZPRESS,ZTHLM,ZMRT,ZTHM,ZMRM,ZMRCM,ZMRIM, & + CALL TH_R_FROM_THL_RT(CST,NEBN,SIZE(ZPRESS,1),'T',ZFRAC_ICE,ZPRESS,ZTHLM,ZMRT,ZTHM,ZMRM,ZMRCM,ZMRIM, & ZRSATW, ZRSATI,OOCEAN=.FALSE.,& PBUF=ZBUF) ZTHVM(:)=ZTHM(:)*(1.+XRV/XRD*ZMRM(:))/(1.+(ZMRM(:)+ZMRIM(:)+ZMRCM(:))) diff --git a/src/MNH/shallow_mf_pack.f90 b/src/MNH/shallow_mf_pack.f90 index c7ad64d47..1f76d9759 100644 --- a/src/MNH/shallow_mf_pack.f90 +++ b/src/MNH/shallow_mf_pack.f90 @@ -10,8 +10,8 @@ INTERFACE ! ################################################################# SUBROUTINE SHALLOW_MF_PACK(KRR,KRRL,KRRI, & - OMF_FLX,TPFILE,PTIME_LES, & - PIMPL_MF, PTSTEP, & + TPFILE,PTIME_LES, & + PTSTEP, & PDZZ, PZZ, PDX,PDY, & PRHODJ, PRHODREF, & PPABSM, PEXN, & @@ -30,11 +30,8 @@ use modd_precision, only: MNHTIME INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. INTEGER, INTENT(IN) :: KRRI ! number of ice water var. -LOGICAL, INTENT(IN) :: OMF_FLX ! switch to write the - ! MF fluxes in the synchronous FM-file TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file REAL(kind=MNHTIME),DIMENSION(2), INTENT(OUT) :: PTIME_LES ! time spent in LES computations -REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height of flux point @@ -68,8 +65,8 @@ END MODULE MODI_SHALLOW_MF_PACK ! ################################################################# SUBROUTINE SHALLOW_MF_PACK(KRR,KRRL,KRRI, & - OMF_FLX,TPFILE,PTIME_LES, & - PIMPL_MF, PTSTEP, & + TPFILE,PTIME_LES, & + PTSTEP, & PDZZ, PZZ, PDX,PDY, & PRHODJ, PRHODREF, & PPABSM, PEXN, & @@ -117,10 +114,10 @@ END MODULE MODI_SHALLOW_MF_PACK ! ------------ ! USE MODD_CST, ONLY: CST -USE MODD_NEB, ONLY: NEB +USE MODD_NEB_n, ONLY: NEBN USE MODD_TURB_n, ONLY: TURBN USE MODD_CTURB, ONLY: CSTURB -USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN +USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN, LMF_FLX USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t ! USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX @@ -128,10 +125,9 @@ USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX USE MODD_BUDGET, ONLY: TBUDGETS,TBUCONF,lbudget_th,nbudget_th USE MODD_CONF USE MODD_IO, ONLY: TFILEDATA -use modd_field, only: tfieldmetadata, TYPEREAL +use modd_field, ONLY: tfieldmetadata, TYPEREAL USE MODD_NSV, ONLY: XSVMIN, NSV_LGBEG, NSV_LGEND USE MODD_PARAMETERS -USE MODD_PARAM_ICE, ONLY: CFRAC_ICE_SHALLOW_MF USE MODD_PARAM_MFSHALL_n USE modd_precision, ONLY: MNHTIME @@ -151,11 +147,8 @@ IMPLICIT NONE INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. INTEGER, INTENT(IN) :: KRRI ! number of ice water var. -LOGICAL, INTENT(IN) :: OMF_FLX ! switch to write the - ! MF fluxes in the synchronous FM-file TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file REAL(kind=MNHTIME),DIMENSION(2), INTENT(OUT) :: PTIME_LES ! time spent in LES computations -REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height of flux point @@ -250,10 +243,10 @@ ZVMM=MYF(PVM) ! LSTATNW = .FALSE. ! -CALL SHALLOW_MF(YLDIMPHYEXPACK, CST, NEB, PARAM_MFSHALLN, TURBN, CSTURB,& +CALL SHALLOW_MF(YLDIMPHYEXPACK, CST, NEBN, PARAM_MFSHALLN, TURBN, CSTURB,& KRR,KRRL,KRRI,ISV, & - CFRAC_ICE_SHALLOW_MF,LNOMIXLG,NSV_LGBEG,NSV_LGEND, & - PIMPL_MF, PTSTEP, & + LNOMIXLG,NSV_LGBEG,NSV_LGEND, & + PTSTEP, & PDZZ, PZZ, & PRHODJ,PRHODREF, & PPABSM, PEXN, & @@ -299,7 +292,7 @@ END DO ! !!! 4. Prints the fluxes in output file ! -IF ( OMF_FLX .AND. tpfile%lopened ) THEN +IF ( LMF_FLX .AND. tpfile%lopened ) THEN ! stores the conservative potential temperature vertical flux TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MF_THW_FLX', & diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90 index b592b2651..3511cd27f 100644 --- a/src/MNH/spawn_model2.f90 +++ b/src/MNH/spawn_model2.f90 @@ -291,7 +291,7 @@ USE MODI_GET_SIZEY_LB ! USE MODD_LIMA_PRECIP_SCAVENGING_n USE MODD_PARAM_LIMA, ONLY : MDEPOC=>LDEPOC, LSCAV -USE MODD_PARAM_ICE, ONLY : LDEPOSC +USE MODD_PARAM_ICE_n, ONLY : LDEPOSC USE MODD_PARAM_C2R2, ONLY : LDEPOC USE MODD_PASPOL, ONLY : LPASPOL ! diff --git a/src/MNH/to_elec_fieldn.f90 b/src/MNH/to_elec_fieldn.f90 index 3b078b656..a6822298d 100644 --- a/src/MNH/to_elec_fieldn.f90 +++ b/src/MNH/to_elec_fieldn.f90 @@ -73,7 +73,7 @@ END MODULE MODI_TO_ELEC_FIELD_n ! USE MODD_REF_n, ONLY : XRHODREF USE MODD_PARAMETERS, ONLY : JPVEXT -USE MODD_RAIN_ICE_DESCR, ONLY : XRTMIN +USE MODD_RAIN_ICE_DESCR_n, ONLY : XRTMIN USE MODD_ELEC_DESCR, ONLY : XRELAX_ELEC, XECHARGE USE MODD_ELEC_n, ONLY : XESOURCEFW ! diff --git a/src/MNH/two_wayn.f90 b/src/MNH/two_wayn.f90 index 5b361e3f9..b2299ee4a 100644 --- a/src/MNH/two_wayn.f90 +++ b/src/MNH/two_wayn.f90 @@ -123,7 +123,7 @@ USE MODD_PARAMETERS ! Declarative modules USE MODD_NESTING USE MODD_CONF USE MODD_NSV -USE MODD_PARAM_ICE, ONLY : LSEDIC +USE MODD_PARAM_ICE_n, ONLY : LSEDIC USE MODD_PARAM_C2R2, ONLY : LSEDC USE MODD_PARAM_LIMA, ONLY : NSEDC => LSEDC ! diff --git a/src/MNH/update_nsv.f90 b/src/MNH/update_nsv.f90 index 2ae37f91e..f54a72169 100644 --- a/src/MNH/update_nsv.f90 +++ b/src/MNH/update_nsv.f90 @@ -36,6 +36,7 @@ USE MODD_FIELD, ONLY: tfieldmetadata USE MODD_NSV USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX, NMNHNAMELGTMAX +USE MODE_LIMA_UPDATE_NSV, ONLY: LIMA_UPDATE_NSV use mode_msg IMPLICIT NONE @@ -46,6 +47,7 @@ CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVNAMES_TMP CHARACTER(LEN=6), DIMENSION(:,:), ALLOCATABLE :: YSV_TMP CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVCHEM_LIST_TMP INTEGER :: JI, JJ +INTEGER :: ISV TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE :: YSVLIST_TMP ! ! STOP if INI_NSV has not be called yet @@ -58,7 +60,10 @@ END IF ! ! Allocate/reallocate CSV_CHEM_LIST_A -IF ( .NOT. ALLOCATED( CSV_CHEM_LIST_A ) ) ALLOCATE( CSV_CHEM_LIST_A( NSV_CHEM_LIST_A(KMI), KMI) ) +IF ( .NOT. ALLOCATED( TNSV%CSV_CHEM_LIST_A ) ) THEN + ALLOCATE( TNSV%CSV_CHEM_LIST_A( NSV_CHEM_LIST_A(KMI), KMI) ) + CSV_CHEM_LIST_A => TNSV%CSV_CHEM_LIST_A +ENDIF !If CSV_CHEM_LIST_A is too small, enlarge it and transfer data IF ( SIZE( CSV_CHEM_LIST_A, 1 ) < NSV_CHEM_LIST_A(KMI) .OR. SIZE( CSV_CHEM_LIST_A, 2 ) < KMI ) THEN ALLOCATE( YSVCHEM_LIST_TMP( MAX( SIZE(CSV_CHEM_LIST_A,1), NSV_CHEM_LIST_A(KMI) ), MAX( SIZE(CSV_CHEM_LIST_A,2), KMI ) ) ) @@ -67,13 +72,17 @@ IF ( SIZE( CSV_CHEM_LIST_A, 1 ) < NSV_CHEM_LIST_A(KMI) .OR. SIZE( CSV_CHEM_LIST_ YSVCHEM_LIST_TMP(JI, JJ) = CSV_CHEM_LIST_A(JI, JJ) END DO END DO - CALL MOVE_ALLOC( FROM = YSVCHEM_LIST_TMP, TO = CSV_CHEM_LIST_A ) + CALL MOVE_ALLOC( FROM = YSVCHEM_LIST_TMP, TO = TNSV%CSV_CHEM_LIST_A ) + CSV_CHEM_LIST_A => TNSV%CSV_CHEM_LIST_A END IF CSV_CHEM_LIST => CSV_CHEM_LIST_A(:,KMI) ! Allocate/reallocate CSV_A -IF ( .NOT. ALLOCATED( CSV_A ) ) ALLOCATE( CSV_A( NSV_A(KMI), KMI) ) +IF ( .NOT. ALLOCATED( TNSV%CSV_A ) ) THEN + ALLOCATE( TNSV%CSV_A( NSV_A(KMI), KMI) ) + CSV_A => TNSV%CSV_A +ENDIF !If CSV_A is too small, enlarge it and transfer data IF ( SIZE( CSV_A, 1 ) < NSV_A(KMI) .OR. SIZE( CSV_A, 2 ) < KMI ) THEN ALLOCATE( YSV_TMP( MAX( SIZE(CSV_A,1), NSV_A(KMI) ), MAX( SIZE(CSV_A,2), KMI ) ) ) @@ -82,13 +91,17 @@ IF ( SIZE( CSV_A, 1 ) < NSV_A(KMI) .OR. SIZE( CSV_A, 2 ) < KMI ) THEN YSV_TMP(JI, JJ) = CSV_A(JI, JJ) END DO END DO - CALL MOVE_ALLOC( FROM = YSV_TMP, TO = CSV_A ) + CALL MOVE_ALLOC( FROM = YSV_TMP, TO = TNSV%CSV_A ) + CSV_A => TNSV%CSV_A END IF CSV => CSV_A(:,KMI) ! Allocate/reallocate TSVLIST_A -IF ( .NOT. ALLOCATED( TSVLIST_A ) ) ALLOCATE( TSVLIST_A( NSV_A(KMI), KMI) ) +IF ( .NOT. ALLOCATED( TNSV%TSVLIST_A ) ) THEN + ALLOCATE( TNSV%TSVLIST_A( NSV_A(KMI), KMI) ) + TSVLIST_A => TNSV%TSVLIST_A +ENDIF !If TSVLIST_A is too small, enlarge it and transfer data IF ( SIZE( TSVLIST_A, 1 ) < NSV_A(KMI) .OR. SIZE( TSVLIST_A, 2 ) < KMI ) THEN ALLOCATE( YSVLIST_TMP( MAX( SIZE(TSVLIST_A,1), NSV_A(KMI) ), MAX( SIZE(TSVLIST_A,2), KMI ) ) ) @@ -97,7 +110,8 @@ IF ( SIZE( TSVLIST_A, 1 ) < NSV_A(KMI) .OR. SIZE( TSVLIST_A, 2 ) < KMI ) THEN YSVLIST_TMP(JI, JJ) = TSVLIST_A(JI, JJ) END DO END DO - CALL MOVE_ALLOC( FROM = YSVLIST_TMP, TO = TSVLIST_A ) + CALL MOVE_ALLOC( FROM = YSVLIST_TMP, TO = TNSV%TSVLIST_A ) + TSVLIST_A => TNSV%TSVLIST_A END IF TSVLIST => TSVLIST_A(:,KMI) @@ -111,23 +125,8 @@ NSV_C1R3 = NSV_C1R3_A(KMI) NSV_C1R3BEG = NSV_C1R3BEG_A(KMI) NSV_C1R3END = NSV_C1R3END_A(KMI) ! -NSV_LIMA = NSV_LIMA_A(KMI) -NSV_LIMA_BEG = NSV_LIMA_BEG_A(KMI) -NSV_LIMA_END = NSV_LIMA_END_A(KMI) -NSV_LIMA_NC = NSV_LIMA_NC_A(KMI) -NSV_LIMA_NR = NSV_LIMA_NR_A(KMI) -NSV_LIMA_CCN_FREE = NSV_LIMA_CCN_FREE_A(KMI) -NSV_LIMA_CCN_ACTI = NSV_LIMA_CCN_ACTI_A(KMI) -NSV_LIMA_SCAVMASS = NSV_LIMA_SCAVMASS_A(KMI) -NSV_LIMA_NI = NSV_LIMA_NI_A(KMI) -NSV_LIMA_NS = NSV_LIMA_NS_A(KMI) -NSV_LIMA_NG = NSV_LIMA_NG_A(KMI) -NSV_LIMA_NH = NSV_LIMA_NH_A(KMI) -NSV_LIMA_IFN_FREE = NSV_LIMA_IFN_FREE_A(KMI) -NSV_LIMA_IFN_NUCL = NSV_LIMA_IFN_NUCL_A(KMI) -NSV_LIMA_IMM_NUCL = NSV_LIMA_IMM_NUCL_A(KMI) -NSV_LIMA_HOM_HAZE = NSV_LIMA_HOM_HAZE_A(KMI) -NSV_LIMA_SPRO = NSV_LIMA_SPRO_A(KMI) +ISV=-1 +CALL LIMA_UPDATE_NSV(LDINIT=.FALSE., KMI=KMI, KSV=ISV, CDCLOUD='LIMA', LDUPDATE=.TRUE.) ! NSV_ELEC = NSV_ELEC_A(KMI) NSV_ELECBEG = NSV_ELECBEG_A(KMI) diff --git a/src/MNH/ver_interp_field.f90 b/src/MNH/ver_interp_field.f90 index e380b7da0..d0092e917 100644 --- a/src/MNH/ver_interp_field.f90 +++ b/src/MNH/ver_interp_field.f90 @@ -88,7 +88,7 @@ END MODULE MODI_VER_INTERP_FIELD ! ------------ ! USE MODD_CONF_n, ONLY : CONF_MODEL -USE MODD_CTURB +USE MODD_TURB_n, ONLY: XTKEMIN USE MODD_PARAMETERS USE MODD_VER_INTERP_LIN ! diff --git a/src/MNH/write_desfmn.f90 b/src/MNH/write_desfmn.f90 index cb4330d88..908c2eff8 100644 --- a/src/MNH/write_desfmn.f90 +++ b/src/MNH/write_desfmn.f90 @@ -183,25 +183,25 @@ USE MODN_PARAM_n USE MODN_PARAM_RAD_n USE MODN_PARAM_ECRAD_n USE MODN_PARAM_KAFR_n -USE MODN_PARAM_MFSHALL_n -USE MODN_PARAM_ICE +USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN_INIT +USE MODD_PARAM_ICE_n, ONLY: PARAM_ICEN_INIT +USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_INIT USE MODN_CONF_n USE MODN_LUNIT_n USE MODN_LBC_n USE MODN_NUDGING_n -USE MODN_TURB_n +USE MODD_TURB_n, ONLY: TURBN_INIT +USE MODD_NEB_n, ONLY: NEBN_INIT USE MODN_BLANK_n USE MODN_FRC USE MODN_CH_MNHC_n USE MODN_CH_SOLVER_n USE MODN_PARAM_C2R2 USE MODN_PARAM_C1R3 -USE MODN_PARAM_LIMA USE MODN_ELEC USE MODN_SERIES USE MODN_SERIES_n USE MODN_TURB_CLOUD -USE MODN_TURB USE MODN_CH_ORILAM USE MODN_DUST USE MODN_SALT @@ -367,8 +367,7 @@ CALL INIT_NAM_PARAM_KAFRn IF(CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') & WRITE(UNIT=ILUSEG,NML=NAM_PARAM_KAFRn) ! -CALL INIT_NAM_PARAM_MFSHALLn -IF (CSCONV == 'EDKF' ) WRITE(UNIT=ILUSEG,NML=NAM_PARAM_MFSHALLn) +IF (CSCONV == 'EDKF' ) CALL PARAM_MFSHALLN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1) ! CALL INIT_NAM_LBCn WRITE(UNIT=ILUSEG,NML=NAM_LBCn) @@ -376,8 +375,9 @@ WRITE(UNIT=ILUSEG,NML=NAM_LBCn) CALL INIT_NAM_NUDGINGn WRITE(UNIT=ILUSEG,NML=NAM_NUDGINGn) ! -CALL INIT_NAM_TURBn -IF(CTURB /= 'NONE') WRITE(UNIT=ILUSEG,NML=NAM_TURBn) +IF(CTURB /= 'NONE') CALL TURBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1) +! +CALL NEBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1) ! CALL INIT_NAM_BLANKn WRITE(UNIT=ILUSEG,NML=NAM_BLANKn) @@ -457,15 +457,15 @@ IF(LBU_RSV) WRITE(UNIT=ILUSEG,NML=NAM_BU_RSV) IF(LLES_MEAN .OR. LLES_RESOLVED .OR. LLES_SUBGRID .OR. LLES_UPDRAFT & .OR. LLES_DOWNDRAFT .OR. LLES_SPECTRA) WRITE(UNIT=ILUSEG,NML=NAM_LES) IF(LFORCING .OR. LTRANS) WRITE(UNIT=ILUSEG,NML=NAM_FRC) -IF(CCLOUD(1:3) == 'ICE') WRITE(UNIT=ILUSEG,NML=NAM_PARAM_ICE) +IF(CCLOUD(1:3) == 'ICE') CALL PARAM_ICEN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1) IF(CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') & WRITE(UNIT=ILUSEG,NML=NAM_PARAM_C2R2) IF(CCLOUD == 'C3R5' ) WRITE(UNIT=ILUSEG,NML=NAM_PARAM_C1R3) -IF(CCLOUD == 'LIMA' ) WRITE(UNIT=ILUSEG,NML=NAM_PARAM_LIMA) +IF(CCLOUD == 'LIMA' ) CALL PARAM_LIMA_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1) IF(CELEC /= 'NONE') WRITE(UNIT=ILUSEG,NML=NAM_ELEC) IF(LSERIES) WRITE(UNIT=ILUSEG,NML=NAM_SERIES) -IF(NMODEL_CLOUD/=NUNDEF) WRITE(UNIT=ILUSEG,NML=NAM_TURB_CLOUD) -IF(CTURB /= 'NONE') WRITE(UNIT=ILUSEG,NML=NAM_TURB) +IF(CTURB /= 'NONE') CALL TURBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1) +CALL NEBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1) WRITE(UNIT=ILUSEG,NML=NAM_FLYERS) !Not possible (for the moment): arrays have been deallocated after ini_aircraft: WRITE(UNIT=ILUSEG,NML=NAM_AIRCRAFTS) !Not possible (for the moment): arrays have been deallocated after ini_balloon: WRITE(UNIT=ILUSEG,NML=NAM_BALLOONS) @@ -521,7 +521,7 @@ IF (NVERB >= 5) THEN WRITE(UNIT=ILUOUT,NML=NAM_PARAM_KAFRn) ! WRITE(UNIT=ILUOUT,FMT="('************ PARAM_MFSHALLn *******')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_MFSHALLn) + CALL PARAM_MFSHALLN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) ! WRITE(UNIT=ILUOUT,FMT="('********** LBCn ********************')") WRITE(UNIT=ILUOUT,NML=NAM_LBCn) @@ -530,7 +530,10 @@ IF (NVERB >= 5) THEN WRITE(UNIT=ILUOUT,NML=NAM_NUDGINGn) ! WRITE(UNIT=ILUOUT,FMT="('********** TURBn *******************')") - WRITE(UNIT=ILUOUT,NML=NAM_TURBn) + CALL TURBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) +! + WRITE(UNIT=ILUOUT,FMT="('********** NEBn *******************')") + CALL NEBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) ! WRITE(UNIT=ILUOUT,FMT="('********** CHEMICAL MONITORn *******')") WRITE(UNIT=ILUOUT,NML=NAM_CH_MNHCn) @@ -550,6 +553,9 @@ IF (NVERB >= 5) THEN WRITE(UNIT=ILUOUT,FMT="('********** BLANKn *****************************')") WRITE(UNIT=ILUOUT,NML=NAM_BLANKn) ! + WRITE(UNIT=ILUOUT,FMT="('************ ICE SCHEME ***********************')") + CALL PARAM_ICEN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) +! IF (KMI==1) THEN WRITE(UNIT=ILUOUT,FMT="(/,'PART OF SEGMENT FILE COMMON TO ALL THE MODELS')") WRITE(UNIT=ILUOUT,FMT="( '---------------------------------------------')") @@ -629,9 +635,6 @@ IF (NVERB >= 5) THEN ! WRITE(UNIT=ILUOUT,FMT="('************ FORCING **************************')") WRITE(UNIT=ILUOUT,NML=NAM_FRC) -! - WRITE(UNIT=ILUOUT,FMT="('************ ICE SCHEME ***********************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_ICE) ! WRITE(UNIT=ILUOUT,FMT="('********** DUST SCHEME ************************')") WRITE(UNIT=ILUOUT,NML=NAM_DUST) @@ -668,7 +671,7 @@ IF (NVERB >= 5) THEN ! IF( CCLOUD == 'LIMA' ) THEN WRITE(UNIT=ILUOUT,FMT="('*********** LIMA SCHEME *********************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_LIMA) + CALL PARAM_LIMA_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) END IF ! IF( CCLOUD == 'KHKO' ) THEN diff --git a/src/MNH/write_lesn.f90 b/src/MNH/write_lesn.f90 index 43a186a4f..44f915343 100644 --- a/src/MNH/write_lesn.f90 +++ b/src/MNH/write_lesn.f90 @@ -89,7 +89,7 @@ use modd_les use modd_les_n use modd_param_n, only: ccloud use modd_param_c2r2, only: ldepoc -use modd_param_ice, only: ldeposc +USE MODD_PARAM_ICE_n, only: ldeposc use modd_parameters, only: XUNDEF use mode_les_spec_n, only: Les_spec_n @@ -1150,12 +1150,14 @@ if ( nspectra_k > 0 ) then call Les_diachro_2pt_write( tpdiafile, XCORRi_WRi, XCORRj_WRi, 'WRI', 'W*ri 2 points correlations', 'm kg s-1 kg-1' ) end if +!PW: TODO: ameliorer le ygroup (tenir compte de ce qu'est la variable scalaire et pas juste son jsv!) do jsv = 1, nsv Write( ygroup, fmt = "( a2, i3.3 )" ) "SS", jsv call Les_diachro_2pt_write( tpdiafile, XCORRi_SvSv(:,:,:,JSV), XCORRj_SvSv(:,:,:,JSV), ygroup, & 'Sv*Sv 2 points correlations','kg2 kg-2' ) end do +!PW: TODO: ameliorer le ygroup (tenir compte de ce qu'est la variable scalaire et pas juste son jsv!) do jsv = 1, nsv Write( ygroup, fmt = "( a2, i3.3 )" ) "WS", jsv call Les_diachro_2pt_write( tpdiafile, XCORRi_WSv(:,:,:,JSV), XCORRj_WSv(:,:,:,JSV), ygroup, & diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90 index d55684efa..380dc9fd6 100644 --- a/src/MNH/write_lfifm1_for_diag_supp.f90 +++ b/src/MNH/write_lfifm1_for_diag_supp.f90 @@ -122,6 +122,7 @@ USE MODD_DIAG_FLAG, ONLY: CRAD_SAT, LCHEMDIAG, LCLD_COV, LCOARSE, LISOAL USE MODD_FIELD_n, ONLY: XCLDFR, XICEFR, XPABST, XSIGS, XTHT, XTKET, XRT, XUT, XVT, XWT USE MODD_GRID_n, ONLY: XZHAT, XZZ USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ +USE MODD_NEB_n, ONLY: LSIGMAS, LSUBG_COND, VSIGQSAT USE MODD_NSV, ONLY: NSV, NSV_CHEMBEG, NSV_CHEMEND, TSVLIST USE MODD_PARAMETERS, ONLY: JPVEXT, NUNDEF, XUNDEF USE MODD_PARAM_KAFR_n, ONLY: LCHTRANS @@ -134,7 +135,7 @@ USE MODD_RAD_TRANSF, ONLY: JPGEOST USE MODD_REF_n, ONLY: XRHODREF USE MODD_SALT, ONLY: LSALT USE MODD_TIME_n, ONLY: TDTCUR -USE MODD_TURB_n, ONLY: LSIGMAS, LSUBG_COND, VSIGQSAT +USE MODD_NEB_n, ONLY: LSIGMAS, LSUBG_COND, VSIGQSAT use mode_field, only: Find_field_id_from_mnhname USE MODE_IO_FIELD_WRITE, only: IO_Field_write diff --git a/src/MNH/xy_to_latlon.f90 b/src/MNH/xy_to_latlon.f90 index 865aaab7a..9effbed46 100644 --- a/src/MNH/xy_to_latlon.f90 +++ b/src/MNH/xy_to_latlon.f90 @@ -81,7 +81,7 @@ USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list USE MODE_MODELN_HANDLER, ONLY: GOTO_MODEL use MODE_SPLITTINGZ_ll ! -USE MODI_INI_CST +USE MODE_INI_CST, ONLY: INI_CST USE MODI_READ_HGRID ! USE MODN_CONFIO, ONLY: NAM_CONFIO diff --git a/src/MNH/yomhook.f90 b/src/MNH/yomhook.f90 index 56728430d..a0b84f764 100644 --- a/src/MNH/yomhook.f90 +++ b/src/MNH/yomhook.f90 @@ -5,6 +5,7 @@ MODULE YOMHOOK USE PARKIND1 ,ONLY : JPIM ,JPRB LOGICAL :: LHOOK=.FALSE. +INTEGER, PARAMETER :: JPHOOK=JPRB INTERFACE DR_HOOK MODULE PROCEDURE & DR_HOOK_DEFAULT, & diff --git a/src/MNH/zoom_pgd.f90 b/src/MNH/zoom_pgd.f90 index 5f8630d8d..2b50885c8 100644 --- a/src/MNH/zoom_pgd.f90 +++ b/src/MNH/zoom_pgd.f90 @@ -82,6 +82,7 @@ USE MODI_WRITE_PGD_SURF_ATM_N USE MODD_MNH_SURFEX_n ! USE MODN_CONFIO, ONLY : NAM_CONFIO +USE MODE_INI_CST, ONLY: INI_CST ! IMPLICIT NONE ! diff --git a/src/PHYEX/ext/advection_metsv.f90 b/src/PHYEX/ext/advection_metsv.f90 deleted file mode 100644 index 8473c5a3b..000000000 --- a/src/PHYEX/ext/advection_metsv.f90 +++ /dev/null @@ -1,719 +0,0 @@ -!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ########################### - MODULE MODI_ADVECTION_METSV -! ########################### -! -INTERFACE - SUBROUTINE ADVECTION_METSV (TPFILE, HUVW_ADV_SCHEME, & - HMET_ADV_SCHEME,HSV_ADV_SCHEME, HCLOUD, KSPLIT, & - OSPLIT_CFL, PSPLIT_CFL, OCFL_WRIT, & - HLBCX, HLBCY, KRR, KSV, TPDTCUR, PTSTEP, & - PUT, PVT, PWT, PTHT, PRT, PTKET, PSVT, PPABST, & - PTHVREF, PRHODJ, PDXX, PDYY, PDZZ, PDZX, PDZY, & - PRTHS, PRRS, PRTKES, PRSVS, & - PRTHS_CLD, PRRS_CLD, PRSVS_CLD, PRTKES_ADV ) -! -USE MODD_IO, ONLY: TFILEDATA -USE MODD_TYPE_DATE, ONLY: DATE_TIME -! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -CHARACTER(LEN=6), INTENT(IN) :: HMET_ADV_SCHEME, & ! Control of the - HSV_ADV_SCHEME, & ! scheme applied - HUVW_ADV_SCHEME -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of cloud parameterization -! -INTEGER, INTENT(INOUT):: KSPLIT ! Number of time splitting - ! for PPM advection -LOGICAL, INTENT(IN) :: OSPLIT_CFL ! flag to automatically chose number of iterations -REAL, INTENT(IN) :: PSPLIT_CFL ! maximum CFL to automatically chose number of iterations -LOGICAL, INTENT(IN) :: OCFL_WRIT ! flag to write CFL fields in output files -! -CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -! -TYPE (DATE_TIME), INTENT(IN) :: TPDTCUR ! current date and time -REAL, INTENT(IN) :: PTSTEP -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT , PVT , PWT -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT, PTKET, PRHODJ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT , PSVT - ! Variables at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Temperature - ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX,PDZY - ! metric coefficients -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS, PRTKES -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS , PRSVS - ! Sources terms -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRTHS_CLD -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRRS_CLD,PRSVS_CLD -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRTKES_ADV ! Advection TKE source term -! -END SUBROUTINE ADVECTION_METSV -! -END INTERFACE -! -END MODULE MODI_ADVECTION_METSV -! ########################################################################## - SUBROUTINE ADVECTION_METSV (TPFILE, HUVW_ADV_SCHEME, & - HMET_ADV_SCHEME,HSV_ADV_SCHEME, HCLOUD, KSPLIT, & - OSPLIT_CFL, PSPLIT_CFL, OCFL_WRIT, & - HLBCX, HLBCY, KRR, KSV, TPDTCUR, PTSTEP, & - PUT, PVT, PWT, PTHT, PRT, PTKET, PSVT, PPABST, & - PTHVREF, PRHODJ, PDXX, PDYY, PDZZ, PDZX, PDZY, & - PRTHS, PRRS, PRTKES, PRSVS, & - PRTHS_CLD, PRRS_CLD, PRSVS_CLD, PRTKES_ADV ) -! ########################################################################## -! -!!**** *ADVECTION_METSV * - routine to call the specialized advection routines -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to control the advection routines. -!! For that, it is first necessary to compute the metric coefficients -!! and the contravariant components of the momentum. -!! -!!** METHOD -!! ------ -!! Once the scheme is selected, it is applied to the following group of -!! variables: METeorologicals (temperature, water substances, TKE, -!! dissipation TKE) and Scalar Variables. It is possible to select different -!! advection schemes for each group of variables. -!! -!! EXTERNAL -!! -------- -!! CONTRAV : computes the contravariant components. -!! ADVECUVW : computes the advection terms for momentum. -!! ADVECSCALAR : computes the advection terms for scalar fields. -!! ADD3DFIELD_ll : add a field to 3D-list -!! ADVEC_4TH_ORDER : 4th order advection scheme -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! Book1 and book2 ( routine ADVECTION ) -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * Laboratoire d'Aerologie* -!! J.-P. Lafore * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 06/07/94 -!! 01/04/95 (Ph. Hereil J. Nicolau) add the model number -!! 23/10/95 (J. Vila and JP Lafore) advection schemes scalar -!! 16/01/97 (JP Pinty) change presentation -!! 30/04/98 (J. Stein P Jabouille) extrapolation for the cyclic -!! case and parallelisation -!! 24/06/99 (P Jabouille) case of NHALO>1 -!! 25/10/05 (JP Pinty) 4th order scheme -!! 24/04/06 (C.Lac) Split scalar and passive -!! tracer routines -!! 08/06 (T.Maric) PPM scheme -!! 04/2011 (V.Masson & C. Lac) splits the routine and add time splitting -!! 04/2014 (C.Lac) adaptation of time -!! splitting for L1D and L2D -!! 09/2014 (G.Delautier) close OUTPUT_LISTING before STOP -!! 04/2015 (J.Escobar) remove/commente some NHALO=1 test -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! J.Escobar : 01/10/2015 : add computation of CFL for L1D case -!! 04/2016 (C.Lac) : correction of negativity for KHKO -!! 10/2016 (C.Lac) Correction on the flag for Strang splitting -!! to insure reproducibility between START and RESTA -! V. Vionnet 07/2017: add advection of 2D variables at the surface for the blowing snow scheme -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 02/2020: use the new data structures and subroutines for budgets -! B. Vie 03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! P. Wautelet 11/06/2020: bugfix: correct PRSVS array indices -! P. Wautelet + Benoît Vié 06/2020: improve removal of negative scalar variables + adapt the corresponding budgets -! P. Wautelet 30/06/2020: move removal of negative scalar variables to Sources_neg_correct -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -use modd_budget, only: lbudget_th, lbudget_tke, lbudget_rv, lbudget_rc, & - lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv, & - NBUDGET_TH, NBUDGET_TKE, NBUDGET_RV, NBUDGET_RC, & - NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & - tbudgets -USE MODD_CST -USE MODD_TURB_n, ONLY: XTKEMIN -USE MODD_CONF, ONLY: LNEUTRAL,NHALO,L1D, L2D -use modd_field, only: tfieldmetadata, TYPEREAL -USE MODD_IBM_PARAM_n, ONLY: LIBM,XIBM_LS,XIBM_EPSI -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_NSV -USE MODD_PARAM_LIMA -USE MODD_PARAM_n -USE MODD_TYPE_DATE, ONLY: DATE_TIME -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n -USE MODD_PARAMETERS -USE MODD_REF_n, ONLY: XRHODJ,XRHODREF -! -use mode_budget, only: Budget_store_init, Budget_store_end -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -USE MODE_ll -USE MODE_MSG -use mode_sources_neg_correct, only: Sources_neg_correct -! -USE MODI_ADV_BOUNDARIES -USE MODI_CONTRAV -USE MODI_GET_HALO -USE MODI_PPM_RHODJ -USE MODI_PPM_MET -USE MODI_PPM_SCALAR -! -! -!------------------------------------------------------------------------------- -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -CHARACTER(LEN=6), INTENT(IN) :: HMET_ADV_SCHEME, & ! Control of the - HSV_ADV_SCHEME, & ! scheme applied - HUVW_ADV_SCHEME -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of cloud parameterization -! -INTEGER, INTENT(INOUT):: KSPLIT ! Number of time splitting - ! for PPM advection -LOGICAL, INTENT(IN) :: OSPLIT_CFL ! flag to automatically chose number of iterations -REAL, INTENT(IN) :: PSPLIT_CFL ! maximum CFL to automatically chose number of iterations -LOGICAL, INTENT(IN) :: OCFL_WRIT ! flag to write CFL fields in output files -! -CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -! -TYPE (DATE_TIME), INTENT(IN) :: TPDTCUR ! current date and time -REAL, INTENT(IN) :: PTSTEP -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT , PVT , PWT -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT, PTKET, PRHODJ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT , PSVT - ! Variables at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Temperature - ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX,PDZY - ! metric coefficients -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS, PRTKES -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS , PRSVS - ! Sources terms -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRTHS_CLD -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRRS_CLD, PRSVS_CLD -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRTKES_ADV ! Advection TKE source term -! -! -!* 0.2 declarations of local variables -! -! -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRUCPPM -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRVCPPM -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRWCPPM - ! contravariant - ! components - ! of momentum -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZCFLU -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZCFLV -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZCFLW -! ! CFL numbers on each direction -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZCFL -! ! CFL number -! -REAL :: ZCFLU_MAX, ZCFLV_MAX, ZCFLW_MAX, ZCFL_MAX ! maximum CFL numbers -! -REAL, DIMENSION(SIZE(PTHT,1), SIZE(PTHT,2), SIZE(PTHT,3) ) :: ZTH -REAL, DIMENSION(SIZE(PTKET,1),SIZE(PTKET,2),SIZE(PTKET,3)) :: ZTKE -REAL, DIMENSION(SIZE(PTHT,1), SIZE(PTHT,2), SIZE(PTHT,3) ) :: ZRTHS_OTHER -REAL, DIMENSION(SIZE(PTKET,1),SIZE(PTKET,2),SIZE(PTKET,3)) :: ZRTKES_OTHER -REAL, DIMENSION(SIZE(PTHT,1), SIZE(PTHT,2), SIZE(PTHT,3) ) :: ZRTHS_PPM -REAL, DIMENSION(SIZE(PTKET,1),SIZE(PTKET,2),SIZE(PTKET,3)) :: ZRTKES_PPM -REAL, DIMENSION(SIZE(PRT,1), SIZE(PRT,2), SIZE(PRT,3), SIZE(PRT,4) ) :: ZR -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),SIZE(PSVT,4)) :: ZSV -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3), NBLOWSNOW_2D) :: ZSNWC -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3), NBLOWSNOW_2D) :: ZSNWC_INIT -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3), NBLOWSNOW_2D) :: ZRSNWCS -! Guess at the sub time step -REAL, DIMENSION(SIZE(PRT,1), SIZE(PRT,2), SIZE(PRT,3), SIZE(PRT,4) ) :: ZRRS_OTHER -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),SIZE(PSVT,4)) :: ZRSVS_OTHER -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),NBLOWSNOW_2D) :: ZRSNWCS_OTHER -! Tendencies since the beginning of the time step -REAL, DIMENSION(SIZE(PRT,1), SIZE(PRT,2), SIZE(PRT,3), SIZE(PRT,4) ) :: ZRRS_PPM -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),SIZE(PSVT,4)) :: ZRSVS_PPM -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),NBLOWSNOW_2D) :: ZRSNWCS_PPM -! Guess at the end of the sub time step -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOX1,ZRHOX2 -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOY1,ZRHOY2 -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOZ1,ZRHOZ2 -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZT,ZEXN,ZLV,ZLS,ZCPH,ZCOR -! Temporary advected rhodj for PPM routines -! -INTEGER :: JS,JR,JSV,JSPL, JI, JJ ! Loop index -REAL :: ZTSTEP_PPM ! Sub Time step -LOGICAL :: GTKE -! -INTEGER :: IINFO_ll ! return code of parallel routine -TYPE(LIST_ll), POINTER :: TZFIELDS0_ll ! list of fields to exchange -TYPE(LIST_ll), POINTER :: TZFIELDS1_ll ! list of fields to exchange -! -! -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: ILUOUT ! logical unit -INTEGER :: ISPLIT_PPM ! temporal time splitting -INTEGER :: IIB, IIE, IJB, IJE,IKB,IKE -TYPE(TFIELDMETADATA) :: TZFIELD -!------------------------------------------------------------------------------- -! -!* 0. INITIALIZATION -! -------------- - -GTKE=(SIZE(PTKET)/=0) - -if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH ), 'ADV', prths (:, :, :) ) -if ( lbudget_tke ) call Budget_store_init( tbudgets(NBUDGET_TKE), 'ADV', prtkes(:, :, :) ) -if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV ), 'ADV', prrs (:, :, :, 1) ) -if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC ), 'ADV', prrs (:, :, :, 2) ) -if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR ), 'ADV', prrs (:, :, :, 3) ) -if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI ), 'ADV', prrs (:, :, :, 4) ) -if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS ), 'ADV', prrs (:, :, :, 5) ) -if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG ), 'ADV', prrs (:, :, :, 6) ) -if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH ), 'ADV', prrs (:, :, :, 7) ) -if ( lbudget_sv) then - do jsv = 1, ksv - call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv ), 'ADV', prsvs(:, :, :, jsv) ) - end do -end if - -ILUOUT = TLUOUT%NLU -! -CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) -IKB=1+JPVEXT -IKE=SIZE(PSVT,3) - JPVEXT -! -IF(LBLOWSNOW) THEN ! Put 2D Canopy blowing snow variables into a 3D array for advection - ZSNWC_INIT = 0. - ZRSNWCS = 0. - - DO JSV=1,(NBLOWSNOW_2D) - ZSNWC_INIT(:,:,IKB,JSV) = XSNWCANO(:,:,JSV) - ZRSNWCS(:,:,IKB,JSV) = XRSNWCANOS(:,:,JSV) - END DO -ENDIF -! -! -!------------------------------------------------------------------------------- -! -!* 2. COMPUTES THE CONTRAVARIANT COMPONENTS (FOR PPM ONLY) -! -------------------------------------- -! -!* 2.1 computes contravariant components -! -IF (HUVW_ADV_SCHEME=='CEN2ND' ) THEN - CALL CONTRAV (HLBCX,HLBCY,PUT,PVT,PWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCPPM,ZRVCPPM,ZRWCPPM,2) -ELSE - CALL CONTRAV (HLBCX,HLBCY,PUT,PVT,PWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCPPM,ZRVCPPM,ZRWCPPM,4) -END IF -! -! -!* 2.2 computes CFL numbers -! - -IF (.NOT. L1D) THEN - ZCFLU = 0.0 ; ZCFLV = 0.0 ; ZCFLW = 0.0 - ZCFLU(IIB:IIE,IJB:IJE,:) = ABS(ZRUCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP) - ZCFLV(IIB:IIE,IJB:IJE,:) = ABS(ZRVCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP) - ZCFLW(IIB:IIE,IJB:IJE,:) = ABS(ZRWCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP) - IF (LIBM) THEN - ZCFLU(IIB:IIE,IJB:IJE,:) = ZCFLU(IIB:IIE,IJB:IJE,:)*(1.-exp(-(XIBM_LS(IIB:IIE,IJB:IJE,:,2)/& - (XRHODJ(IIB:IIE,IJB:IJE,:)/XRHODREF(IIB:IIE,IJB:IJE,:))**(1./3.))**2.)) - ZCFLV(IIB:IIE,IJB:IJE,:) = ZCFLV(IIB:IIE,IJB:IJE,:)*(1.-exp(-(XIBM_LS(IIB:IIE,IJB:IJE,:,3)/& - (XRHODJ(IIB:IIE,IJB:IJE,:)/XRHODREF(IIB:IIE,IJB:IJE,:))**(1./3.))**2.)) - ZCFLW(IIB:IIE,IJB:IJE,:) = ZCFLW(IIB:IIE,IJB:IJE,:)*(1.-exp(-(XIBM_LS(IIB:IIE,IJB:IJE,:,4)/& - (XRHODJ(IIB:IIE,IJB:IJE,:)/XRHODREF(IIB:IIE,IJB:IJE,:))**(1./3.))**2.)) - WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,2).GT.(-XIBM_EPSI)) ZCFLU(IIB:IIE,IJB:IJE,:)=0. - WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,3).GT.(-XIBM_EPSI)) ZCFLV(IIB:IIE,IJB:IJE,:)=0. - WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,4).GT.(-XIBM_EPSI)) ZCFLW(IIB:IIE,IJB:IJE,:)=0. - ENDIF - IF (.NOT. L2D) THEN - ZCFL = SQRT(ZCFLU**2+ZCFLV**2+ZCFLW**2) - ELSE - ZCFL = SQRT(ZCFLU**2+ZCFLW**2) - END IF -ELSE - ZCFLU = 0.0 ; ZCFLV = 0.0 ; ZCFLW = 0.0 - ZCFLW(IIB:IIE,IJB:IJE,:) = ABS(ZRWCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP) - ZCFL = SQRT(ZCFLW**2) -END IF -! -!* prints in the file the 3D Courant numbers (one should flag this) -! -IF ( tpfile%lopened .AND. OCFL_WRIT .AND. (.NOT. L1D) ) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'CFLU', & - CSTDNAME = '', & - CLONGNAME = 'CFLU', & - CUNITS = '1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_CFLU', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZCFLU) -! - IF (.NOT. L2D) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'CFLV', & - CSTDNAME = '', & - CLONGNAME = 'CFLV', & - CUNITS = '1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_CFLV', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZCFLV) - END IF -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'CFLW', & - CSTDNAME = '', & - CLONGNAME = 'CFLW', & - CUNITS = '1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_CFLW', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZCFLW) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'CFL', & - CSTDNAME = '', & - CLONGNAME = 'CFL', & - CUNITS = '1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_CFL', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZCFL) -END IF -! -!* prints in the output file the maximum CFL -! -ZCFLU_MAX = MAX_ll(ZCFLU,IINFO_ll) -ZCFLV_MAX = MAX_ll(ZCFLV,IINFO_ll) -ZCFLW_MAX = MAX_ll(ZCFLW,IINFO_ll) -ZCFL_MAX = MAX_ll(ZCFL,IINFO_ll) -! -WRITE(ILUOUT,FMT='(A24,F10.2,A5,F10.2,A5,F10.2,A9,F10.2)') & - 'Max. CFL number for U : ',ZCFLU_MAX, & - ' V : ',ZCFLV_MAX,' W : ', ZCFLW_MAX,& - 'global : ',ZCFL_MAX -! -! -!* 2.3 updates time step splitting loop -! -IF (OSPLIT_CFL .AND. (.NOT.L1D) ) THEN -! - ISPLIT_PPM = INT(ZCFL_MAX/PSPLIT_CFL)+1 - IF ( KSPLIT /= ISPLIT_PPM ) & - WRITE(ILUOUT,FMT='(A37,I2,A4,I2,A11)') & - 'PPM time spliting loop changed from ', & - KSPLIT,' to ',ISPLIT_PPM, ' iterations' -! - KSPLIT = ISPLIT_PPM -! -END IF -! --------------------------------------------------------------- -IF (( (ZCFLU_MAX>=3.) .AND. (.NOT.L1D) ) .OR. & - ( (ZCFLV_MAX>=3.) .AND. (.NOT.L1D) .AND. (.NOT.L2D) ) .OR. & - ( (ZCFLW_MAX>=8.) .AND. (.NOT.L1D) ) ) THEN - WRITE(ILUOUT,*) ' ' - WRITE(ILUOUT,*) ' +---------------------------------------------------+' - WRITE(ILUOUT,*) ' | MODEL ERROR |' - WRITE(ILUOUT,*) ' +---------------------------------------------------+' - WRITE(ILUOUT,*) ' | |' - WRITE(ILUOUT,*) ' | The model wind speed becomes too high |' - WRITE(ILUOUT,*) ' | |' - IF ( ZCFLU_MAX>=3. .OR. ZCFLV_MAX>=3. ) & - WRITE(ILUOUT,*) ' | The horizontal CFL value reaches 3. or more |' - IF ( ZCFLW_MAX>=8. ) & - WRITE(ILUOUT,*) ' | The vertical CFL value reaches 8. or more |' - WRITE(ILUOUT,*) ' | |' - WRITE(ILUOUT,*) ' | This can be due either to : |' - WRITE(ILUOUT,*) ' | - a numerical explosion of the model |' - WRITE(ILUOUT,*) ' | - or a too high wind speed for an |' - WRITE(ILUOUT,*) ' | acceptable accuracy of the advection |' - WRITE(ILUOUT,*) ' | |' - WRITE(ILUOUT,*) ' | Please decrease your time-step |' - WRITE(ILUOUT,*) ' | |' - WRITE(ILUOUT,*) ' +---------------------------------------------------+' - WRITE(ILUOUT,*) ' ' - WRITE(ILUOUT,*) ' +---------------------------------------------------+' - WRITE(ILUOUT,*) ' | MODEL STOPS |' - WRITE(ILUOUT,*) ' +---------------------------------------------------+' - CALL PRINT_MSG(NVERB_FATAL,'GEN','ADVECTION_METSV','') -END IF -! -! -ZTSTEP_PPM = PTSTEP / REAL(KSPLIT) -! -! -!* 2.4 normalized contravariant components for split PPM time-step -! -ZRUCPPM = ZRUCPPM*ZTSTEP_PPM -ZRVCPPM = ZRVCPPM*ZTSTEP_PPM -ZRWCPPM = ZRWCPPM*ZTSTEP_PPM -! -! -!------------------------------------------------------------------------------- -! -! -!* 3. COMPUTES THE TENDENCIES SINCE THE BEGINNING OF THE TIME STEP -! ------------------------------------------------------------ -! -!* This represent the effects of all OTHER processes -! Clouds related processes from previous time-step are taken into account in PRTHS_CLD -! Advection related processes from previous time-step will be taken into account in ZRTHS_PPM -! -ZRTHS_OTHER = PRTHS - PTHT * PRHODJ / PTSTEP -IF (GTKE) ZRTKES_OTHER = PRTKES - PTKET * PRHODJ / PTSTEP -DO JR = 1, KRR - ZRRS_OTHER(:,:,:,JR) = PRRS(:,:,:,JR) - PRT(:,:,:,JR) * PRHODJ(:,:,:) / PTSTEP -END DO -DO JSV = 1, KSV - ZRSVS_OTHER(:,:,:,JSV) = PRSVS(:,:,:,JSV) - PSVT(:,:,:,JSV) * PRHODJ / PTSTEP -END DO -IF(LBLOWSNOW) THEN - DO JSV = 1, (NBLOWSNOW_2D) - ZRSNWCS_OTHER(:,:,:,JSV) = ZRSNWCS(:,:,:,JSV) - ZSNWC_INIT(:,:,:,JSV) * PRHODJ / PTSTEP - END DO -ENDIF -! -! Top and bottom Boundaries -! -CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZRTHS_OTHER) -IF (GTKE) CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZRTKES_OTHER) -DO JR = 1, KRR - CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZRRS_OTHER(:,:,:,JR)) -END DO -DO JSV = 1, KSV - CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZRSVS_OTHER(:,:,:,JSV)) -END DO -IF(LBLOWSNOW) THEN - DO JSV = 1, (NBLOWSNOW_2D) - CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZRSNWCS_OTHER(:,:,:,JSV)) - END DO -END IF -! -! Exchanges on processors -! -NULLIFY(TZFIELDS0_ll) -!!$IF(NHALO == 1) THEN - CALL ADD3DFIELD_ll( TZFIELDS0_ll, ZRTHS_OTHER, 'ADVECTION_METSV::ZRTHS_OTHER' ) - IF (GTKE) CALL ADD3DFIELD_ll( TZFIELDS0_ll, ZRTKES_OTHER, 'ADVECTION_METSV::ZRTKES_OTHER' ) - IF ( KRR>0 ) CALL ADD4DFIELD_ll( TZFIELDS0_ll, ZRRS_OTHER(:,:,:,1:KRR), 'ADVECTION_METSV::ZRRS_OTHER' ) - IF ( KSV>0 ) CALL ADD4DFIELD_ll( TZFIELDS0_ll, ZRSVS_OTHER(:,:,:,1:KSV), 'ADVECTION_METSV::ZRSVS_OTHER' ) - IF(LBLOWSNOW) CALL ADD4DFIELD_ll( TZFIELDS0_ll, ZRSNWCS_OTHER(:,:,:,1:NBLOWSNOW_2D), 'ADVECTION_METSV::ZRSNWCS_OTHER' ) - CALL UPDATE_HALO_ll(TZFIELDS0_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS0_ll) -!!$END IF -! -! - -!------------------------------------------------------------------------------- -! -!* 4. CALLS THE PPM ADVECTION INSIDE A TIME SPLITTING -! -------------------------------------- -! -CALL PPM_RHODJ(HLBCX,HLBCY, ZRUCPPM, ZRVCPPM, ZRWCPPM, & - ZTSTEP_PPM, PRHODJ, ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2, & - ZRHOZ1, ZRHOZ2 ) -! -!* values of the fields at the beginning of the time splitting loop -ZTH = PTHT -ZTKE = PTKET -IF (KRR /=0 ) ZR = PRT -IF (KSV /=0 ) ZSV = PSVT -IF(LBLOWSNOW) THEN - DO JSV = 1, (NBLOWSNOW_2D) - ZSNWC(:,:,:,JSV) = ZRSNWCS(:,:,:,JSV)* PTSTEP/ PRHODJ - CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZSNWC(:,:,:,JSV)) - END DO - ZSNWC_INIT=ZSNWC -ENDIF -! -IF (GTKE) PRTKES_ADV(:,:,:) = 0. -! -!* time splitting loop -DO JSPL=1,KSPLIT -! - !ZRTHS_PPM(:,:,:) = 0. - !ZRTKES_PPM(:,:,:) = 0. - !IF (KRR /=0) ZRRS_PPM(:,:,:,:) = 0. - !IF (KSV /=0) ZRSVS_PPM(:,:,:,:) = 0. -! - IF (LNEUTRAL) ZTH=ZTH-PTHVREF !* To be removed with the new PPM scheme ? - CALL PPM_MET (HLBCX,HLBCY, KRR, TPDTCUR,ZRUCPPM, ZRVCPPM, ZRWCPPM, PTSTEP,ZTSTEP_PPM, & - PRHODJ, ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2, ZRHOZ1, ZRHOZ2, & - ZTH, ZTKE, ZR, ZRTHS_PPM, ZRTKES_PPM, ZRRS_PPM, HMET_ADV_SCHEME) - IF (LNEUTRAL) ZTH=ZTH+PTHVREF !* To be removed with the new PPM scheme ? -! - CALL PPM_SCALAR (HLBCX,HLBCY, KSV, TPDTCUR, ZRUCPPM, ZRVCPPM, ZRWCPPM, PTSTEP, & - ZTSTEP_PPM, PRHODJ, ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2, ZRHOZ1, ZRHOZ2, & - ZSV, ZRSVS_PPM, HSV_ADV_SCHEME ) -! -! Tendencies of PPM -! - PRTHS(:,:,:) = PRTHS (:,:,:) + ZRTHS_PPM (:,:,:) / KSPLIT - IF (GTKE) PRTKES_ADV(:,:,:) = PRTKES_ADV(:,:,:) + ZRTKES_PPM(:,:,:) / KSPLIT - IF (KRR /=0) PRRS (:,:,:,:) = PRRS (:,:,:,:) + ZRRS_PPM (:,:,:,:) / KSPLIT - IF (KSV /=0 ) PRSVS (:,:,:,:) = PRSVS (:,:,:,:) + ZRSVS_PPM (:,:,:,:) / KSPLIT -! - IF (JSPL<KSPLIT) THEN -! -! Guesses of the field inside the time splitting loop -! - ZTH = ZTH + ( ZRTHS_PPM(:,:,:) + ZRTHS_OTHER(:,:,:) + PRTHS_CLD(:,:,:)) * & - ZTSTEP_PPM / PRHODJ(:,:,:) - IF (GTKE) ZTKE = ZTKE + ( ZRTKES_PPM(:,:,:) + ZRTKES_OTHER(:,:,:) ) * ZTSTEP_PPM / PRHODJ(:,:,:) - DO JR = 1, KRR - ZR(:,:,:,JR) = ZR(:,:,:,JR) + ( ZRRS_PPM(:,:,:,JR) + ZRRS_OTHER(:,:,:,JR) + PRRS_CLD(:,:,:,JR) ) & - * ZTSTEP_PPM / PRHODJ(:,:,:) - END DO - DO JSV = 1, KSV - ZSV(:,:,:,JSV) = ZSV(:,:,:,JSV) + ( ZRSVS_PPM(:,:,:,JSV) + ZRSVS_OTHER(:,:,:,JSV) + & - PRSVS_CLD(:,:,:,JSV) ) * ZTSTEP_PPM / PRHODJ(:,:,:) - END DO -! -! Top and bottom Boundaries and LBC for the guesses -! - CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZTH, PTHT ) - IF (GTKE) CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZTKE, PTKET) - DO JR = 1, KRR - CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZR(:,:,:,JR), PRT(:,:,:,JR)) - END DO - DO JSV = 1, KSV - CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZSV(:,:,:,JSV), PSVT(:,:,:,JSV)) - END DO - - IF(LBLOWSNOW) THEN ! Advection of Canopy mass at the 1st atmospheric level - ZRSNWCS_PPM(:,:,:,:) = 0. - ! - - CALL PPM_SCALAR (HLBCX,HLBCY, NBLOWSNOW_2D, TPDTCUR, ZRUCPPM, ZRVCPPM, ZRWCPPM,PTSTEP, & - ZTSTEP_PPM, PRHODJ, ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2, ZRHOZ1, ZRHOZ2, & - ZSNWC, ZRSNWCS_PPM, HSV_ADV_SCHEME) - - -! Tendencies of PPM - ZRSNWCS(:,:,:,:) = ZRSNWCS(:,:,:,:) + ZRSNWCS_PPM (:,:,:,:) / KSPLIT -! Guesses of the field inside the time splitting loop - DO JSV = 1, ( NBLOWSNOW_2D) - ZSNWC(:,:,:,JSV) = ZSNWC(:,:,:,JSV) + ZRSNWCS_PPM(:,:,:,JSV)*ZTSTEP_PPM/ PRHODJ(:,:,:) - END DO - -! Top and bottom Boundaries and LBC for the guesses - DO JSV = 1, (NBLOWSNOW_2D) - CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZSNWC(:,:,:,JSV), ZSNWC_INIT(:,:,:,JSV)) - END DO - END IF -! -! Exchanges fields between processors -! - NULLIFY(TZFIELDS1_ll) -!!$ IF(NHALO == 1) THEN - CALL ADD3DFIELD_ll( TZFIELDS1_ll, ZTH, 'ZTH' ) - IF (GTKE) CALL ADD3DFIELD_ll( TZFIELDS1_ll, ZTKE, 'ADVECTION_METSV::ZTKE' ) - IF ( KRR>0 ) CALL ADD4DFIELD_ll( TZFIELDS1_ll, ZR (:,:,:,1:KRR), 'ADVECTION_METSV::ZR' ) - IF ( KSV>0 ) CALL ADD4DFIELD_ll( TZFIELDS1_ll, ZSV(:,:,:,1:KSV), 'ADVECTION_METSV::ZSV' ) - IF ( LBLOWSNOW ) CALL ADD4DFIELD_ll( TZFIELDS1_ll, ZSNWC(:,:,:,1:NBLOWSNOW_2D), 'ADVECTION_METSV::ZSNWC' ) - CALL UPDATE_HALO_ll(TZFIELDS1_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS1_ll) -!!$ END IF - END IF -! -END DO -! -!------------------------------------------------------------------------------- -! -! TKE special case: advection is the last process for TKE -! -! TKE must be greater than its minimum value -! (previously done in tke_eps_sources) -! -IF (GTKE) THEN - PRTKES(:,:,:) = PRTKES(:,:,:) + PRTKES_ADV(:,:,:) - PRTKES(:,:,:) = MAX (PRTKES(:,:,:) , XTKEMIN * PRHODJ(:,:,:) / PTSTEP ) -END IF -! -! -!------------------------------------------------------------------------------- -! Update tendency for cano variables : from 3D to 2D -! -IF(LBLOWSNOW) THEN - - DO JSV=1,(NBLOWSNOW_2D) - DO JI=1,SIZE(PSVT,1) - DO JJ=1,SIZE(PSVT,2) - XRSNWCANOS(JI,JJ,JSV) = SUM(ZRSNWCS(JI,JJ,IKB:IKE,JSV)) - END DO - END DO - END DO -IF(LWEST_ll()) XRSNWCANOS(IIB,:,:) = ZRSNWCS(IIB,:,IKB,:) -IF(LEAST_ll()) XRSNWCANOS(IIE,:,:) = ZRSNWCS(IIE,:,IKB,:) -IF(LSOUTH_ll()) XRSNWCANOS(:,IJB,:) = ZRSNWCS(:,IJB,IKB,:) -IF(LNORTH_ll()) XRSNWCANOS(:,IJE,:) = ZRSNWCS(:,IJE,IKB,:) - -END IF -!------------------------------------------------------------------------------- -! -!* 5. BUDGETS -! ------- -! -if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH ), 'ADV', prths (:, :, :) ) -if ( lbudget_tke ) call Budget_store_end( tbudgets(NBUDGET_TKE), 'ADV', prtkes(:, :, :) ) -if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV ), 'ADV', prrs (:, :, :, 1) ) -if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC ), 'ADV', prrs (:, :, :, 2) ) -if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR ), 'ADV', prrs (:, :, :, 3) ) -if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI ), 'ADV', prrs (:, :, :, 4) ) -if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS ), 'ADV', prrs (:, :, :, 5) ) -if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG ), 'ADV', prrs (:, :, :, 6) ) -if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH ), 'ADV', prrs (:, :, :, 7) ) -if ( lbudget_sv) then - do jsv = 1, ksv - call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv ), 'ADV', prsvs(:, :, :, jsv) ) - end do -end if - -! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets -call Sources_neg_correct( hcloud, 'NEADV', krr, ptstep, ppabst, ptht, prt, prths, prrs, prsvs ) - -!------------------------------------------------------------------------------- -! -END SUBROUTINE ADVECTION_METSV diff --git a/src/PHYEX/ext/aer_effic.f90 b/src/PHYEX/ext/aer_effic.f90 deleted file mode 100644 index 7b91959ce..000000000 --- a/src/PHYEX/ext/aer_effic.f90 +++ /dev/null @@ -1,257 +0,0 @@ -!ORILAM_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier -!ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence -!ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!ORILAM_LIC for details. -! ######spl - MODULE MODI_AER_EFFIC -!! ######################## -!! -! -INTERFACE -!! -SUBROUTINE AER_EFFIC(PRG,PVGG, & !aerosol radius/fall speed (m/s) - PRHODREF, & !Air density - PMUW, PMU, & !mu water/air - PDPG, PEFC, & !diffusivity, efficiency - PRRS, & ! Rain water m.r. at time - KMODE, & ! Number of aerosol modes - PTEMP, PCOR, & ! air temp, cunningham corr factor - PDENSITY_AER, & ! aerosol density - PRR, PNT ) ! radius and number of rain drops -! -IMPLICIT NONE -REAL, DIMENSION(:,:), INTENT(IN) :: PRG, PVGG -REAL, DIMENSION(:), INTENT(IN) :: PRHODREF -REAL, DIMENSION(:,:), INTENT(IN) :: PDPG -REAL, DIMENSION(:), INTENT(IN) :: PMU, PMUW -REAL, DIMENSION(:,:), INTENT(INOUT) :: PEFC -REAL, DIMENSION(:), INTENT(IN) :: PRRS -REAL, DIMENSION(:), INTENT(IN) :: PTEMP -REAL, DIMENSION(:,:), INTENT(IN) :: PCOR -REAL, DIMENSION(:), INTENT(IN) :: PRR, PNT -INTEGER, INTENT(IN) :: KMODE -REAL, DIMENSION(:,:), INTENT(IN) :: PDENSITY_AER - - -END SUBROUTINE AER_EFFIC -!! -END INTERFACE -END MODULE MODI_AER_EFFIC -! ######spl -SUBROUTINE AER_EFFIC(PRG,PVGG, & !aerosol radius/fall speed (m/s) - PRHODREF, & !Air density - PMUW, PMU, & !mu water/air - PDPG, PEFC, & !diffusivity, efficiency - PRRT, & ! Rain water m.r. at time t - KMODE, & ! Number of aerosol modes - PTEMP, PCOR, & ! air temp, cunningham corr factor - PDENSITY_AER, & ! aerosol density - PRR, PNT ) ! radius and number of rain drops -!! ####################################### -!!**********AER_EFFIC********** -!! PURPOSE -!! ------- -!! Calculate the collection efficiency of -! a falling drop interacting with a dust aerosol -! for use with aer_wet_dep_kmt_warm.f90 -!! -!!** METHOD -!! ------ -!! Using basic theory, and the one dimensional variables sent -!! from aer_wet_dep_kmt_warm.f90, calculation of the average -!! fall speed calculations, chapter 17.3.4, MESONH Handbook -!! droplet number based on the Marshall_Palmer distribution -!! and Stokes number, Reynolds number, etc. based on theory -!! (S&P, p.1019) -!! -!! REFERENCE -!! --------- -!! Seinfeld and Pandis p.1019 -!! MESONH Handbook chapter 17.3.4 -!! -!! AUTHOR -!! ------ -!! K. Crahan Kaku / P. Tulet (CNRM/GMEI) -!! -!! MODIFICATIONS -!! ------------- -!! T. Hoarau (LACy) 15/05/17 add LIMA -!! Philippe Wautelet 28/05/2018: corrected truncated integer division (1/12 -> 1./12.) -!! P. Tulet and C. Barthe (LAERO) 15/01/22 correction for lima -!! -!----------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_RAIN_ICE_PARAM_n, ONLY : YFSEDR => XFSEDR, YEXSEDR => XEXSEDR -!++cb++ -!++th++ -USE MODD_RAIN_ICE_DESCR_n, ONLY : YCCR => XCCR, YLBR => XLBR, YLBEXR => XLBEXR, & - YCEXVT => XCEXVT -USE MODD_PARAM_LIMA_WARM, ONLY : WCCR => XCCR, WLBR => XLBR, WLBEXR => XLBEXR, & - XFSEDRR, XFSEDRC -USE MODD_PARAM_LIMA, ONLY : WCEXVT => XCEXVT, WFSEDR => XFSEDR, WFSEDC=>XFSEDC, & - XRTMIN -!--cb-- -USE MODD_PARAM_n, ONLY: CCLOUD -!--th-- -USE MODD_CST, ONLY : XPI, XRHOLW, XP00, XRD -USE MODD_PARAMETERS , ONLY : JPVEXT -USE MODD_REF, ONLY : XTHVREFZ -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -REAL, DIMENSION(:,:), INTENT(IN) :: PRG, PVGG -REAL, DIMENSION(:), INTENT(IN) :: PRHODREF -REAL, DIMENSION(:,:), INTENT(IN) :: PDPG -REAL, DIMENSION(:), INTENT(IN) :: PMU, PMUW -REAL, DIMENSION(:,:), INTENT(INOUT) :: PEFC -REAL, DIMENSION(:), INTENT(IN) :: PRRT -REAL, DIMENSION(:), INTENT(IN) :: PTEMP -REAL, DIMENSION(:), INTENT(IN) :: PRR, PNT -REAL, DIMENSION(:,:), INTENT(IN) :: PCOR -INTEGER, INTENT(IN) :: KMODE -REAL, DIMENSION(:,:), INTENT(IN) :: PDENSITY_AER -! -! -!* 0.2 declaration of local variables -! -INTEGER :: IKB ! Coordinates of the first physical - ! points along z -REAL :: ZRHO00 ! Surface reference air density -!viscosity ratio, Reynolds number -REAL, DIMENSION(SIZE(PRG,1)) :: ZOMG, ZREY -!rain radius, m, and rain fall speed, m/s; aerosol radius (m), -REAL, DIMENSION(SIZE(PRG,1)) :: ZRR, ZVR -!lambda, number concentration according to marshall palmer, -REAL, DIMENSION(SIZE(PRG,1)) :: ZNT, ZLBDA1 -!RHO_dref*r_r, Rain LWC -REAL, DIMENSION(SIZE(PRG,1)) :: RLWC -! schmidts number -REAL, DIMENSION(SIZE(PRG,1),KMODE) :: ZSCH -! -!Stokes number, ratio of diameters,aerosol radius -REAL, DIMENSION(SIZE(PRG,1),KMODE) :: ZSTO, ZPHI, ZRG -! S Star Term -REAL, DIMENSION(SIZE(PRG,1)) :: ZSTA, ZDIFF, ZTAU -! -!Term 1, Term 2, Term 3, Term 4 such that -! E = Term1 * Term 2 + Term 3 + Term 4 -REAL, DIMENSION(SIZE(PRG,1),KMODE) :: ZT1, ZT2 -REAL, DIMENSION(SIZE(PRG,1),KMODE) :: ZT3, ZT4 -! -INTEGER :: JI,JK -!++th++ -REAL :: KLBEXR, KLBR, KCEXVT, KCCR, ZFSEDR, ZBR, ZDR, ZEXSEDR -!--th-- -! -!----------------------------------------------------------------- -IKB = 1 + JPVEXT -ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB)) -ZRG(:,:) = PRG(:,:) * 1.E-6 !change units to meters -ZVR(:) = 0. - -SELECT CASE(CCLOUD) -CASE('ICE3') - KLBEXR = YLBEXR - KLBR = YLBR - KCEXVT = YCEXVT - KCCR = YCCR - ZFSEDR = YFSEDR - ZEXSEDR = YEXSEDR - -!Fall Speed calculations -!similar to rain_ice.f90, chapter 17.3.4, MESONH Handbook - ZVR(:) = ZFSEDR * PRRT(:)**(ZEXSEDR-1) * & - PRHODREF(:)**(ZEXSEDR-KCEXVT) - -CASE('LIMA') - KLBEXR = WLBEXR - KLBR = WLBR - KCEXVT = WCEXVT - KCCR = WCCR - ZFSEDR = XFSEDRR - ZBR = 3.0 - ZDR = 0.8 - ZEXSEDR = (ZBR + ZDR + 1.0) / (ZBR + 1.0) - WHERE (PRRT(:) > XRTMIN(3) .AND. PNT(:) > 0.) - ZLBDA1(:) = (KLBR * PNT(:) / PRRT(:))**KLBEXR - ZVR(:) = XFSEDRR * PRHODREF(:)**(1.-KCEXVT) * ZLBDA1(:)**(-ZDR) - END WHERE -END SELECT - - -!Fall speed cannot be faster than 7 m/s -ZVR(:) = MIN(ZVR(:), 7.) - -KCCR = 8.E6 - - -!Ref SEINFELD AND PANDIS p.1019 -! Viscosity Ratio -ZOMG(:) = PMUW(:) / PMU(:) -!!Reynolds number -ZREY(:) = PRR(:) * ZVR(:) * PRHODREF(:) / PMU(:) -ZREY(:) = MAX(ZREY(:), 1.E-2) -! -!S Star -ZSTA(:) = (1.2 + 1./12. * LOG(1.+ZREY(:))) / (1. + LOG(1.+ZREY(:))) - -PEFC(:,:) = 0.0 -! -DO JI = 1, KMODE -!Scmidts number - ZSCH(:,JI) = PMU(:) / PRHODREF(:) / PDPG(:,JI) -! -! Rain-Aerosol relative velocity - ZDIFF(:) = MAX(ZVR(:)-PVGG(:,JI), 0.) -! -! Relaxation time - ZTAU(:) = (ZRG(:,JI)*2.)**2. * PDENSITY_AER(:,JI) * PCOR(:,JI) / (18. * PMU(:)) -! -! Stockes number - ZSTO(:,JI) = ZTAU(:) * ZDIFF(:) / PRR(:) -! -!Ratio of diameters - ZPHI(:,JI) = ZRG(:,JI) / PRR(:) - ZPHI(:,JI) = MIN(ZPHI(:,JI), 1.) -! -!Term 1 - ZT1(:,JI) = 4.0 / ZREY(:) / ZSCH(:,JI) -! -!Term 2 - ZT2(:,JI) = 1.0 + 0.4 * ZREY(:)**(0.5) * ZSCH(:,JI)**(1./3.) + & - 0.16 * ZREY(:)**(0.5) * ZSCH(:,JI)**(0.5) -! -!Brownian diffusion - ZT1(:,JI) = ZT1(:,JI) * ZT2(:,JI) -! -!Term 3 - interception - ZT3(:,JI) = 4. * ZPHI(:,JI) * (1. / ZOMG(:) + & - (1.0 + 2.0 * ZREY(:)**0.5) * ZPHI(:,JI)) -! - ZT4(:,JI) = 0.0 -! - WHERE(ZSTO(:,JI) .GT. ZSTA(:)) -!Term 4 - impaction - ZT4(:,JI) = ((ZSTO(:,JI) - ZSTA(:)) / & - (ZSTO(:,JI) - ZSTA(:) + 2. / 3.))**(3./2.) * & - (XRHOLW / PDENSITY_AER(:,JI))**(1./2.) - - END WHERE -! -!Collision Efficiancy - PEFC(:,JI) = ZT1(:,JI) + ZT3(:,JI) + ZT4(:,JI) -! -! Physical radius of a rain collector droplet up than 20 um - WHERE (PRR(:) .LE. 20.E-6) - PEFC(:,JI) = 0. - END WHERE -ENDDO -! -PEFC(:,:) = MIN(PEFC(:,:), 1.0) -PEFC(:,:) = MAX(PEFC(:,:), 0.0) - -END SUBROUTINE AER_EFFIC diff --git a/src/PHYEX/ext/aer_effic3D.f90 b/src/PHYEX/ext/aer_effic3D.f90 deleted file mode 100644 index 568965581..000000000 --- a/src/PHYEX/ext/aer_effic3D.f90 +++ /dev/null @@ -1,225 +0,0 @@ -!ORILAM_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier -!ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence -!ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!ORILAM_LIC for details. -! -! ######spll - MODULE MODI_AER_EFFIC3D -!! ######################## -!! -! -INTERFACE -!! -SUBROUTINE AER_EFFIC3D(PRG,PVGG, & !aerosol radius/fall speed (m/s) - PRHODREF, & !Air density - PMUW, PMU, & !mu water/air - PDPG, & !diffusivity - PURR, & ! Rain water m.r. at time t - NMODE_DST, & ! Number of aerosol modes - PTEMP, PCOR, & ! air temp, cunningham corr factor - PDENSITY_AER, & ! aerosol density - PEFFIC ) ! scavenging efficiency -! -IMPLICIT NONE -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRG, PVGG -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PDPG -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMU, PMUW -REAL, DIMENSION(:,:,:), INTENT(IN) :: PURR -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTEMP -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PCOR -INTEGER, INTENT(IN) :: NMODE_DST -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PDENSITY_AER -REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PEFFIC - - - -END SUBROUTINE AER_EFFIC3D -!! -END INTERFACE -END MODULE MODI_AER_EFFIC3D -! ######spll -SUBROUTINE AER_EFFIC3D(PRG,PVGG, & !aerosol radius/fall speed (m/s) - PRHODREF, & !Air density - PMUW, PMU, & !mu water/air - PDPG, & !diffusivity - PURR, & ! Rain water m.r. at time t - NMODE_DST, & ! Number of aerosol modes - PTEMP, PCOR, & ! air temp, cunningham corr factor - PDENSITY_AER, & ! aerosol density - PEFFIC ) ! scavenging efficiency -!! ####################################### -!!**********AER_EFFIC3D********** -!! PURPOSE -!! ------- -!! Calculate the collection efficiency of -! a falling drop interacting with a dust aerosol -! for use with aer_wet_dep_kmt_warm.f90 -!! -!!** METHOD -!! ------ -!! Using basic theory, and the one dimensional variables sent -!! from aer_wet_dep_kmt_warm.f90, calculation of the average -!! fall speed calculations, chapter 17.3.4, MESONH Handbook -!! droplet number based on the Marshall_Palmer distribution -!! and Stokes number, Reynolds number, etc. based on theory -!! (S&P, p.1019) -!! -!! REFERENCE -!! --------- -!! Seinfeld and Pandis p.1019 -!! MESONH Handbook chapter 17.3.4 -!! -!! AUTHOR -!! ------ -!! K. Crahan Kaku / P. Tulet (CNRM/GMEI) -!! -!! MODIFICATIONS -!! ------------- -!! Philippe Wautelet 28/05/2018: corrected truncated integer division (1/12 -> 1./12.) -!! -!----------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_RAIN_ICE_PARAM_n -USE MODD_RAIN_ICE_DESCR_n -USE MODD_CST, ONLY : XPI, XRHOLW, XP00, XRD -USE MODD_PARAMETERS , ONLY : JPVEXT -USE MODD_REF, ONLY : XTHVREFZ -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRG, PVGG -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PDPG -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMU, PMUW -REAL, DIMENSION(:,:,:), INTENT(IN) :: PURR -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTEMP -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PCOR -INTEGER, INTENT(IN) :: NMODE_DST -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PDENSITY_AER -REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PEFFIC -! -!* 0.2 declaration of local variables -! -INTEGER :: IKB ! Coordinates of the first physical - ! points along z -REAL :: ZRHO00 ! Surface reference air density -!viscosity ratio, Reynolds number -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZOMG, ZREY -!rain radius, m, and rain fall speed, m/s; aerosol radius (m), -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZRR, ZVR -!lambda, number concentration according to marshall palmer, -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZNT, ZLBDA -! Rain water m.r. source -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZRRS -!RHO_dref*r_r, Rain LWC -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZRLWC -! schmidts number -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),NMODE_DST) :: ZSCH -! -!Stokes number, ratio of diameters,aerosol radius -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),NMODE_DST) :: ZSTO, ZPHI, ZRG -! S Star Term -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZSTA, ZDIFF, ZTAU -! -!Term 1, Term 2, Term 3, Term 4 such that -! E = Term1 * Term 2 + Term 3 + Term 4 -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),NMODE_DST) :: ZT1, ZT2 -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),NMODE_DST) :: ZT3, ZT4 -! -INTEGER :: JI,JK -! -!----------------------------------------------------------------- -ZLBDA = 1E20 -ZNT = 1E-20 -ZRR = 10E-6 -ZRRS(:,:,:)=PURR(:,:,:) -IKB = 1 + JPVEXT -ZRHO00 = XP00/(XRD*XTHVREFZ(IKB)) -ZRG(:,:,:,:)=PRG(:,:,:,:)*1.E-6 !change units to meters -! -!Fall Speed calculations -!similar to rain_ice.f90, chapter 17.3.4, MESONH Handbook -! -ZVR (:,:,:)= XFSEDR * ZRRS(:,:,:)**(XEXSEDR-1) * & - PRHODREF(:,:,:)**(XEXSEDR-XCEXVT-1) - -! Drop Radius calculation in m -!lbda = pi*No*rho(lwc)/(rho(dref)*rain rate) p.212 MESONH Handbook -! compute the slope parameter Lbda_r - -WHERE((ZRRS(:,:,:).GT. 0.).AND.(PRHODREF(:,:,:) .GT. 0.)) - -ZLBDA(:,:,:) = XLBR*(PRHODREF(:,:,:)*ZRRS(:,:,:))**XLBEXR -!Number concentration NT=No/lbda p. 415 Jacobson -ZNT(:,:,:) = XCCR/ZLBDA(:,:,:) -!rain lwc (kg/m3) = rain m.r.(kg/kg) * rho_air(kg/m3) -ZRLWC(:,:,:)=ZRRS(:,:,:)*PRHODREF(:,:,:) -!4/3 *pi *r**3*NT*rho_eau(kg/m3) =rho(lwc)=rho(air)* qc(kg/kg) -ZRR(:,:,:) = (ZRLWC(:,:,:)/(XRHOLW*ZNT(:,:,:)*4./3.*XPI))**(1./3.) -END WHERE - -ZRR(:,:,:) = MIN(ZRR(:,:,:), 100.E-6) -!Fall speed cannot be faster than 7 m/s -ZVR (:,:,:)=MIN(ZVR (:,:,:),7.) - -!Ref SEINFELD AND PANDIS p.1019 -! Viscosity Ratio -ZOMG(:,:,:)=PMUW(:,:,:)/PMU(:,:,:) -!!Reynolds number -ZREY(:,:,:)=ZRR(:,:,:)*ZVR(:,:,:)*PRHODREF(:,:,:)/PMU(:,:,:) -ZREY(:,:,:)= MAX(ZREY(:,:,:), 1E-2) - - -!S Star -ZSTA(:,:,:)=(1.2+(1./12.)*LOG(1.+ZREY(:,:,:)))/(1.+LOG(1.+ZREY(:,:,:))) -PEFFIC(:,:,:,:)=0.0 -DO JI=1,NMODE_DST -! -!Scmidts number - ZSCH(:,:,:,JI)=PMU(:,:,:)/PRHODREF(:,:,:)/PDPG(:,:,:,JI) -! Rain-Aerosol relative velocity - ZDIFF(:,:,:) = MAX(ZVR(:,:,:)-PVGG(:,:,:,JI),0.) -! Relaxation time - ZTAU(:,:,:) = (ZRG(:,:,:,JI)*2.)**2. * PDENSITY_AER(:,:,:,JI) * PCOR(:,:,:,JI) / (18.*PMU(:,:,:)) -! Stockes number - ZSTO(:,:,:,JI)= ZTAU(:,:,:) * ZDIFF(:,:,:) / ZRR(:,:,:) -!Ratio of diameters - ZPHI(:,:,:,JI)=ZRG(:,:,:,JI)/ZRR(:,:,:) - ZPHI(:,:,:,JI)=MIN(ZPHI(:,:,:,JI), 1.) -!Term 1 - ZT1(:,:,:,JI)=4.0/ZREY(:,:,:)/ZSCH(:,:,:,JI) -!Term 2 - ZT2(:,:,:,JI)=1.0+(0.4*ZREY(:,:,:)**(0.5)*ZSCH(:,:,:,JI)**(1./3.))+ & - (0.16*ZREY(:,:,:)**(0.5)*ZSCH(:,:,:,JI)**(0.5)) - -!Brownian diffusion - ZT1(:,:,:,JI)= ZT1(:,:,:,JI)*ZT2(:,:,:,JI) -!Term 3 - interception - ZT3(:,:,:,JI)=4.*ZPHI(:,:,:,JI)*(1./ZOMG(:,:,:)+ & - (1.0+(2.0*ZREY(:,:,:)**0.5))*ZPHI(:,:,:,JI)) - - ZT4(:,:,:,JI)=0.0 - WHERE(ZSTO(:,:,:,JI).GT.ZSTA(:,:,:)) -!Term 4 - impaction - ZT4(:,:,:,JI)=((ZSTO(:,:,:,JI)-ZSTA(:,:,:))/ & - (ZSTO(:,:,:,JI)-ZSTA(:,:,:)+2./3.))**(3./2.) & - *((XRHOLW/PDENSITY_AER(:,:,:,JI))**(1./2.)) - - END WHERE -!Collision Efficiancy - PEFFIC(:,:,:,JI)=ZT1(:,:,:,JI)+ ZT3(:,:,:,JI)+ZT4(:,:,:,JI) -! Physical radius of a rain collector droplet up than 20 um -WHERE (ZRR(:,:,:) .LE. 9.9E-6) - PEFFIC(:,:,:,JI)= 0. -END WHERE -ENDDO -PEFFIC(:,:,:,:)=MIN(PEFFIC(:,:,:,:),1.0) -PEFFIC(:,:,:,:)=MAX(PEFFIC(:,:,:,:),0.0) - -END SUBROUTINE AER_EFFIC3D diff --git a/src/PHYEX/ext/aer_wet_dep_kmt_warm.f90 b/src/PHYEX/ext/aer_wet_dep_kmt_warm.f90 deleted file mode 100644 index 441484721..000000000 --- a/src/PHYEX/ext/aer_wet_dep_kmt_warm.f90 +++ /dev/null @@ -1,1060 +0,0 @@ -!ORILAM_LIC Copyright 2007-2023 CNRS, Meteo-France and Universite Paul Sabatier -!ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence -!ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!ORILAM_LIC for details. -!----------------------------------------------------------------- -! ################################ - MODULE MODI_AER_WET_DEP_KMT_WARM -!! ################################ -!! -! -INTERFACE -!! -SUBROUTINE AER_WET_DEP_KMT_WARM(KSPLITR, PTSTEP, PZZ, PRHODREF, & - PRCT, PRRT, & - PSVT, PTHT, & - PPABST, PRGAER, PEVAP3D, KMODE, & - PDENSITY_AER, PMASSMIN, PSEA, PTOWN, & - PCCT, PCRT ) -! -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step - ! integration for rain sedimendation -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference [kg/m3] air density -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Tracer m.r. at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEVAP3D ! Instantaneous 3D Rain Evaporation flux (KG/KG/S) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT !Potential temp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! [Pa] pressure -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRGAER ! Aerosol radius (um) -INTEGER, INTENT(IN) :: KMODE ! Nb aerosols mode -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PDENSITY_AER ! Begin Index for aerosol in cloud -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PMASSMIN ! Aerosol mass minimum value -REAL, DIMENSION(:,:),OPTIONAL, INTENT(IN) :: PSEA ! Sea mask -REAL, DIMENSION(:,:),OPTIONAL, INTENT(IN) :: PTOWN ! Town mask -REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(IN) :: PCCT ! Cloud water concentration -REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(IN) :: PCRT ! Rain water concentration -! -END SUBROUTINE AER_WET_DEP_KMT_WARM -!! -END INTERFACE -END MODULE MODI_AER_WET_DEP_KMT_WARM - -! ############################################################### - SUBROUTINE AER_WET_DEP_KMT_WARM (KSPLITR, PTSTEP, PZZ, & - PRHODREF, PRCT, PRRT, & - PSVT, PTHT, & - PPABST, PRGAER, PEVAP3D, KMODE, & - PDENSITY_AER, PMASSMIN, PSEA, PTOWN, & - PCCT, PCRT ) -! ############################################################### -! -!!**** * - compute the explicit microphysical processes involved in the -!!*** * - wet deposition of aerosols species in mixed clouds -!! -!! PURPOSE -!! ------- -!! -!! The purpose of this subroutine is to calculate the mass transfer -!! of aerosol species between cloud hydrometeors. -!! -!! -!! -!!** METHOD -!! ------ -!! Aerosols mass are dissolved into the cloud water and rain -!! drops, it is subject to transfer through the microphysical processes -!! that affect the parent hydrometeor [Rutledge et al., 1986]. -!! Aerosol mass transfer has been computed using scavenging coefficient -!! and brownian nucleation scavenging coefficient (Seinfeld and Pandis, -!! 1998; Tost et al, 2006). -!! -!! The sedimentation rate is computed with a time spliting technique and -!! an upstream scheme, written as a difference of non-advective fluxes. -!! -!! KMODE: Number of aerosol modes (lognormal, bin..) -!! PSVT : 1 => KMODE : dry aerosol mass -!! PSVT : KMODE+1 => 2*KMODE : aerosol mass in cloud -!! PSVT : 2*KMODE+1 => 3*KMODE: aerosol mass in rain - -!! -!! EXTERNAL -!! -------- -!! None -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST -!! XP00 ! Reference pressure -!! XRD,XRV ! Gaz constant for dry air, vapor -!! XMD,XMV ! Molecular weight for dry air, vapor -!! XCPD ! Cpd (dry air) -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! P. Tulet & K. Crahan-Kaku * CNRM * -!! -!! Based on rain_ice.f90 and ch_wet_dep_kmt_warm.f90 -!! from C. Mari & J.P. Pinty * LA* -!! -!! -!! MODIFICATIONS -!! ------------- -!! Original 09/05/07 -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_RAIN_ICE_PARAM_n, ONLY : YEXCACCR=>XEXCACCR, XFSEDC, XFCACCR,& - XEXSEDR, XCRIAUTC, XFSEDR, XTIMAUTC,& - YFCACCR => XFCACCR -!++th++ 10/05/17 -USE MODD_RAIN_ICE_DESCR_n, ONLY : YRTMIN => XRTMIN, YCEXVT => XCEXVT, & - XCONC_LAND, XCONC_SEA, XCONC_URBAN, & - XNUC2, XALPHAC2, XNUC, XALPHAC, & - YLBC => XLBC, XLBEXC, & - XCCR, & - YLBR => XLBR, YLBEXR => XLBEXR -!--th-- -USE MODD_PRECIP_n -USE MODI_AER_VELGRAV -USE MODI_AER_EFFIC -USE MODI_GAMMA -!++th++ 10/05/17 -USE MODD_PARAM_LIMA, ONLY : XCTMIN, WRTMIN => XRTMIN, WCEXVT => XCEXVT -USE MODD_PARAM_LIMA_WARM, ONLY : WLBR => XLBR, WLBEXR => XLBEXR, & ! for - XFSEDRR, XDR, XBR, & ! sedim. - XAUTO1, XAUTO2, XCAUTR, XITAUTR, XLAUTR, & ! for - XLAUTR_THRESHOLD, XITAUTR_THRESHOLD, & ! autoconv. - WLBC => XLBC, & - XACCR1, XACCR2, XACCR3, XACCR4, XACCR5, & ! for - XACCR_RLARGE1, XACCR_RLARGE2, & ! accr. - XACCR_RSMALL1, XACCR_RSMALL2, & - WEXCACCR=>XEXCACCR, WFCACCR=>XFCACCR -USE MODD_PARAM_n, ONLY: CCLOUD -!--th-- - -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step - ! integration for rain sedimendation -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference [kg/m3] air density -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Tracer m.r. at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEVAP3D ! Instantaneous 3D Rain Evaporation flux (KG/KG/S) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Potential temp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! [Pa] pressure -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRGAER ! Aerosols radius (um) -INTEGER, INTENT(IN) :: KMODE ! Nb aerosols mode -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PDENSITY_AER ! Begin Index for aerosol in cloud -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PMASSMIN ! Aerosol mass minimum value -REAL, DIMENSION(:,:),OPTIONAL, INTENT(IN) :: PSEA ! Sea mask -REAL, DIMENSION(:,:),OPTIONAL, INTENT(IN) :: PTOWN ! Town mask -REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(IN) :: PCCT ! Cloud water concentration -REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(IN) :: PCRT ! Rain water concentration - -! -!* 0.2 Declarations of local variables : -! -INTEGER :: JK ! Vertical loop index for the rain sedimentation -INTEGER :: JN ! Temporal loop index for the rain sedimentation -INTEGER :: JJ ! Loop index for the interpolation -! -REAL :: ZTSPLITR ! Small time step for rain sedimentation -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZEFC !efficiency factor [unitless] -! -!Declaration of Dust Variables -! -INTEGER :: ICLOUD, IRAIN -! Case number of sedimentation, T>0 (for HEN) - ! and r_x>0 locations -LOGICAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & - :: GRAIN, GCLOUD ! Test where to compute all processes - ! Test where to compute the SED/EVAP processes -!++cb++ 15/05/17 -!REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & -! :: ZW, ZZW1, ZZW2, ZZW4 ! work array -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & - :: ZW, ZZW1, ZZW2, ZZW4, & ! work array - ZZW3, ZZW5 -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & - :: ZDIM, & - ZLBDC3, ZLBDC, & - ZLBDR3, ZLBDR -!--cb-- -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & - :: ZWEVAP ! sedimentation fluxes -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)+1) & - :: ZWSED ! sedimentation fluxes -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) :: ZLBDAR -! Slope parameter of the raindrop distribution -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & - :: ZZRCT, ZZEVAP, ZMASK -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & - :: ZRAY, & ! Mean radius - ZNRT, & ! Number of rain droplets - ZLBC , & ! XLBC weighted by sea fraction - ZFSEDC -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2)) :: ZCONC_TMP -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) :: ZCONC -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSVT ! Tracer m.r. concentration -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZVGG, ZDPG !aerosol velocity [m/s], diffusivity [m2/s] -REAL, DIMENSION(:,:), ALLOCATABLE :: ZRG !Dust R[\b5m] -REAL, DIMENSION(:,:), ALLOCATABLE :: ZCOR !Cunningham correction factor [unitless] -REAL, DIMENSION(:,:), ALLOCATABLE :: ZMASSMIN ! Aerosol mass minimum value -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDENSITY_AER ! Aerosol density -! -REAL, DIMENSION(:), ALLOCATABLE & - :: ZRHODREF, & ! RHO Dry REFerence - ZTHT, & ! Potential temp - ZPABST, & ! Pressure [Pa] - ZZW, & ! Work array - ZTEMP, & ! Air Temp [K] - ZRC, & ! Cloud radius [m] - ZRCT, & ! Cloud water - ZRR, & ! Rain radius [m] - ZNT, & ! Rain droplets number - ZRRT, & ! Rain water - ZMU,ZMUW, & ! viscosity aerosol, water [Pa s] - ZFLUX, & ! Effective precipitation flux (kg.m-2.s-1) - ZCONC1D, & ! Weighted droplets concentration - ZWLBDC, & ! Slope parameter of the droplet distribution - ZGAMMA, & ! scavenging coefficient - ZLBDA ! lambda parameter for lima distribution -REAL, DIMENSION(:), ALLOCATABLE :: ZW1 ! Work arrays - -INTEGER :: JL ! and PACK intrinsics -! -INTEGER :: JKAQ, JSV -! -REAL :: A0, A1, A2, A3 ! Constants for computing viscocity -INTEGER :: IKE -! -REAL, DIMENSION(:), ALLOCATABLE :: KRTMIN -REAL :: KCEXVT, KLBR, KLBEXR, KLBC, ZLBEXC -REAL, DIMENSION(2) :: ZXLBC -REAL :: ZEXSEDR, ZDR, ZEXCACCR, ZFCACCR -! -!------------------------------------------------------------------------------- -! -!* 0. Initialize work array -! --------------------- -! -!++cb++ 15/05/17 gestion des parametres redondants entre lima et ice3 -! ATTENTION : pour le moment, les autres schemas microphysiques ne sont pas geres -! NOTE : les noms sont changes dans toute la routine X... --> K... -SELECT CASE(CCLOUD) -CASE('ICE3') - ALLOCATE(KRTMIN(SIZE(YRTMIN))) - KRTMIN(:) = YRTMIN(:) - KCEXVT = YCEXVT - KLBR = YLBR - KLBEXR = YLBEXR - ZXLBC(:) = YLBC(:) - ZLBEXC = XLBEXC - ZEXCACCR = YEXCACCR - ZFCACCR = YFCACCR -CASE('LIMA') - ALLOCATE(KRTMIN(SIZE(WRTMIN))) - KRTMIN = WRTMIN - KCEXVT = WCEXVT - KLBR = WLBR - KLBEXR = WLBEXR - KLBC = WLBC - ZLBEXC = 1.0 / 3.0 - ZDR = 0.8 - ZEXCACCR = WEXCACCR - ZFCACCR = WFCACCR -END SELECT -!--cb-- -! -! Compute Effective cloud radius -ZRAY(:,:,:) = 0. -ZLBC(:,:,:) = 0. -! -!++th++ 05/05/17 test thomas -IF (PRESENT(PCCT)) THEN ! case KHKO, C2R2, C3R5, LIMA (two moments schemes) -! - WHERE (PCCT(:,:,:) .GT. 0. .AND. PRCT(:,:,:) .GT. 0.) - ZRAY(:,:,:) = 3. * PRCT(:,:,:) / (4. * XPI * XRHOLW * PCCT(:,:,:)) - ZRAY(:,:,:) = ZRAY(:,:,:)**(1./3.) ! Cloud mean radius in m - ELSEWHERE - ZRAY(:,:,:) = 30. ! Cloud mean radius in m - ENDWHERE -!--th-- -! -ELSE IF (PRESENT(PSEA)) THEN ! Case ICE3, REVE, KESS, .. - ZLBC(:,:,:) = ZXLBC(1) - ZFSEDC(:,:,:) = XFSEDC(1) - ZCONC(:,:,:) = XCONC_LAND - ZCONC_TMP(:,:) = PSEA(:,:) * XCONC_SEA + (1. - PSEA(:,:)) * XCONC_LAND -! - DO JK = 1, SIZE(PRHODREF,3) - ZLBC(:,:,JK) = PSEA(:,:) * ZXLBC(2) + (1. - PSEA(:,:)) * ZXLBC(1) - ZFSEDC(:,:,JK) = (PSEA(:,:) * XFSEDC(2) + (1. - PSEA(:,:)) * XFSEDC(1)) - ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) - ZCONC(:,:,JK) = (1. - PTOWN(:,:)) * ZCONC_TMP(:,:) + PTOWN(:,:) * XCONC_URBAN - ZRAY(:,:,JK) = 0.5 * ((1. - PSEA(:,:)) * GAMMA(XNUC+1.0/XALPHAC) / (GAMMA(XNUC)) + & - PSEA(:,:) * GAMMA(XNUC2+1.0/XALPHAC2) / (GAMMA(XNUC2))) - END DO - ZRAY(:,:,:) = MAX(1., ZRAY(:,:,:)) - ZLBC(:,:,:) = MAX(MIN(ZXLBC(1),ZXLBC(2)), ZLBC(:,:,:)) -ELSE - ZRAY(:,:,:) = 30. ! default value for cloud radius -END IF -! -ZNRT(:,:,:) = 0. -IF (PRESENT(PCRT)) THEN ! case KHKO, C2R2, C3R5, LIMA -! Transfert Number of rain droplets - ZNRT(:,:,:) = PCRT(:,:,:) -END IF -!------------------------------------------------------------------------------- -! -!* 1. COMPUTE THE AEROSOL/CLOUD-RAIN MASS TRANSFER -! ---------------------------------------------- -! -CALL AER_WET_MASS_TRANSFER -! -!------------------------------------------------------------------------------- -! -!* 2. COMPUTE THE SEDIMENTATION (RS) SOURCE -! ------------------------------------- -! -CALL AER_WET_DEP_KMT_WARM_SEDIMENT -! -!------------------------------------------------------------------------------- -! -!* 3. COMPUTES THE SLOW WARM PROCESS SOURCES -! -------------------------------------- -! -CALL AER_WET_DEP_KMT_ICE_WARM -! -!------------------------------------------------------------------------------- -!* 4. COMPUTES EVAPORATION PROCESS -! ---------------------------- -! -CALL AER_WET_DEP_KMT_EVAP -! -DEALLOCATE(KRTMIN) -! -!------------------------------------------------------------------------------- -! -! -CONTAINS -! -! -!------------------------------------------------------------------------------- -! -SUBROUTINE AER_WET_MASS_TRANSFER -! -!* 0. DECLARATIONS -! ------------ -! -use mode_tools, only: Countjv - -IMPLICIT NONE -! -!* 0.2 declaration of local variables -! -! -INTEGER , DIMENSION(SIZE(GCLOUD)) :: I1C,I2C,I3C! Used to replace the COUNT -INTEGER , DIMENSION(SIZE(GRAIN)) :: I1R,I2R,I3R ! Used to replace the COUNT -INTEGER :: JL ! and PACK intrinsics -INTEGER :: JKAQ ! counter for chemistry -! -! -! 1 Mass transfer Aerosol to cloud (Tost et al., 2006) -! -GCLOUD(:,:,:) = .FALSE. -! -IF (PRESENT(PCCT)) THEN ! case KHKO, C2R2, C3R5, LIMA (2-moment schemes) - GCLOUD(:,:,:) = PRCT(:,:,:) > KRTMIN(2) .AND. PCCT(:,:,:) > XCTMIN(2) -ELSE ! Case ICE3, REVE, KESS, ... (1-moment schemes) - GCLOUD(:,:,:) = PRCT(:,:,:) > KRTMIN(2) -END IF - -ICLOUD = COUNTJV( GCLOUD(:,:,:),I1C(:),I2C(:),I3C(:)) -IF( ICLOUD >= 1 ) THEN - ALLOCATE(ZSVT(ICLOUD,KMODE*3)) - ALLOCATE(ZRHODREF(ICLOUD)) - ALLOCATE(ZTHT(ICLOUD)) - ALLOCATE(ZRC(ICLOUD)) - ALLOCATE(ZPABST(ICLOUD)) - ALLOCATE(ZRG(ICLOUD,KMODE)) - ALLOCATE(ZTEMP(ICLOUD)) - ALLOCATE(ZMU(ICLOUD)) - ALLOCATE(ZRCT(ICLOUD)) - ALLOCATE(ZVGG(ICLOUD,KMODE)) - ALLOCATE(ZDPG(ICLOUD,KMODE)) - ALLOCATE(ZGAMMA(ICLOUD)) - ALLOCATE(ZW1(ICLOUD)) - ALLOCATE(ZCOR(ICLOUD,KMODE)) - ALLOCATE(ZMASSMIN(ICLOUD,KMODE)) - ALLOCATE(ZWLBDC(ICLOUD)) - ALLOCATE(ZCONC1D(ICLOUD)) - ALLOCATE(ZDENSITY_AER(ICLOUD,KMODE)) -! - ZSVT(:,:) = 0. -! - DO JL = 1, ICLOUD - DO JKAQ = 1, KMODE - ZRG(JL,JKAQ) = PRGAER(I1C(JL),I2C(JL),I3C(JL),JKAQ) - ENDDO - DO JKAQ = 1, KMODE*3 - ZSVT(JL,JKAQ) = PSVT(I1C(JL),I2C(JL),I3C(JL),JKAQ) - END DO - ! - ZTHT(JL) = PTHT(I1C(JL),I2C(JL),I3C(JL)) - ZRC(JL) = ZRAY(I1C(JL),I2C(JL),I3C(JL)) - ZPABST(JL) = PPABST(I1C(JL),I2C(JL),I3C(JL)) - ZRCT(JL) = PRCT(I1C(JL),I2C(JL),I3C(JL)) - ZRHODREF(JL) = PRHODREF(I1C(JL),I2C(JL),I3C(JL)) - ZMASSMIN(JL,:) = PMASSMIN(I1C(JL),I2C(JL),I3C(JL),:) - ZWLBDC(JL) = ZLBC(I1C(JL),I2C(JL),I3C(JL)) - ZCONC1D(JL) = ZCONC(I1C(JL),I2C(JL),I3C(JL)) - ZDENSITY_AER(JL,:) = PDENSITY_AER(I1C(JL),I2C(JL),I3C(JL),:) - END DO -! - IF (ANY(ZWLBDC(:) /= 0.)) THEN ! case one moments - ! On calcule Rc a partir de M(3) car c'est le seul moment indt de alpha et nu - ! Rho_air * Rc / (Pi/6 * Rho_eau * Nc) = M(3) = 1/ (Lambda**3 * rapport des - ! gamma) - ZWLBDC(:) = ZWLBDC(:) * ZCONC1D(:) / (ZRHODREF(:) * ZRCT(:)) - ZWLBDC(:) = ZWLBDC(:)**ZLBEXC - ZRC(:) = ZRC(:) / ZWLBDC(:) - END IF -! -! initialize temperature - ZTEMP(:) = ZTHT(:) * (ZPABST(:) / XP00)**(XRD/XCPD) -! -! compute diffusion and gravitation velocity - CALL AER_VELGRAV(ZRG(:,:), ZPABST(:), & - KMODE, ZMU(:), ZVGG(:,:), & - ZDPG(:,:),ZTEMP(:),ZCOR(:,:), & - ZDENSITY_AER(:,:)) - - DO JKAQ = 1, KMODE -! Browninan nucleation scavenging (Pruppacher and Klett, 2000, p723) - ZGAMMA(:) = 1.35 * ZRCT(:) * ZRHODREF(:) * 1.E-3 * ZDPG(:,JKAQ) / & - (ZRC(:) * ZRC(:)) -! - ZW1(:) = ZSVT(:,JKAQ) * EXP(-ZGAMMA(:) * PTSTEP) - ZW1(:) = MAX(ZW1(:), ZMASSMIN(:,JKAQ)) -! ZW1(:) = MIN(ZW1(:), ZSVT(:,JKAQ)) -! Aerosol mass in cloud - ZSVT(:,KMODE+JKAQ) = ZSVT(:,KMODE+JKAQ) + ZSVT(:,JKAQ) - ZW1(:) -! New aerosol mass - ZSVT(:,JKAQ) = ZW1(:) -! Return in 3D - PSVT(:,:,:,JKAQ) = & - UNPACK(ZSVT(:,JKAQ),MASK=GCLOUD(:,:,:),FIELD=PSVT(:,:,:,JKAQ)) - PSVT(:,:,:,KMODE+JKAQ) = & - UNPACK(ZSVT(:,KMODE+JKAQ),MASK=GCLOUD(:,:,:),FIELD=PSVT(:,:,:,KMODE+JKAQ)) - ENDDO -! - DEALLOCATE(ZSVT) - DEALLOCATE(ZRHODREF) - DEALLOCATE(ZTHT) - DEALLOCATE(ZRC) - DEALLOCATE(ZPABST) - DEALLOCATE(ZRG) - DEALLOCATE(ZTEMP) - DEALLOCATE(ZMU) - DEALLOCATE(ZRCT) - DEALLOCATE(ZVGG) - DEALLOCATE(ZDPG) - DEALLOCATE(ZGAMMA) - DEALLOCATE(ZW1) - DEALLOCATE(ZCOR) - DEALLOCATE(ZMASSMIN) - DEALLOCATE(ZWLBDC) - DEALLOCATE(ZCONC1D) - DEALLOCATE(ZDENSITY_AER) -END IF -! -! 2 Mass transfer Aerosol to Rain (Seinfeld and Pandis, 1998, Tost et al., 2006) -! -GRAIN(:,:,:) = .FALSE. -! -IF (PRESENT(PCRT)) THEN ! case KHKO, C2R2, C3R5, LIMA (2-moment schemes) - GRAIN(:,:,:) = PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3) -ELSE ! Case ICE3, REVE, KESS, ... (1-moment schemes) - GRAIN(:,:,:) = PRRT(:,:,:) > KRTMIN(3) -END IF - -IRAIN = COUNTJV( GRAIN(:,:,:),I1R(:),I2R(:),I3R(:)) -IF( IRAIN >= 1 ) THEN -! - ALLOCATE(ZRRT(IRAIN)) - ALLOCATE(ZSVT(IRAIN,3*KMODE)) - ALLOCATE(ZRHODREF(IRAIN)) - ALLOCATE(ZTHT(IRAIN)) - ALLOCATE(ZRR(IRAIN)) - ALLOCATE(ZNT(IRAIN)) - ALLOCATE(ZPABST(IRAIN)) - ALLOCATE(ZRG(IRAIN,KMODE)) - ALLOCATE(ZCOR(IRAIN,KMODE)) - ALLOCATE(ZTEMP(IRAIN)) - ALLOCATE(ZMU(IRAIN)) - ALLOCATE(ZVGG(IRAIN,KMODE)) - ALLOCATE(ZDPG(IRAIN,KMODE)) - ALLOCATE(ZMUW(IRAIN)) - ALLOCATE(ZEFC(IRAIN,KMODE)) - ALLOCATE(ZW1(IRAIN)) - ALLOCATE(ZFLUX(IRAIN)) - ALLOCATE(ZGAMMA(IRAIN)) - ALLOCATE(ZMASSMIN(IRAIN,KMODE)) - ALLOCATE(ZDENSITY_AER(IRAIN,KMODE)) - ALLOCATE(ZLBDA(IRAIN)) -! - ZSVT(:,:) = 0. -! - DO JL = 1, IRAIN - DO JKAQ = 1, KMODE - ZRG(JL,JKAQ) = PRGAER(I1R(JL),I2R(JL),I3R(JL),JKAQ ) - ZSVT(JL,JKAQ) = PSVT(I1R(JL),I2R(JL),I3R(JL),JKAQ) - ZSVT(JL,KMODE*2+JKAQ) = PSVT(I1R(JL),I2R(JL),I3R(JL),KMODE*2+JKAQ) - END DO -! - ZTHT(JL) = PTHT(I1R(JL),I2R(JL),I3R(JL)) - ZPABST(JL) = PPABST(I1R(JL),I2R(JL),I3R(JL)) - ZRRT(JL) = PRRT(I1R(JL),I2R(JL),I3R(JL)) - ZRHODREF(JL) = PRHODREF(I1R(JL),I2R(JL),I3R(JL)) - ZMASSMIN(JL,:) = PMASSMIN(I1R(JL),I2R(JL),I3R(JL),:) - ZNT(JL) = ZNRT(I1R(JL),I2R(JL),I3R(JL)) - ZDENSITY_AER(JL,:) = PDENSITY_AER(I1R(JL),I2R(JL),I3R(JL),:) - ENDDO - -! Compute scavenging coefficient - ZFLUX(:) = 0. - ZRRT(:) = MAX(ZRRT(:), 0.) -! -! Effective precipitation flux (kg.m-2.s-1) - IF (PRESENT(PCRT)) THEN ! cf lima_precip_scavenging.f90 (l. 751) - ZEXSEDR = (XBR + XDR + 1.0) / (XBR + 1.0) - - ZLBDA(:) = (KLBR * ZNT(:) / ZRRT(:))**KLBEXR - ZFLUX(:) = XFSEDRR * ZRRT(:) * ZRHODREF(:)**(1.-KCEXVT) * ZLBDA(:)**(-ZDR) - - ELSE ! cf ZWSED dans rain_ice.f90 (l. 1077) - ZFLUX(:) = XFSEDR * ZRRT(:)**(XEXSEDR) * ZRHODREF(:)**(XEXSEDR-KCEXVT) - END IF - ZFLUX(:) = MAX(ZFLUX(:), 0.) - - IF (ALL(ZNT(:) == 0.)) THEN ! case one moments -! Number concentration NT=No/lbda p. 415 Jacobson -! 4/3 *pi *r\b3*NT*rho_eau(kg/m3) =rho(lwc)=rho(air)* qc(kg/kg) - ZNT(:) = XCCR / (KLBR * (ZRHODREF(:) * ZRRT(:))**KLBEXR) - END IF -! - ZRR(:) = (ZRRT(:) * ZRHODREF(:) / & - (XRHOLW * ZNT(:) * 4. / 3. * XPI))**(1./3.) - - CALL AER_WET_DEP_KMT_EFFIC - - DO JKAQ = 1, KMODE - ! Tost et al, 2006 - ZGAMMA(:) = 0.75 * ZEFC(:,JKAQ) * ZFLUX(:) / (ZRR(:) * 1.E3) - - ZW1(:) = ZSVT(:,JKAQ) * EXP(-ZGAMMA(:)*PTSTEP) - ZW1(:) = MAX(ZW1(:), ZMASSMIN(:,JKAQ)) - - ! Aerosol mass in rain - ZSVT(:,KMODE*2+JKAQ) = ZSVT(:,KMODE*2+JKAQ) + ZSVT(:,JKAQ) - ZW1(:) - - ! New aerosol mass - ZSVT(:,JKAQ) = ZW1(:) - - ! Return to 3D - PSVT(:,:,:,JKAQ) = & - UNPACK(ZSVT(:,JKAQ),MASK=GRAIN(:,:,:),FIELD=PSVT(:,:,:,JKAQ)) - PSVT(:,:,:,KMODE*2+JKAQ) = & - UNPACK(ZSVT(:,KMODE*2+JKAQ),MASK=GRAIN(:,:,:),FIELD=PSVT(:,:,:,KMODE*2+JKAQ)) - ENDDO -! - DEALLOCATE(ZRRT) - DEALLOCATE(ZSVT) - DEALLOCATE(ZRHODREF) - DEALLOCATE(ZTHT) - DEALLOCATE(ZRR) - DEALLOCATE(ZNT) - DEALLOCATE(ZPABST) - DEALLOCATE(ZRG) - DEALLOCATE(ZCOR) - DEALLOCATE(ZTEMP) - DEALLOCATE(ZMU) - DEALLOCATE(ZVGG) - DEALLOCATE(ZDPG) - DEALLOCATE(ZMUW) - DEALLOCATE(ZEFC) - DEALLOCATE(ZW1) - DEALLOCATE(ZFLUX) - DEALLOCATE(ZGAMMA) - DEALLOCATE(ZMASSMIN) - DEALLOCATE(ZDENSITY_AER) - DEALLOCATE(ZLBDA) -END IF -! -END SUBROUTINE AER_WET_MASS_TRANSFER -! -!------------------------------------------------------------------------------- -! -SUBROUTINE AER_WET_DEP_KMT_WARM_SEDIMENT -! -!* Sedimentation of aerosol in rain droplets -! -!* 0. DECLARATIONS -! ------------ -! -use mode_tools, only: Countjv -! -IMPLICIT NONE -! -!* declaration of local variables -! -INTEGER :: JL ! and PACK intrinsics -INTEGER :: JKAQ ! counter for acquous aerosols -INTEGER :: IRAIN, ILISTLENR -INTEGER :: ILENALLOCR -INTEGER, SAVE :: IOLDALLOCR = 6000 -INTEGER, DIMENSION(SIZE(PZZ)) :: IR1,IR2,IR3 ! Used to replace the COUNT -INTEGER, DIMENSION(:), ALLOCATABLE :: ILISTR -REAL, DIMENSION(:), ALLOCATABLE :: ZLAMBDA, ZRHODREF, ZCRT, ZRRT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSVT -! -!------------------------------------------------------------------------------- -! -!* Time splitting initialization -! -ZTSPLITR = PTSTEP / REAL(KSPLITR) -! -ZW(:,:,:)=0. -ZWSED(:,:,:) = 0. -IKE = SIZE(PRCT,3) -ILENALLOCR = 0 - -DO JK = 1 , SIZE(PZZ,3)-1 - ZW(:,:,JK) = ZTSPLITR / ((PZZ(:,:,JK+1) - PZZ(:,:,JK))) -END DO - -IF (PRESENT(PCRT)) THEN !two moments - WHERE (PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3)) - ZW(:,:,:) = 0. - END WHERE -ELSE ! one moment - WHERE (PRRT(:,:,:) <= KRTMIN(3)) - ZW(:,:,:) = 0. - END WHERE -END IF - -GRAIN(:,:,:) = .FALSE. - -IF (PRESENT(PCRT)) THEN ! case KHKO, C2R2, C3R5, LIMA (2-moment schemes) - GRAIN(:,:,:) = PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3) -ELSE ! Case ICE3, REVE, KESS, ... (1-moment schemes) - GRAIN(:,:,:) = PRRT(:,:,:) > KRTMIN(3) -END IF - -IRAIN = COUNTJV( GRAIN(:,:,:),IR1(:),IR2(:),IR3(:)) - -IF( IRAIN >= 1 ) THEN -DO JN = 1 , KSPLITR - IF( JN==1 ) THEN - DO JKAQ = 1,KMODE - DO JK = 1, IKE - PSVT(:,:,JK,KMODE*2+JKAQ) = PSVT(:,:,JK,KMODE*2+JKAQ) / FLOAT(KSPLITR) - END DO - END DO - END IF - IF ( IRAIN .GT. ILENALLOCR ) THEN - IF ( ILENALLOCR .GT. 0 ) THEN - DEALLOCATE (ILISTR,ZSVT,ZRHODREF,ZCRT,ZRRT,ZLAMBDA) - END IF - ILENALLOCR = MAX (IOLDALLOCR, 2*IRAIN ) - IOLDALLOCR = ILENALLOCR - ALLOCATE(ILISTR(ILENALLOCR), ZRHODREF(ILENALLOCR), ZSVT(ILENALLOCR,3*KMODE),& - ZCRT(ILENALLOCR), ZRRT(ILENALLOCR), ZLAMBDA(ILENALLOCR)) - END IF - - DO JL = 1, IRAIN - DO JKAQ = 1, KMODE - ZSVT(JL,KMODE*2+JKAQ) = PSVT(IR1(JL),IR2(JL),IR3(JL),KMODE*2+JKAQ) - END DO -! - IF (PRESENT(PCRT)) ZCRT(JL) = PCRT(IR1(JL),IR2(JL),IR3(JL)) - ZRRT(JL) = PRRT(IR1(JL),IR2(JL),IR3(JL)) - ZRHODREF(JL) = PRHODREF(IR1(JL),IR2(JL),IR3(JL)) - ENDDO - - ILISTLENR = 0 - DO JL=1,IRAIN - IF (PRESENT(PCRT)) THEN !two moments - IF (ZRRT(JL) > KRTMIN(3) .AND. ZCRT(JL) > XCTMIN(3)) THEN - ILISTLENR = ILISTLENR + 1 - ILISTR(ILISTLENR) = JL - END IF - ELSE ! one moment - IF (ZRRT(JL) > KRTMIN(3)) THEN - ILISTLENR = ILISTLENR + 1 - ILISTR(ILISTLENR) = JL - END IF - END IF - END DO - -! -! Flux mass aerosol in rain droplets = -! Flux mass rain water * Mass aerosol in rain / Mass rain water - DO JKAQ = 1,KMODE - DO JJ = 1, ILISTLENR - JL = ILISTR(JJ) - IF (PRESENT(PCRT)) THEN !two moments - IF (ZRRT(JL) > KRTMIN(3) .AND. ZCRT(JL) > XCTMIN(3)) THEN - ZLAMBDA(JL) = (KLBR * ZCRT(JL) / ZRRT(JL))**KLBEXR - - ZWSED(IR1(JL),IR2(JL),IR3(JL)) = XFSEDRR * ZRHODREF(JL)**(1.-KCEXVT) & - * ZLAMBDA(JL)**(-ZDR) & - * ZSVT(JL,KMODE*2+JKAQ) - END IF - ELSE ! one moments -! cf rain_ice.f90 : l. 1077 (zwsed * psvt(kmode+2+jkaq) / zrrs) - IF (ZRRT(JL) > KRTMIN(3)) THEN - - ZWSED(IR1(JL),IR2(JL),IR3(JL)) = XFSEDR & - * ZRRT(JL)**(XEXSEDR-1.) & - * ZRHODREF(JL)**(XEXSEDR-KCEXVT) & - * ZSVT(JL,KMODE*2+JKAQ) - END IF - END IF ! moments - END DO ! JJ - - DO JK = 1, IKE - PSVT(:,:,JK,KMODE*2+JKAQ) = PSVT(:,:,JK,KMODE*2+JKAQ) + & - ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK)) - END DO - END DO ! JKAQ - -END DO ! JN - time splitting - - DO JKAQ = 1,KMODE -! Aerosol mass in rain droplets need to be positive - PSVT(:,:,:,KMODE*2+JKAQ) = MAX(PSVT(:,:,:,KMODE*2+JKAQ), 0.) - END DO ! KKAQ -END IF !(IRAIN) -! -IF (ALLOCATED(ILISTR)) DEALLOCATE(ILISTR) -IF (ALLOCATED(ZSVT)) DEALLOCATE(ZSVT) -IF (ALLOCATED(ZRHODREF)) DEALLOCATE(ZRHODREF) -IF (ALLOCATED(ZCRT)) DEALLOCATE(ZCRT) -IF (ALLOCATED(ZRRT)) DEALLOCATE(ZRRT) -IF (ALLOCATED(ZLAMBDA)) DEALLOCATE(ZLAMBDA) - -! -END SUBROUTINE AER_WET_DEP_KMT_WARM_SEDIMENT -! -!------------------------------------------------------------------------------- -! - SUBROUTINE AER_WET_DEP_KMT_ICE_WARM -! -!* 0. DECLARATIONS -! -USE MODD_CST, ONLY: XMNH_HUGE - -IMPLICIT NONE -! -!------------------------------------------------------------------------------- -! -!* 1. compute the autoconversion of r_c for r_r production: RCAUTR -! -ZZW4(:,:,:) = 0.0 -! to be sure no division by zero in case of ZZRCT = 0. -ZZRCT(:,:,:) = PRCT(:,:,:) -ZZRCT(:,:,:) = MAX(ZZRCT(:,:,:), KRTMIN(2)/2.) -! -IF (PRESENT(PCRT)) THEN ! 2-moment schemes -! -! from lima_warm_coal.f90 (AUTO) - ZLBDC3(:,:,:) = 1E40 - ! ZLBDC3(:,:,:) = XMNH_HUGE - ZLBDC(:,:,:) = 1.E15 - WHERE (ZZRCT(:,:,:) > KRTMIN(2) .AND. PCCT(:,:,:) > XCTMIN(2)) - ZLBDC3(:,:,:) = KLBC * PCCT(:,:,:) / ZZRCT(:,:,:) - ! ZLBDC3(:,:,:) = KLBC * PCCT(:,:,:) / PRCT(:,:,:) - ZLBDC(:,:,:) = ZLBDC3(:,:,:)**ZLBEXC - END WHERE -! - ZZW3(:,:,:) = 0. - WHERE (ZZRCT(:,:,:) > KRTMIN(2)) - ZZW3(:,:,:) = MAX(0.0, XLAUTR*PRHODREF(:,:,:)*ZZRCT(:,:,:)* & - (XAUTO1/ZLBDC3(:,:,:)**4-XLAUTR_THRESHOLD)) ! L - ZZW4(:,:,:) = MIN(PRCT(:,:,:), MAX(0.0, XITAUTR*ZZW3(:,:,:)*ZZRCT(:,:,:)* & - (XAUTO2/ZLBDC3(:,:,:)-XITAUTR_THRESHOLD))) ! L/tau - END WHERE -! -ELSE ! 1-moment scheme -! - WHERE ((ZZRCT(:,:,:) > KRTMIN(2)) .AND. (PRCT(:,:,:) > 0.0)) - ZZW4(:,:,:) = MIN(PRCT(:,:,:), XTIMAUTC* & - MAX((ZZRCT(:,:,:)-XCRIAUTC/PRHODREF(:,:,:)), 0.0)) - END WHERE -! -END IF -!--cb-- - -DO JKAQ = 1,KMODE - ZZW2(:,:,:) = 0.0 - ZZW2(:,:,:) = ZZW4(:,:,:) * PSVT(:,:,:,KMODE+JKAQ) / ZZRCT(:,:,:) * PTSTEP - ZZW2(:,:,:) = MAX(MIN(ZZW2(:,:,:), PSVT(:,:,:,KMODE+JKAQ)), 0.0) - -! For rain - Increase the aerosol conc in rain - PSVT(:,:,:,KMODE*2+JKAQ) = PSVT(:,:,:,KMODE*2+JKAQ) + ZZW2(:,:,:) -! For Cloud Decrease the aerosol conc in cloud - PSVT(:,:,:,KMODE+JKAQ) = PSVT(:,:,:,KMODE+JKAQ) - ZZW2(:,:,:) -ENDDO -! -! -!* 2. compute the accretion of r_c for r_r production: RCACCR -! -ZZW4(:,:,:) = 0.0 -ZZW5(:,:,:) = 0. -ZDIM(:,:,:) = 0. -ZLBDAR(:,:,:)=0. - -! -IF (PRESENT(PCRT)) THEN ! 2-moment schemes -! -! from lima_warm_coal.f90 (ACCR) - ZLBDR3(:,:,:) = 1.E30 - ZLBDR(:,:,:) = 1.E10 - - - WHERE (PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3)) - ZLBDAR(:,:,:) = KLBR * (PRHODREF(:,:,:) * PRRT(:,:,:))**KLBEXR - ZLBDR3(:,:,:) = KLBR * PCRT(:,:,:) / PRRT(:,:,:) - ZLBDR(:,:,:) = ZLBDR3(:,:,:)**KLBEXR - ZZW4(:,:,:) = MIN(PRCT(:,:,:), ZFCACCR * ZZRCT(:,:,:) & - * ZLBDAR(:,:,:)**ZEXCACCR & - * PRHODREF(:,:,:)**(-KCEXVT) ) - ZDIM(:,:,:) = XACCR1 / ZLBDAR(:,:,:) - END WHERE -! -! Accretion for D > 100 10-6 m - WHERE (PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3) .AND. & - ZZRCT(:,:,:) > KRTMIN(2) .AND. ZZW4(:,:,:) > 1.E-4 .AND. & - (PRRT(:,:,:) > 1.2*ZZW3(:,:,:)/PRHODREF(:,:,:) .OR. & - ZDIM(:,:,:) >= MAX(XACCR2,XACCR3/(XACCR4/ZLBDC(:,:,:)-XACCR5)))) - ZZW5(:,:,:) = ZLBDC3(:,:,:) / ZLBDR3(:,:,:) - ZZW1(:,:,:) = (PCCT(:,:,:) * PCRT(:,:,:) / ZLBDC3(:,:,:)**2) * PRHODREF(:,:,:) - ZZW4(:,:,:) = MIN(ZZW1(:,:,:)*(XACCR_RLARGE1+XACCR_RLARGE2*ZZW5(:,:,:)), & - PRCT(:,:,:)) - END WHERE -! Accretion for D < 100 10-6 m - WHERE (PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3) .AND. & - ZZRCT(:,:,:) > KRTMIN(2) .AND. ZZW4(:,:,:) <= 1.E-4 .AND. & - (PRRT(:,:,:) > (1.2*ZZW2(:,:,:)/PRHODREF(:,:,:)) .OR. & - ZDIM(:,:,:) >= MAX(XACCR2,XACCR3/(XACCR4/ZLBDC(:,:,:)-XACCR5)))) - ZZW5(:,:,:) = (ZLBDC3(:,:,:) / ZLBDR3(:,:,:))**2 - ZZW1(:,:,:) = (PCCT(:,:,:) * PCRT(:,:,:) / ZLBDC3(:,:,:)**3) * PRHODREF(:,:,:) - ZZW4(:,:,:) = MIN(ZZW1(:,:,:)*(XACCR_RSMALL1+XACCR_RSMALL2*ZZW5(:,:,:)), & - PRCT(:,:,:)) - END WHERE -! -ELSE ! 1-moment schemes -! - ZLBDR(:,:,:) = 0.0 - WHERE ((ZZRCT(:,:,:) > KRTMIN(2)) .AND. (PRRT(:,:,:) > KRTMIN(3)) & - .AND. (PRCT(:,:,:) > 0.0)) - ZLBDR(:,:,:) = KLBR * (PRHODREF(:,:,:) * PRRT(:,:,:))**KLBEXR - ZZW4(:,:,:) = MIN(PRCT(:,:,:), ZFCACCR * ZZRCT(:,:,:) & - * ZLBDR(:,:,:)**ZEXCACCR & - * PRHODREF(:,:,:)**(-KCEXVT) ) - END WHERE -END IF -!--cb-- -! -DO JKAQ = 1, KMODE - ZZW2(:,:,:) = 0.0 - ZZW2(:,:,:) = ZZW4(:,:,:) * PSVT(:,:,:,KMODE+JKAQ) / ZZRCT(:,:,:) * PTSTEP - ZZW2(:,:,:) = MAX(MIN(ZZW2(:,:,:), PSVT(:,:,:,KMODE+JKAQ)), 0.0) -! -! -!* 3. compute the new acqueous aerosol mass -! -! For rain - Increase the aerosol conc in rain - PSVT(:,:,:,KMODE*2+JKAQ) = PSVT(:,:,:,KMODE*2+JKAQ) + ZZW2(:,:,:) -! For Cloud Decrease the aerosol conc in cloud - PSVT(:,:,:,KMODE+JKAQ) = PSVT(:,:,:,KMODE+JKAQ) - ZZW2(:,:,:) -ENDDO -! -END SUBROUTINE AER_WET_DEP_KMT_ICE_WARM -! -!--------------------------------------------------------------------------------------- -! - SUBROUTINE AER_WET_DEP_KMT_EVAP -! -!* COMPUTES THE EVAPORATION OF CLOUD-RAIN FOR THE -!* RE-RELEASE OF AER INTO THE ENVIRONMENT -! -------------------------------------- -! -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -! -!* declaration of local variables -! -INTEGER :: JKAQ ! counter for aerosols -! -!------------------------------------------------------------------------------- -! -!* 1. compute the evaporation of r_r: RREVAV -! -!When partial reevaporation of precip takes place, the fraction of -!tracer precipitating form above is reevaporated is equal to -!half of the evaporation rate of water -! -! Rain water evaporated during PTSTEP in kg/kg -ZZEVAP(:,:,:) = PEVAP3D(:,:,:) * PTSTEP -! -! Fraction of rain water evaporated -! at this stage (bulk), we consider that the flux of evaporated aerosol -! is a ratio of the evaporated rain water. -! It will interested to calculate with a two moment scheme (C2R2 or C3R5) -! the complete evaporation of rain droplet to use it for the compuation -! of the evaporated aerosol flux. -ZWEVAP(:,:,:) = 0.0 -WHERE(PRRT(:,:,:) .GT. KRTMIN(3)) - ZWEVAP(:,:,:) = ZZEVAP(:,:,:) / (PRRT(:,:,:)) -END WHERE -ZWEVAP(:,:,:) = MIN(ZWEVAP(:,:,:), 1.0) -ZWEVAP(:,:,:) = MAX(ZWEVAP(:,:,:), 0.0) -! -! -!* 2. compute the mask of r_c evaporation : all cloud is evaporated -! no partial cloud evaporation at this stage -! -ZMASK(:,:,:) = 0. -WHERE(PRCT(:,:,:) .LT. KRTMIN(2)) - ZMASK(:,:,:) = 1. -END WHERE -! -DO JKAQ = 1, KMODE - ZZW1(:,:,:) = ZMASK(:,:,:) * PSVT(:,:,:,KMODE+JKAQ) - ZZW2(:,:,:) = ZWEVAP(:,:,:) * PSVT(:,:,:,KMODE*2+JKAQ) -! - ZZW1(:,:,:) = MIN(ZZW1(:,:,:),PSVT(:,:,:,KMODE+JKAQ)) - ZZW2(:,:,:) = MIN(ZZW2(:,:,:),PSVT(:,:,:,KMODE*2+JKAQ)) -! -! 3. New dry aerosol mass -! - PSVT(:,:,:,JKAQ) = PSVT(:,:,:,JKAQ) + ZZW2(:,:,:) + ZZW1(:,:,:) -! -! -! 4. New cloud aerosol mass -! - PSVT(:,:,:,KMODE+JKAQ) = PSVT(:,:,:,KMODE+JKAQ) - ZZW1(:,:,:) -! -! -! 5. New rain aerosol mass -! - PSVT(:,:,:,KMODE*2+JKAQ) = PSVT(:,:,:,KMODE*2+JKAQ) - ZZW2(:,:,:) -END DO -! -END SUBROUTINE AER_WET_DEP_KMT_EVAP -! -!--------------------------------------------------------------------------------------- -! - SUBROUTINE AER_WET_DEP_KMT_EFFIC -! -!* COMPUTES THE EFFICIENCY FACTOR -! ------------------------------ -! -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -! -!------------------------------------------------------------------------------- -! -!* 1. COMPUTES THE EFFICIENCY FACTOR -! -------------------------------------- -! -!* 1.1 compute gravitational velocities -! -!initialize -ZTEMP(:) = ZTHT(:) * (ZPABST(:) / XP00)**(XRD/XCPD) -ZTEMP(:) = MAX(ZTEMP(:), 1.e-12) -! -CALL AER_VELGRAV(ZRG(:,:), ZPABST(:), KMODE, & - ZMU(:), ZVGG(:,:), & - ZDPG(:,:),ZTEMP(:), & - ZCOR(:,:), ZDENSITY_AER(:,:)) - -! Above gives mu (ZMU), v(aerosol)(PVGG, m/s), diffusion (ZDPG, m2/s) -! -!* 1.2 Compute Water Viscocity in kg/m/s Prup. & Klett, p.95 -! -A0 = 1.76 -A1 = -5.5721e-2 -A2 = -1.3943e-3 -A3 = -4.3015e-5 -ZMUW(:) = A0 * EXP(A1*(ZTEMP(:)-273.15) & - + A2*(ZTEMP(:)-273.15) + A3*(ZTEMP(:)-273.15)) * 1.e-3 -! -A1 = -3.5254e-2 -A2 = 4.7163e-4 -A3 = -6.0667e-6 -WHERE (ZTEMP(:) > 273.15) - ZMUW(:) = A0 * EXP(A1*(ZTEMP(:)-273.15) & - + A2*(ZTEMP(:)-273.15) + A3*(ZTEMP(:)-273.15)) * 1.e-3 -END WHERE -ZMUW(:) = MAX(ZMUW(:), 1.e-12) -! -!* 1.3 compute efficiency factor -! -! This gives aerosol collection efficiency by calculating Reynolds number -! schmidt number, stokes number, etc -CALL AER_EFFIC(ZRG(:,:), ZVGG(:,:), & !aerosol radius/velocity - ZRHODREF(:), & !Air density - ZMUW(:), ZMU(:), & !mu water/air - ZDPG(:,:), ZEFC(:,:), & !diffusivity, efficiency - ZRRT(:), KMODE, & !Rain water, nb aerosols modes - ZTEMP(:),ZCOR(:,:), & ! Temperature, Cunnimgham coeff - ZDENSITY_AER(:,:), & ! aerosol density - ZRR, ZNT ) ! radius and number of rain drops -! -END SUBROUTINE AER_WET_DEP_KMT_EFFIC -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE AER_WET_DEP_KMT_WARM diff --git a/src/PHYEX/ext/aero_effic3D.f90 b/src/PHYEX/ext/aero_effic3D.f90 deleted file mode 100644 index 05d5e2ce1..000000000 --- a/src/PHYEX/ext/aero_effic3D.f90 +++ /dev/null @@ -1,247 +0,0 @@ -!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -! -! ######spll - MODULE MODI_AERO_EFFIC3D -!! ######################## -!! -! -INTERFACE -!! -SUBROUTINE AERO_EFFIC3D(PRG,PVGG, & !aerosol radius/fall speed (m/s) - PRHODREF, & !Air density - PMUW, PMU, & !mu water/air - PDPG, & !diffusivity - PURR, & ! Rain water m.r. at time t - KMODE, & ! Number of aerosol modes - PTEMP, PCOR, & ! air temp, cunningham corr factor - PDENSITY_AER, & ! aerosol density - PEFFIC_AER ) ! scavenging efficiency for aerosol -! -IMPLICIT NONE -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRG, PVGG -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PDPG -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMU, PMUW -REAL, DIMENSION(:,:,:), INTENT(IN) :: PURR -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTEMP -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PCOR -INTEGER, INTENT(IN) :: KMODE -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PDENSITY_AER -REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PEFFIC_AER - - - -END SUBROUTINE AERO_EFFIC3D -!! -END INTERFACE -END MODULE MODI_AERO_EFFIC3D -! ######spll -SUBROUTINE AERO_EFFIC3D(PRG,PVGG, & !aerosol radius/fall speed (m/s) - PRHODREF, & !Air density - PMUW, PMU, & !mu water/air - PDPG, & !diffusivity - PURR, & ! Rain water m.r. at time t - KMODE, & ! Number of aerosol modes - PTEMP, PCOR, & ! air temp, cunningham corr factor - PDENSITY_AER, & ! aerosol density - PEFFIC_AER ) ! scavenging efficiency for aerosol -!! ####################################### -!!**********AERO_EFFIC3D********** -!! PURPOSE -!! ------- -!! Calculate the collection efficiency of -! a falling drop interacting with a dust aerosol -! for use with aer_wet_dep_kmt_warm.f90 -!! -!!** METHOD -!! ------ -!! Using basic theory, and the one dimensional variables sent -!! from aer_wet_dep_kmt_warm.f90, calculation of the average -!! fall speed calculations, chapter 17.3.4, MESONH Handbook -!! droplet number based on the Marshall_Palmer distribution -!! and Stokes number, Reynolds number, etc. based on theory -!! (S&P, p.1019) -!! -!! REFERENCE -!! --------- -!! Seinfeld and Pandis p.1019 -!! MESONH Handbook chapter 17.3.4 -!! -!! AUTHOR -!! ------ -!! K. Crahan Kaku / P. Tulet (CNRM/GMEI) -!! -!! MODIFICATIONS -!! ------------- -!! Philippe Wautelet 28/05/2018: corrected truncated integer division (1/12 -> 1./12.) -!! -!----------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_RAIN_ICE_PARAM_n -USE MODD_RAIN_ICE_DESCR_n -USE MODD_CST, ONLY : XPI, XRHOLW, XP00, XRD -USE MODD_PARAMETERS , ONLY : JPVEXT -USE MODD_REF, ONLY : XTHVREFZ -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRG, PVGG -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PDPG -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMU, PMUW -REAL, DIMENSION(:,:,:), INTENT(IN) :: PURR -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTEMP -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PCOR -INTEGER, INTENT(IN) :: KMODE -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PDENSITY_AER -REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PEFFIC_AER -! -!* 0.2 declaration of local variables -! -INTEGER :: IKB ! Coordinates of the first physical - ! points along z -REAL :: ZRHO00 ! Surface reference air density -!viscosity ratio, Reynolds number -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZOMG, ZREY -!rain radius, m, and rain fall speed, m/s; aerosol radius (m), -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZRR, ZVR -!lambda, number concentration according to marshall palmer, -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZNT, ZLBDA -! Rain water m.r. source -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZRRS -!RHO_dref*r_r, Rain LWC -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZRLWC -! schmidts number -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),KMODE) :: ZSCH -! -!Stokes number, ratio of diameters,aerosol radius -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),KMODE) :: ZSTO, ZPHI, ZRG -! S Star Term -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZSTA, ZDIFF, ZTAU -! -!Term 1, Term 2, Term 3, Term 4 such that -! E = Term1 * Term 2 + Term 3 + Term 4 -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),KMODE) :: ZT1, ZT2 -REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),KMODE) :: ZT3, ZT4 -! -INTEGER :: JI,JK -! -!----------------------------------------------------------------- -ZLBDA = 1E20 -ZNT = 1E-20 -ZRR = 10E-6 -ZRRS(:,:,:)=PURR(:,:,:) -IKB = 1 + JPVEXT -ZRHO00 = XP00/(XRD*XTHVREFZ(IKB)) -ZRG(:,:,:,:)=PRG(:,:,:,:)*1.E-6 !change units to meters -! -!Fall Speed calculations -!similar to rain_ice.f90, chapter 17.3.4, MESONH Handbook -! -ZVR (:,:,:)= XFSEDR * ZRRS(:,:,:)**(XEXSEDR-1) * & - PRHODREF(:,:,:)**(XEXSEDR-XCEXVT-1) - -! Drop Radius calculation in m -!lbda = pi*No*rho(lwc)/(rho(dref)*rain rate) p.212 MESONH Handbook -! compute the slope parameter Lbda_r - -WHERE((ZRRS(:,:,:).GT. 0.).AND.(PRHODREF(:,:,:) .GT. 0.)) - -ZLBDA(:,:,:) = XLBR*(PRHODREF(:,:,:)*ZRRS(:,:,:))**XLBEXR -!Number concentration NT=No/lbda p. 415 Jacobson -ZNT(:,:,:) = XCCR/ZLBDA(:,:,:) -!rain lwc (kg/m3) = rain m.r.(kg/kg) * rho_air(kg/m3) -ZRLWC(:,:,:)=ZRRS(:,:,:)*PRHODREF(:,:,:) -!4/3 *pi *r**3*NT*rho_eau(kg/m3) =rho(lwc)=rho(air)* qc(kg/kg) -ZRR(:,:,:) = (ZRLWC(:,:,:)/(XRHOLW*ZNT(:,:,:)*4./3.*XPI))**(1./3.) -END WHERE - -ZRR(:,:,:) = MIN(ZRR(:,:,:), 100.E-6) - - -!Fall speed cannot be faster than 7 m/s -ZVR (:,:,:)=MIN(ZVR (:,:,:),7.) - - -!Ref SEINFELD AND PANDIS p.1019 -! Viscosity Ratio -ZOMG(:,:,:)=PMUW(:,:,:)/PMU(:,:,:) -!!Reynolds number -ZREY(:,:,:)=ZRR(:,:,:)*ZVR(:,:,:)*PRHODREF(:,:,:)/PMU(:,:,:) -ZREY(:,:,:)= MAX(ZREY(:,:,:), 1E-2) - - -!S Star -ZSTA(:,:,:)=(1.2+(1./12.)*LOG(1.+ZREY(:,:,:)))/(1.+LOG(1.+ZREY(:,:,:))) - -PEFFIC_AER(:,:,:,:)=0.0 - -DO JI=1,KMODE - -! -!Scmidts number - ZSCH(:,:,:,JI)=PMU(:,:,:)/PRHODREF(:,:,:)/PDPG(:,:,:,JI) -! Rain-Aerosol relative velocity - ZDIFF(:,:,:) = MAX(ZVR(:,:,:)-PVGG(:,:,:,JI),0.) - - -! Relaxation time - ZTAU(:,:,:) = (ZRG(:,:,:,JI)*2.)**2. * PDENSITY_AER(:,:,:,JI) * PCOR(:,:,:,JI) / (18.*PMU(:,:,:)) - - -! Stockes number - ZSTO(:,:,:,JI)= ZTAU(:,:,:) * ZDIFF(:,:,:) / ZRR(:,:,:) - - - -!Ratio of diameters - ZPHI(:,:,:,JI)=ZRG(:,:,:,JI)/ZRR(:,:,:) - ZPHI(:,:,:,JI)=MIN(ZPHI(:,:,:,JI), 1.) -!Term 1 - ZT1(:,:,:,JI)=4.0/ZREY(:,:,:)/ZSCH(:,:,:,JI) - -!Term 2 - ZT2(:,:,:,JI)=1.0+(0.4*ZREY(:,:,:)**(0.5)*ZSCH(:,:,:,JI)**(1./3.))+ & - (0.16*ZREY(:,:,:)**(0.5)*ZSCH(:,:,:,JI)**(0.5)) - -!Brownian diffusion - ZT1(:,:,:,JI)= ZT1(:,:,:,JI)*ZT2(:,:,:,JI) - -!Term 3 - interception - ZT3(:,:,:,JI)=4.*ZPHI(:,:,:,JI)*(1./ZOMG(:,:,:)+ & - (1.0+(2.0*ZREY(:,:,:)**0.5))*ZPHI(:,:,:,JI)) - - ZT4(:,:,:,JI)=0.0 - WHERE(ZSTO(:,:,:,JI).GT.ZSTA(:,:,:)) -!Term 4 - impaction - ZT4(:,:,:,JI)=((ZSTO(:,:,:,JI)-ZSTA(:,:,:))/ & - (ZSTO(:,:,:,JI)-ZSTA(:,:,:)+2./3.))**(3./2.) & - *((XRHOLW/PDENSITY_AER(:,:,:,JI))**(1./2.)) - - END WHERE - -!Collision Efficiancy - - - PEFFIC_AER(:,:,:,JI)=ZT1(:,:,:,JI)+ ZT3(:,:,:,JI)+ZT4(:,:,:,JI) - -! Physical radius of a rain collector droplet up than 20 um - -WHERE (ZRR(:,:,:) .LE. 9.9E-6) - PEFFIC_AER(:,:,:,JI)= 0. -END WHERE - -ENDDO - -PEFFIC_AER(:,:,:,:)=MIN(PEFFIC_AER(:,:,:,:),1.0) -PEFFIC_AER(:,:,:,:)=MAX(PEFFIC_AER(:,:,:,:),0.0) - -END SUBROUTINE AERO_EFFIC3D diff --git a/src/PHYEX/ext/aircraft_balloon_evol.f90 b/src/PHYEX/ext/aircraft_balloon_evol.f90 deleted file mode 100644 index d59b33721..000000000 --- a/src/PHYEX/ext/aircraft_balloon_evol.f90 +++ /dev/null @@ -1,1037 +0,0 @@ -!MNH_LIC Copyright 2000-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! Author: Valery Masson (Meteo-France *) -! Original 15/05/2000 -! Modifications: -! G. Jaubert 19/04/2001: add CVBALL type -! P. Lacarrere 03/2008: add 3D fluxes -! M. Leriche 12/12/2008: move ZTDIST out from if.not.(tpflyer%fly) -! V. Masson 15/12/2008: correct do while aircraft move -! O. Caumont 03/2013: add radar reflectivities -! C. Lac 04/2014: allow RARE calculation only if CCLOUD=ICE3 -! O. Caumont 05/2014: modify RARE for hydrometeors containing ice + add bright band calculation for RARE -! C. Lac 02/2015: correction to prevent aircraft crash -! O. Nuissier/F. Duffourg 07/2015: add microphysics diagnostic for aircraft, ballon and profiler -! G. Delautier 10/2016: LIMA -! P. Wautelet 28/03/2018: replace TEMPORAL_DIST by DATETIME_DISTANCE -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! P. Wautelet 01/10/2020: bugfix: initialize GSTORE -! P. Wautelet 14/01/2021: bugfixes: -ZXCOEF and ZYCOEF were not computed if CVBALL -! -PCIT was used if CCLOUD/=ICEx (not allocated) -! -PSEA was always used even if not allocated (CSURF/=EXTE) -! -do not use PMAP if cartesian domain -! P. Wautelet 06/2022: reorganize flyers -! P. Wautelet 01/06/2023: deduplicate code => moved to modd/mode_sensors.f90 -!----------------------------------------------------------------- -! ########################## -MODULE MODE_AIRCRAFT_BALLOON_EVOL -! ########################## - -USE MODE_MSG - -IMPLICIT NONE - -PRIVATE - -PUBLIC :: AIRCRAFT_BALLOON_EVOL - -PUBLIC :: AIRCRAFT_COMPUTE_POSITION - -PUBLIC :: FLYER_GET_RANK_MODEL_ISCRASHED - -CONTAINS -! ######################################################## - SUBROUTINE AIRCRAFT_BALLOON_EVOL(PTSTEP, & - PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, & - PTS, PRHODREF, PCIT, TPFLYER, & - KRANK_CUR, KRANK_NXT, PSEA ) -! ######################################################## -! -! -!!**** *AIRCRAFT_BALLOON_EVOL* - (advects and) stores -!! balloons/aircrafts in the model -!! -!! PURPOSE -!! ------- -! -! -!!** METHOD -!! ------ -!! -!! 1) All the balloons are tested. If the current balloon is -!! a) in the current model -!! b) not crashed -!! the following computations are done. -!! -!! 2) The balloon position is computed. -!! Interpolations at balloon positions are performed according to mass -!! points (because density is computed here for iso-density balloons). -!! Therefore, all model variables are used at mass points. Shuman averaging -!! are performed on X, Y, Z, U, V, W. -!! -!! 3) Storage of balloon data -!! If storage is asked for this time-step, the data are recorded in the -!! balloon time-series. -!! -!! 4) Balloon advection -!! If the balloon is launched, it is advected according its type -!! a) iso-density balloons are advected following horizontal wind. -!! the slope of the iso-density surfaces is neglected. -!! b) radio-sounding balloons are advected according to all wind velocities. -!! the vertical ascent speed is added to the vertical wind speed. -!! c) Constant Volume balloons are advected according to all wind velocities. -!! the vertical ascent speed is computed using the balloon equation -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_AIRCRAFT_BALLOON -USE MODD_CST, ONLY: XCPD, XLVTT -USE MODD_IO, ONLY: ISP -USE MODD_TIME_n, ONLY: TDTCUR -USE MODD_TURB_FLUX_AIRCRAFT_BALLOON, ONLY: XRCW_FLUX, XSVW_FLUX, XTHW_FLUX -! -USE MODE_DATETIME -USE MODE_NEST_ll, ONLY: GET_MODEL_NUMBER_ll -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -REAL, INTENT(IN) :: PTSTEP ! time step -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array -REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! map factor -REAL, INTENT(IN) :: PLONOR ! origine longitude -REAL, INTENT(IN) :: PLATOR ! origine latitude -REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! horizontal wind X component -REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component -REAL, DIMENSION(:,:,:), INTENT(IN) :: PW ! vertical wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! pressure -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTH ! potential temperature -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PR ! water mixing ratios -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSV ! Scalar variables -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE ! turbulent kinetic energy -REAL, DIMENSION(:,:), INTENT(IN) :: PTS ! surface temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry air density of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! pristine ice concentration -! -CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER ! balloon/aircraft -INTEGER, INTENT(IN) :: KRANK_CUR -INTEGER, INTENT(OUT) :: KRANK_NXT -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -! -! -INTEGER :: IMI ! model index -INTEGER :: IKB ! vertical domain sizes -INTEGER :: IKE -INTEGER :: IKU -! -REAL, DIMENSION(2,2,SIZE(PZ,3)) :: ZZM ! mass point coordinates -REAL, DIMENSION(2,2,SIZE(PZ,3)) :: ZZU ! U points z coordinates -REAL, DIMENSION(2,2,SIZE(PZ,3)) :: ZZV ! V points z coordinates -REAL, DIMENSION(2,2,SIZE(PZ,3)) :: ZWM ! mass point wind -! -REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZEXN ! Exner function -REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZTH_EXN ! potential temperature multiplied by Exner function -REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZRHO ! air density -REAL :: ZFLYER_EXN ! balloon/aircraft Exner func. -REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZTHW_FLUX ! -REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZRCW_FLUX ! -REAL, DIMENSION(2,2,SIZE(PSV,3),SIZE(PSV,4)) :: ZSVW_FLUX -! -LOGICAL :: GLAUNCH ! launch/takeoff is effective at this time-step (if true) -LOGICAL :: GOWNER_CUR ! The process is the current owner of the flyer -! -INTEGER :: II_M ! mass balloon position (x index) -INTEGER :: IJ_M ! mass balloon position (y index) -INTEGER :: II_U ! U flux point balloon position (x index) -INTEGER :: IJ_V ! V flux point balloon position (y index) -! -INTEGER :: ISTORE ! time index for storage -! -REAL :: ZTSTEP -TYPE(DATE_TIME) :: TZNEXT ! Time for next position -!---------------------------------------------------------------------------- -IKU = SIZE(PZ,3) - -CALL GET_MODEL_NUMBER_ll(IMI) - -! Set initial value for KRANK_NXT -! It needs to be 0 on all processes except the one where it is when this subroutine is called -! If the flyer flies to an other process, KRANK_NXT will be set accordingly by the current owner -IF ( TPFLYER%NRANK_CUR == ISP ) THEN - GOWNER_CUR = .TRUE. ! This variable is set and used because NRANK_CUR could change in this subroutine - KRANK_NXT = ISP -ELSE - GOWNER_CUR = .FALSE. - KRANK_NXT = 0 -END IF - -SELECT TYPE ( TPFLYER ) - CLASS IS ( TAIRCRAFTDATA) - ! Take-off? - TAKEOFF: IF ( .NOT. TPFLYER%LTOOKOFF ) THEN - ! Do the take-off positioning only once - ! (on model 1 for 'MOB', if aircraft is on an other model, data will be available on the right one anyway) - IF ( ( TPFLYER%CMODEL == 'MOB' .AND. IMI == 1 ) & - .OR. ( TPFLYER%CMODEL == 'FIX' .AND. IMI == TPFLYER%NMODEL ) ) THEN - ! Is the aircraft in flight ? - IF ( TDTCUR >= TPFLYER%TLAUNCH .AND. TDTCUR <= TPFLYER%TLAND ) THEN - TPFLYER%LFLY = .TRUE. - TPFLYER%LTOOKOFF = .TRUE. - END IF - END IF - END IF TAKEOFF - - !Do we have to store aircraft data? - IF ( IMI == TPFLYER%NMODEL ) THEN - TPFLYER%LSTORE = TPFLYER%TFLYER_TIME%STORESTEP_CHECK_AND_SET( ISTORE ) - IF ( TPFLYER%LSTORE ) TPFLYER%NSTORE_CUR = ISTORE - END IF - - - ! For aircrafts, data has only to be computed at store moments - IF ( IMI == TPFLYER%NMODEL .AND. TPFLYER%LFLY .AND. TPFLYER%LSTORE ) THEN - ! Check if it is the right moment to store data - IF ( ABS( TDTCUR - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) < 1e-10 ) THEN - ISOWNERAIR: IF ( TPFLYER%NRANK_CUR == ISP ) THEN - CALL FLYER_INTERP_TO_MASSPOINTS() - - ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( ) - ZRHO(:,:,:) = FLYER_COMPUTE_RHO( ) - - ZTHW_FLUX(:,:,:) = ZRHO(:,:,:)*XCPD *XTHW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:) - ZRCW_FLUX(:,:,:) = ZRHO(:,:,:)*XLVTT*XRCW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:) - ZSVW_FLUX(:,:,:,:) = XSVW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:,:) - - ! Compute coefficents for horizontal interpolations - CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1( ) - ! Compute coefficents for vertical interpolations - CALL FLYER_COMPUTE_INTERP_COEFF_VER( ) - ! Compute coefficents for horizontal interpolations - CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2( ) - - CALL FLYER_RECORD_DATA( ) - END IF ISOWNERAIR - - ! Store has been done - TPFLYER%LSTORE = .FALSE. - END IF - END IF - - ! Compute next position if the previous store has just been done (right moment on right model) - IF ( IMI == TPFLYER%NMODEL .AND. ISTORE > 0 ) THEN - ! This condition may only be tested if ISTORE > 0 - IF (ABS( TDTCUR - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) < 1e-10 ) THEN - ! Next store moment - TZNEXT = TDTCUR + TPFLYER%TFLYER_TIME%XTSTEP - - ! Is the aircraft in flight ? - IF ( TZNEXT >= TPFLYER%TLAUNCH .AND. TZNEXT <= TPFLYER%TLAND ) THEN - TPFLYER%LFLY = .TRUE. - ! Force LTOOKOFF to prevent to do it again (at a next timestep) - TPFLYER%LTOOKOFF = .TRUE. - - ! Compute next position - CALL AIRCRAFT_COMPUTE_POSITION( TZNEXT, TPFLYER ) - - ! Get rank of the process where the aircraft is and the model number - CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER ) - ELSE - TPFLYER%LFLY = .FALSE. - END IF - END IF - END IF - - IF ( GOWNER_CUR ) KRANK_NXT = TPFLYER%NRANK_CUR - - CLASS IS ( TBALLOONDATA) - GLAUNCH = .FALSE. !Set to true only at the launch instant (set to false in flight after launch) - - ! Launch? - LAUNCH: IF ( .NOT. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NMODEL == IMI ) THEN - ! Check if it is launchtime - LAUNCHTIME: IF ( ( TDTCUR - TPFLYER%TLAUNCH ) >= -1.e-10 ) THEN - TPFLYER%LFLY = .TRUE. - GLAUNCH = .TRUE. - - TPFLYER%XX_CUR = TPFLYER%XXLAUNCH - TPFLYER%XY_CUR = TPFLYER%XYLAUNCH - TPFLYER%TPOS_CUR = TDTCUR - END IF LAUNCHTIME - END IF LAUNCH - - ! Check if it is time to store data. This has also to be checked if the balloon - ! is not yet launched or is crashed (data is also written in these cases, but with default values) - IF ( TPFLYER%NMODEL == IMI .AND. & - ( .NOT. TPFLYER%LFLY .OR. TPFLYER%LCRASH .OR. ABS( TPFLYER%TPOS_CUR - TDTCUR ) < 1.e-8 ) ) THEN - !Do we have to store balloon data? - TPFLYER%LSTORE = TPFLYER%TFLYER_TIME%STORESTEP_CHECK_AND_SET( ISTORE ) - IF ( TPFLYER%LSTORE ) TPFLYER%NSTORE_CUR = ISTORE - END IF - - ! In flight - INFLIGHTONMODEL: IF ( TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NMODEL == IMI & - .AND. ABS( TPFLYER%TPOS_CUR - TDTCUR ) < 1.e-8 ) THEN - ISOWNERBAL: IF ( TPFLYER%NRANK_CUR == ISP ) THEN - CALL FLYER_INTERP_TO_MASSPOINTS() - - ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( ) - ZRHO(:,:,:) = FLYER_COMPUTE_RHO( ) - - ZTHW_FLUX(:,:,:) = ZRHO(:,:,:)*XCPD *XTHW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:) - ZRCW_FLUX(:,:,:) = ZRHO(:,:,:)*XLVTT*XRCW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:) - ZSVW_FLUX(:,:,:,:) = XSVW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:,:) - - ! Compute coefficents for horizontal interpolations - CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1( ) - - IF ( GLAUNCH ) CALL BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION( TPFLYER ) - - ! Compute coefficents for vertical interpolations - CALL FLYER_COMPUTE_INTERP_COEFF_VER( ) - - CRASH_VERT: IF ( TPFLYER%LCRASH ) THEN - TPFLYER%LFLY = .FALSE. - WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, & - 's (too low or too high)' )" ) & - TRIM( TPFLYER%CNAME ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) - ELSE CRASH_VERT - !No vertical crash - - ! Compute coefficents for horizontal interpolations - CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2( ) - - ! Check if it is the right moment to store data - IF ( TPFLYER%LSTORE ) THEN - ISTORE = TPFLYER%TFLYER_TIME%N_CUR - IF ( ABS( TDTCUR - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) < 1e-10 ) THEN - CALL FLYER_RECORD_DATA( ) - END IF - END IF - - ! Compute next horizontal position (balloon advection) - CALL BALLOON_ADVECTION_HOR( TPFLYER ) - - ! Compute next vertical position (balloon advection) - CALL BALLOON_ADVECTION_VER( TPFLYER ) - - TPFLYER%TPOS_CUR = TDTCUR + ZTSTEP - END IF CRASH_VERT !end of no vertical crash branch - END IF ISOWNERBAL - END IF INFLIGHTONMODEL - - IF ( GOWNER_CUR ) KRANK_NXT = TPFLYER%NRANK_CUR -END SELECT - -CONTAINS - -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION( TPBALLOON ) - -USE MODD_CST, ONLY: XCPD, XP00, XRD - -IMPLICIT NONE - -CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON - -LOGICAL :: GLOW, GHIGH - -SELECT CASE ( TPBALLOON%CTYPE ) - ! - ! Iso-density balloon - ! - CASE ( 'ISODEN' ) - IF ( TPBALLOON%XALTLAUNCH /= XNEGUNDEF ) THEN - CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPBALLOON%XALTLAUNCH, ZZM, GLOW, GHIGH ) - TPBALLOON%XRHO = TPBALLOON%INTERP_FROM_MASSPOINT( ZRHO ) - ELSE IF ( TPBALLOON%XPRES /= XNEGUNDEF ) THEN - ZFLYER_EXN = (TPBALLOON%XPRES/XP00)**(XRD/XCPD) - CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', ZFLYER_EXN, ZEXN, GLOW, GHIGH ) - TPBALLOON%XRHO = TPBALLOON%INTERP_FROM_MASSPOINT( ZRHO ) - ELSE - CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM(TPBALLOON%CNAME) // ' )' - CMNHMSG(2) = 'neither initial ALTITUDE or PRESsure is given' - CMNHMSG(3) = 'Check your INI_BALLOON routine' - CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) - END IF - ! - ! Radiosounding balloon - ! - CASE ( 'RADIOS' ) - TPBALLOON%XZ_CUR = TPBALLOON%XALTLAUNCH - TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,1,IKB) ) - TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) ) - TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) ) - TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) ) - IF ( TPBALLOON%XZ_CUR > TPBALLOON%XALTLAUNCH ) THEN - WRITE( CMNHMSG(1), '(A)' ) 'initial vertical position of ' // TRIM( TPBALLOON%CNAME ) // ' was too low' - WRITE( CMNHMSG(2), '( "forced to ", EN12.3, " (instead of ", EN12.3, ")" )' ) TPBALLOON%XZ_CUR, TPBALLOON%XALTLAUNCH - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION', OLOCAL = .TRUE. ) - END IF - ! - ! Constant Volume Balloon - ! - CASE ( 'CVBALL' ) - IF ( TPBALLOON%XALTLAUNCH /= XNEGUNDEF ) THEN - CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPBALLOON%XALTLAUNCH, ZZM, GLOW, GHIGH ) - IF ( GLOW ) THEN - TPBALLOON%XZ_CUR = TPBALLOON%XALTLAUNCH - TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,1,IKB) ) - TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) ) - TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) ) - TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) ) - - WRITE( CMNHMSG(1), '(A)' ) 'initial vertical position of ' // TRIM( TPBALLOON%CNAME ) // ' was too low' - WRITE( CMNHMSG(2), '( "forced to ", EN12.3, " (instead of ", EN12.3, ")" )' ) TPBALLOON%XZ_CUR, TPBALLOON%XALTLAUNCH - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION', OLOCAL = .TRUE. ) - - !Recompute the vertical interpolation coefficients at the corrected vertical position - CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPBALLOON%XALTLAUNCH, ZZM, GLOW, GHIGH ) - ELSE - TPBALLOON%XZ_CUR = TPBALLOON%INTERP_FROM_MASSPOINT( ZZM ) - END IF - TPBALLOON%XRHO = TPBALLOON%INTERP_FROM_MASSPOINT( ZRHO ) - ELSE IF ( TPBALLOON%XPRES /= XNEGUNDEF ) THEN - ZFLYER_EXN = (TPBALLOON%XPRES/XP00)**(XRD/XCPD) - CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', ZFLYER_EXN, ZEXN, GLOW, GHIGH ) - IF ( GLOW ) THEN - TPBALLOON%XZ_CUR = ZZM(1,1,IKB) - TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) ) - TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) ) - TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) ) - - WRITE( CMNHMSG(1), '(A)' ) 'initial vertical position of ' // TRIM( TPBALLOON%CNAME ) // ' was too low' - WRITE( CMNHMSG(2), '( "forced to ", EN12.3 )' ) TPBALLOON%XZ_CUR - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION', OLOCAL = .TRUE. ) - - !Recompute the vertical interpolation coefficients at the corrected vertical position - CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPBALLOON%XZ_CUR, ZZM, GLOW, GHIGH ) - ELSE - TPBALLOON%XZ_CUR = TPBALLOON%INTERP_FROM_MASSPOINT( ZZM ) - END IF - TPBALLOON%XRHO = TPBALLOON%INTERP_FROM_MASSPOINT( ZRHO ) - ELSE - TPBALLOON%XRHO = TPBALLOON%XMASS / TPBALLOON%XVOLUME - CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPBALLOON%XRHO, ZRHO, GLOW, GHIGH ) - IF ( GLOW ) THEN - TPBALLOON%XZ_CUR = ZZM(1,1,IKB) - TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) ) - TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) ) - TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) ) - - WRITE( CMNHMSG(1), '(A)' ) 'initial vertical position of ' // TRIM( TPBALLOON%CNAME ) // ' was too low' - WRITE( CMNHMSG(2), '( "forced to ", EN12.3 )' ) TPBALLOON%XZ_CUR - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION', OLOCAL = .TRUE. ) - - !Recompute the vertical interpolation coefficients at the corrected vertical position - CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPBALLOON%XZ_CUR, ZZM, GLOW, GHIGH ) - ELSE - TPBALLOON%XZ_CUR = TPBALLOON%INTERP_FROM_MASSPOINT( ZZM ) - END IF - END IF -END SELECT - -END SUBROUTINE BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE BALLOON_ADVECTION_HOR( TPBALLOON ) - -USE MODD_AIRCRAFT_BALLOON, ONLY: TBALLOONDATA -USE MODD_CONF, ONLY: LCARTESIAN -USE MODD_NESTING, ONLY: NDAD, NDTRATIO -USE MODD_TIME, only: TDTSEG -USE MODD_TIME_n, ONLY: TDTCUR - -IMPLICIT NONE - -CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON - -INTEGER :: IMODEL -INTEGER :: IMODEL_OLD -REAL :: ZX_OLD, ZY_OLD -REAL :: ZDELTATIME -REAL :: ZDIVTMP -REAL :: ZMAP ! map factor at balloon location -REAL :: ZU_BAL ! horizontal wind speed at balloon location (along x) -REAL :: ZV_BAL ! horizontal wind speed at balloon location (along y) - -ZTSTEP = PTSTEP - -ZU_BAL = TPBALLOON%INTERP_FROM_UPOINT( PU ) -ZV_BAL = TPBALLOON%INTERP_FROM_VPOINT( PV ) -if ( .not. lcartesian ) then - ZMAP = TPBALLOON%INTERP_HOR_FROM_MASSPOINT( PMAP ) -else - ZMAP = 1. -end if -! -ZX_OLD = TPBALLOON%XX_CUR -ZY_OLD = TPBALLOON%XY_CUR - -TPBALLOON%XX_CUR = TPBALLOON%XX_CUR + ZU_BAL * ZTSTEP * ZMAP -TPBALLOON%XY_CUR = TPBALLOON%XY_CUR + ZV_BAL * ZTSTEP * ZMAP - -! Compute rank and model for next position -! This is done here because we need to check if there is a change of model (for 'MOB' balloons) -! because position has to be adapted to the timestep of a coarser model (if necessary) -IMODEL_OLD = TPBALLOON%NMODEL - -! Get rank of the process where the balloon is and the model number -CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPBALLOON ) - -IF ( TPBALLOON%LCRASH ) THEN - WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, & - 's (out of the horizontal boundaries)' )" ) & - TRIM( TPBALLOON%CNAME ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) -END IF - -IF ( TPBALLOON%NMODEL /= IMODEL_OLD .AND. .NOT. TPBALLOON%LCRASH ) THEN - ! Balloon has changed of model - IF ( NDAD(TPBALLOON%NMODEL ) == IMODEL_OLD ) THEN - ! Nothing special to do when going to child model - ELSE IF ( TPBALLOON%NMODEL == NDAD(IMODEL_OLD) ) THEN - ! Balloon go to parent model - ! Recompute position to be compatible with parent timestep - ! Parent timestep could be bigger (factor NDTRATIO) and therefore next position is not the one computed just before - - ! Determine step compatible with parent model at next parent timestep - ZDELTATIME = TDTCUR - TDTSEG - ZDIVTMP = ZDELTATIME / ( PTSTEP * NDTRATIO(IMODEL_OLD) ) - IF ( ABS( ZDIVTMP - NINT( ZDIVTMP ) ) < 1E-6 * PTSTEP * NDTRATIO(IMODEL_OLD) ) THEN - ! Current time is a multiple of parent timestep => next position is parent timestep - ZTSTEP = ZTSTEP * NDTRATIO(IMODEL_OLD) - ELSE - ! Current time is not a multiple of parent timestep - ! Next position must be a multiple of parent timestep - ! NINT( NDTRATIO(IMODEL_OLD) * ( 1 - ( ZDIVTMP - INT( ZDIVTMP ) ) ) ) corresponds to the number - ! of child timesteps to go to the next parent timestep - ! We skip one timestep (+NDTRATIO(IMODEL_OLD)) because it has already been computed for the parent model - ZTSTEP = ZTSTEP * ( NINT( NDTRATIO(IMODEL_OLD) * ( 1 - ( ZDIVTMP - INT( ZDIVTMP ) ) ) ) + NDTRATIO(IMODEL_OLD) ) - - ! Detect if we need to skip a store (if time of next position is after time of next store) - ! This can happen when a ballon goes to its parent model - IF ( TDTCUR + ZTSTEP > TPBALLOON%TFLYER_TIME%TPDATES(TPBALLOON%TFLYER_TIME%N_CUR) + TPBALLOON%TFLYER_TIME%XTSTEP + 1e-6 ) THEN - !Force a dummy store (nothing is computed, therefore default/initial values will be stored) - TPBALLOON%LSTORE = .TRUE. - - TPBALLOON%TFLYER_TIME%N_CUR = TPBALLOON%TFLYER_TIME%N_CUR + 1 - ISTORE = TPBALLOON%TFLYER_TIME%N_CUR - - !Remark: by construction here, ISTORE is always > 1 => no risk with ISTORE-1 value - TPBALLOON%TFLYER_TIME%TPDATES(ISTORE) = TPBALLOON%TFLYER_TIME%TPDATES(ISTORE-1) + TPBALLOON%TFLYER_TIME%XTSTEP - - WRITE( CMNHMSG(1), "( 'Balloon ', A, ': store skipped at ', I2, '/', I2, '/', I4, ' at ', F18.12, 's' )" ) & - TRIM( TPBALLOON%CNAME ), & - TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%NDAY, TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%NMONTH, & - TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%NYEAR, TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%XTIME - CMNHMSG(2) = 'due to change of model (child to its parent)' - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) - END IF - END IF - - ! Compute new horizontal position - TPBALLOON%XX_CUR = TPBALLOON%XX_CUR + ZU_BAL * ZTSTEP * ZMAP - TPBALLOON%XY_CUR = TPBALLOON%XY_CUR + ZV_BAL * ZTSTEP * ZMAP - - ! Get rank of the process where the balloon is and the model number - ! Model number is now imposed - IMODEL = TPBALLOON%NMODEL - CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPBALLOON, KMODEL = IMODEL ) - IF ( TPBALLOON%LCRASH ) THEN - WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, & - 's (out of the horizontal boundaries)' )" ) & - TRIM( TPBALLOON%CNAME ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) - END IF - ELSE - ! Special case not-managed (different dads, change of several models in 1 step (going to grand parent/grand children)...) - ! This situation should be very infrequent => reasonable risk, error on the trajectory should be relatively small in most cases - CMNHMSG(1) = 'unmanaged change of model for ballon ' // TPBALLOON%CNAME - CMNHMSG(2) = 'its trajectory might be wrong' - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) - END IF -END IF - -END SUBROUTINE BALLOON_ADVECTION_HOR -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE BALLOON_ADVECTION_VER( TPBALLOON ) - -USE MODD_AIRCRAFT_BALLOON, ONLY: TBALLOONDATA -USE MODD_CST, ONLY: XG - -IMPLICIT NONE - -CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON - -INTEGER :: JK ! loop index -REAL :: ZRO_BAL ! air density at balloon location -REAL :: ZW_BAL ! vertical wind speed at balloon location (along z) - -IF ( TPBALLOON%CTYPE == 'RADIOS' ) THEN - ZW_BAL = TPBALLOON%INTERP_FROM_MASSPOINT( ZWM ) - TPBALLOON%XZ_CUR = TPBALLOON%XZ_CUR + ( ZW_BAL + TPBALLOON%XWASCENT ) * ZTSTEP -END IF - -IF ( TPBALLOON%CTYPE == 'CVBALL' ) THEN - ZW_BAL = TPBALLOON%INTERP_FROM_MASSPOINT( ZWM ) - ZRO_BAL = TPBALLOON%INTERP_FROM_MASSPOINT( ZRHO ) - ! calculation with a time step of 1 second or less - IF (INT(ZTSTEP) .GT. 1 ) THEN - DO JK=1,INT(ZTSTEP) - TPBALLOON%XWASCENT = TPBALLOON%XWASCENT & - - ( 1. / (1. + TPBALLOON%XINDDRAG ) ) * 1. * & - ( XG * ( ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) - ZRO_BAL ) / ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) & - + TPBALLOON%XWASCENT * ABS ( TPBALLOON%XWASCENT ) * & - TPBALLOON%XDIAMETER * TPBALLOON%XAERODRAG / ( 2. * TPBALLOON%XVOLUME ) & - ) - TPBALLOON%XZ_CUR = TPBALLOON%XZ_CUR + ( ZW_BAL + TPBALLOON%XWASCENT ) * 1. - END DO - END IF - IF (ZTSTEP .GT. INT(ZTSTEP)) THEN - TPBALLOON%XWASCENT = TPBALLOON%XWASCENT & - - ( 1. / (1. + TPBALLOON%XINDDRAG ) ) * (ZTSTEP-INT(ZTSTEP)) * & - ( XG * ( ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) - ZRO_BAL ) / ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) & - + TPBALLOON%XWASCENT * ABS ( TPBALLOON%XWASCENT ) * & - TPBALLOON%XDIAMETER * TPBALLOON%XAERODRAG / ( 2. * TPBALLOON%XVOLUME ) & - ) - TPBALLOON%XZ_CUR = TPBALLOON%XZ_CUR + ( ZW_BAL + TPBALLOON%XWASCENT ) * (ZTSTEP-INT(ZTSTEP)) - END IF -END IF - -END SUBROUTINE BALLOON_ADVECTION_VER -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE FLYER_INTERP_TO_MASSPOINTS() - -USE MODD_GRID_n, ONLY: XXHAT, XXHATM, XYHAT, XYHATM -USE MODD_PARAMETERS, ONLY: JPVEXT - -IMPLICIT NONE - -INTEGER :: IDU ! difference between II_U and II_M -INTEGER :: IDV ! difference between IJ_V and IJ_M - -! Indices -IKB = 1 + JPVEXT -IKE = SIZE(PZ,3) - JPVEXT - -! Interpolations of model variables to mass points -! ------------------------------------------------ - -! X position -TPFLYER%NI_U = COUNT( XXHAT (:) <= TPFLYER%XX_CUR ) -TPFLYER%NI_M = COUNT( XXHATM(:) <= TPFLYER%XX_CUR ) -II_U = TPFLYER%NI_U -II_M = TPFLYER%NI_M - -! Y position -TPFLYER%NJ_V = COUNT( XYHAT (:)<=TPFLYER%XY_CUR ) -TPFLYER%NJ_M = COUNT( XYHATM(:)<=TPFLYER%XY_CUR ) -IJ_V = TPFLYER%NJ_V -IJ_M = TPFLYER%NJ_M - -ZZM(:,:,1:IKU-1)=0.5 *PZ(II_M :II_M+1,IJ_M :IJ_M+1,1:IKU-1)+0.5 *PZ(II_M :II_M+1,IJ_M :IJ_M+1,2:IKU ) -ZZM(:,:, IKU )=1.5 *PZ(II_M :II_M+1,IJ_M :IJ_M+1, IKU-1)-0.5 *PZ(II_M :II_M+1,IJ_M :IJ_M+1, IKU-2) - -IDU = II_U - II_M -ZZU(:,:,1:IKU-1)=0.25*PZ(IDU+II_M-1:IDU+II_M, IJ_M :IJ_M+1,1:IKU-1)+0.25*PZ(IDU+II_M-1:IDU+II_M ,IJ_M :IJ_M+1,2:IKU ) & - +0.25*PZ(IDU+II_M :IDU+II_M+1,IJ_M :IJ_M+1,1:IKU-1)+0.25*PZ(IDU+II_M :IDU+II_M+1,IJ_M :IJ_M+1,2:IKU ) -ZZU(:,:, IKU )=0.75*PZ(IDU+II_M-1:IDU+II_M ,IJ_M :IJ_M+1, IKU-1)-0.25*PZ(IDU+II_M-1:IDU+II_M ,IJ_M :IJ_M+1, IKU-2) & - +0.75*PZ(IDU+II_M :IDU+II_M+1,IJ_M :IJ_M+1, IKU-1)-0.25*PZ(IDU+II_M :IDU+II_M+1,IJ_M :IJ_M+1, IKU-2) - -IDV = IJ_V - IJ_M -ZZV(:,:,1:IKU-1)=0.25*PZ(II_M :II_M+1,IDV+IJ_M-1:IDV+IJ_M ,1:IKU-1)+0.25*PZ(II_M :II_M+1,IDV+IJ_M-1:IDV+IJ_M ,2:IKU ) & - +0.25*PZ(II_M :II_M+1,IDV+IJ_M :IDV+IJ_M+1,1:IKU-1)+0.25*PZ(II_M :II_M+1,IDV+IJ_M :IDV+IJ_M+1,2:IKU ) -ZZV(:,:, IKU )=0.75*PZ(II_M :II_M+1,IDV+IJ_M-1:IDV+IJ_M , IKU-1)-0.25*PZ(II_M :II_M+1,IDV+IJ_M-1:IDV+IJ_M , IKU-2) & - +0.75*PZ(II_M :II_M+1,IDV+IJ_M :IDV+IJ_M+1, IKU-1)-0.25*PZ(II_M :II_M+1,IDV+IJ_M :IDV+IJ_M+1, IKU-2) - -ZWM(:,:,1:IKU-1)=0.5*PW(II_M:II_M+1,IJ_M:IJ_M+1,1:IKU-1)+0.5*PW(II_M:II_M+1,IJ_M:IJ_M+1,2:IKU ) -ZWM(:,:, IKU )=1.5*PW(II_M:II_M+1,IJ_M:IJ_M+1, IKU-1)-0.5*PW(II_M:II_M+1,IJ_M:IJ_M+1, IKU-2) - -END SUBROUTINE FLYER_INTERP_TO_MASSPOINTS -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -PURE FUNCTION FLYER_COMPUTE_EXNER( ) RESULT( PEXN ) - -USE MODD_CST, ONLY: XCPD, XP00, XRD - -IMPLICIT NONE - -REAL, DIMENSION(2,2,SIZE(PTH,3)) :: PEXN - -INTEGER :: JK - -PEXN(:,:,:) = ( PP(II_M:II_M+1, IJ_M:IJ_M+1, :) / XP00) ** ( XRD / XCPD ) -DO JK = IKB-1, 1, -1 - PEXN(:,:,JK) = 1.5 * PEXN(:,:,JK+1) - 0.5 * PEXN(:,:,JK+2) -END DO -DO JK = IKE+1, IKU - PEXN(:,:,JK) = 1.5 * PEXN(:,:,JK-1) - 0.5 * PEXN(:,:,JK-2) -END DO - -END FUNCTION FLYER_COMPUTE_EXNER -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -PURE FUNCTION FLYER_COMPUTE_RHO( ) RESULT( PRHO ) - -USE MODD_CST, ONLY: XRD, XRV - -USE MODI_WATER_SUM - -IMPLICIT NONE - -REAL, DIMENSION(2,2,SIZE(PTH,3)) :: PRHO - -INTEGER :: JK -REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZTHV ! virtual potential temperature - -ZTHV(:,:,:) = PTH(II_M:II_M+1, IJ_M:IJ_M+1, :) -IF ( SIZE( PR, 4 ) > 0 ) & - ZTHV(:,:,:) = ZTHV(:,:,:) * ( 1. + XRV / XRD * PR(II_M:II_M+1, IJ_M:IJ_M+1, :, 1) ) & - / ( 1. + WATER_SUM( PR(II_M:II_M+1, IJ_M:IJ_M+1, :, :)) ) -! -PRHO(:,:,:) = PP(II_M:II_M+1, IJ_M:IJ_M+1, :) / ( XRD * ZTHV(:,:,:) * ZEXN(:,:,:) ) -DO JK = IKB-1, 1, -1 - PRHO(:,:,JK) = 1.5 * PRHO(:,:,JK+1) - 0.5 * PRHO(:,:,JK+2) -END DO -DO JK = IKE+1, IKU - PRHO(:,:,JK) = 1.5 * PRHO(:,:,JK-1) - 0.5 * PRHO(:,:,JK-2) -END DO - -END FUNCTION FLYER_COMPUTE_RHO -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1( ) -! Compute coefficents for horizontal interpolations (1st stage) - -USE MODD_GRID_n, ONLY: XXHAT, XXHATM, XYHAT, XYHATM - -IMPLICIT NONE - -! Interpolation coefficient for X -TPFLYER%XXMCOEF = ( TPFLYER%XX_CUR - XXHATM(II_M) ) / ( XXHATM(II_M+1) - XXHATM(II_M) ) -TPFLYER%XXMCOEF = MAX( 0., MIN( TPFLYER%XXMCOEF, 1. ) ) - -! Interpolation coefficient for y -TPFLYER%XYMCOEF = ( TPFLYER%XY_CUR - XYHATM(IJ_M) ) / ( XYHATM(IJ_M+1) - XYHATM(IJ_M) ) -TPFLYER%XYMCOEF = MAX( 0., MIN( TPFLYER%XYMCOEF, 1. ) ) - -! Interpolation coefficient for X (for U) -TPFLYER%XXUCOEF = ( TPFLYER%XX_CUR - XXHAT(II_U) ) / ( XXHAT(II_U+1) - XXHAT(II_U) ) -TPFLYER%XXUCOEF = MAX( 0., MIN( TPFLYER%XXUCOEF, 1. ) ) - -! Interpolation coefficient for y (for V) -TPFLYER%XYVCOEF = ( TPFLYER%XY_CUR - XYHAT(IJ_V) ) / ( XYHAT(IJ_V+1) - XYHAT(IJ_V) ) -TPFLYER%XYVCOEF = MAX( 0., MIN( TPFLYER%XYVCOEF, 1. ) ) - -END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1 -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_VER( ) -! Compute coefficent for vertical interpolations - -USE MODD_CST, ONLY: XCPD, XP00, XRD -USE MODD_TIME_n, ONLY: TDTCUR - -IMPLICIT NONE - -LOGICAL :: GLOW, GHIGH - -! Find indices surrounding the vertical box where the flyer is -SELECT TYPE ( TPFLYER ) - CLASS IS ( TAIRCRAFTDATA) - IF ( TPFLYER%LALTDEF ) THEN - ZFLYER_EXN = (TPFLYER%XP_CUR/XP00)**(XRD/XCPD) - CALL TPFLYER%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', ZFLYER_EXN, ZEXN, GLOW, GHIGH, ODONOLOWCRASH = .TRUE. ) - ELSE - CALL TPFLYER%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPFLYER%XZ_CUR, ZZM, GLOW, GHIGH, ODONOLOWCRASH = .TRUE. ) - END IF - - CLASS IS ( TBALLOONDATA) - IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN - CALL TPFLYER%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPFLYER%XRHO, ZRHO, GLOW, GHIGH, ODONOLOWCRASH = .TRUE. ) - ELSE IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN - CALL TPFLYER%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPFLYER%XZ_CUR, ZZM, GLOW, GHIGH, ODONOLOWCRASH = .TRUE. ) - END IF - -END SELECT - -! Check if the flyer crashed vertically (higher bound) -IF ( GHIGH ) THEN - TPFLYER%LCRASH = .TRUE. - TPFLYER%NCRASH = NCRASH_OUT_HIGH -END IF - -SELECT TYPE ( TPFLYER ) - CLASS IS ( TAIRCRAFTDATA) - IF ( TPFLYER%LALTDEF ) THEN - TPFLYER%XZ_CUR = TPFLYER%INTERP_FROM_MASSPOINT( ZZM ) - ELSE - TPFLYER%XP_CUR = TPFLYER%INTERP_FROM_MASSPOINT( PP ) - END IF - - CLASS IS ( TBALLOONDATA) - IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN - TPFLYER%XZ_CUR = TPFLYER%INTERP_FROM_MASSPOINT( ZZM ) - ELSE IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN - !Nothing to do - END IF - -END SELECT - -END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_VER -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2( ) -! Compute coefficents for horizontal interpolations (2nd stage) -! This stage must be done after FLYER_COMPUTE_INTERP_COEFF_VER because we should need XZ_CUR computed in it - -IMPLICIT NONE - -LOGICAL :: GLOW, GHIGH - -! Interpolation coefficients for the 4 surroundings verticals (for U) -! ODONOLOWCRASH = .TRUE. because check for low crash has already been done -CALL TPFLYER%COMPUTE_VERTICAL_INTERP_COEFF( 'U', TPFLYER%XZ_CUR, ZZU, GLOW, GHIGH, ODONOLOWCRASH = .TRUE. ) - -! Interpolation coefficients for the 4 suroundings verticals (for V) -CALL TPFLYER%COMPUTE_VERTICAL_INTERP_COEFF( 'V', TPFLYER%XZ_CUR, ZZV, GLOW, GHIGH, ODONOLOWCRASH = .TRUE. ) - -END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2 -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE FLYER_RECORD_DATA( ) - -USE MODD_CST, ONLY: XP00, XPI, XRD -USE MODD_DIAG_IN_RUN, ONLY: XCURRENT_TKE_DISS -USE MODD_GRID, ONLY: XBETA, XLON0, XRPK -USE MODD_NSV, ONLY: NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI -USE MODD_PARAMETERS, ONLY: JPVEXT -USE MODD_PARAM_n, ONLY: CCLOUD, CRAD - -USE MODE_GRIDPROJ, ONLY: SM_LATLON -USE MODE_SENSOR, ONLY: Sensor_rare_compute, Sensor_wc_compute - -IMPLICIT NONE - -INTEGER :: JLOOP ! loop counter -REAL :: ZGAM ! rotation between meso-nh base and spherical lat-lon base. -REAL :: ZU_BAL ! horizontal wind speed at balloon location (along x) -REAL :: ZV_BAL ! horizontal wind speed at balloon location (along y) -REAL, DIMENSION(SIZE(PZ,3)) :: ZZ ! altitude of model levels at station location -REAL, DIMENSION(SIZE(PR,1),SIZE(PR,2),SIZE(PR,3)) :: ZR - -TPFLYER%NMODELHIST(ISTORE) = TPFLYER%NMODEL - -TPFLYER%XX(ISTORE) = TPFLYER%XX_CUR -TPFLYER%XY(ISTORE) = TPFLYER%XY_CUR -TPFLYER%XZ(ISTORE) = TPFLYER%XZ_CUR -! -CALL SM_LATLON( PLATOR, PLONOR, & - TPFLYER%XX_CUR, TPFLYER%XY_CUR, & - TPFLYER%XLAT_CUR, TPFLYER%XLON_CUR ) -TPFLYER%XLAT(ISTORE) = TPFLYER%XLAT_CUR -TPFLYER%XLON(ISTORE) = TPFLYER%XLON_CUR -! -ZU_BAL = TPFLYER%INTERP_FROM_UPOINT( PU ) -ZV_BAL = TPFLYER%INTERP_FROM_VPOINT( PV ) -ZGAM = (XRPK * (TPFLYER%XLON_CUR - XLON0) - XBETA)*(XPI/180.) -TPFLYER%XZON (1,ISTORE) = ZU_BAL * COS(ZGAM) + ZV_BAL * SIN(ZGAM) -TPFLYER%XMER (1,ISTORE) = - ZU_BAL * SIN(ZGAM) + ZV_BAL * COS(ZGAM) -! -TPFLYER%XW (1,ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( ZWM ) -TPFLYER%XTH (1,ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( PTH ) -! -ZFLYER_EXN = TPFLYER%INTERP_FROM_MASSPOINT( ZEXN ) -TPFLYER%XP (1,ISTORE) = XP00 * ZFLYER_EXN**(XCPD/XRD) - -ZR(:,:,:) = 0. -DO JLOOP=1,SIZE(PR,4) - TPFLYER%XR (1,ISTORE,JLOOP) = TPFLYER%INTERP_FROM_MASSPOINT( PR(:,:,:,JLOOP) ) - IF (JLOOP>=2) ZR(:,:,:) = ZR(:,:,:) + PR(:,:,:,JLOOP) -END DO -DO JLOOP=1,SIZE(PSV,4) - TPFLYER%XSV (1,ISTORE,JLOOP) = TPFLYER%INTERP_FROM_MASSPOINT( PSV(:,:,:,JLOOP) ) -END DO -TPFLYER%XRTZ (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( ZR(:,:,:) ) -DO JLOOP=1,SIZE(PR,4) - TPFLYER%XRZ (:,ISTORE,JLOOP) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PR(:,:,:,JLOOP) ) -END DO - -TPFLYER%XFFZ (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( SQRT(PU**2+PV**2) ) - -TPFLYER%XRHOD (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PRHODREF ) - -IF (CCLOUD=="LIMA") THEN - TPFLYER%XCIZ (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NI) ) - TPFLYER%XCCZ (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NC) ) - TPFLYER%XCRZ (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NR) ) -ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN - TPFLYER%XCIZ (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PCIT(:,:,:) ) -END IF - -ZTH_EXN(:,:,:) = PTH(TPFLYER%NI_M:TPFLYER%NI_M+1, TPFLYER%NJ_M:TPFLYER%NJ_M+1, :) * ZEXN(:,:,:) -ZZ(:) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( ZZM(:,:,:) ) -TPFLYER%XZZ(:,ISTORE) = ZZ(:) - -CALL Sensor_wc_compute( TPFLYER, ISTORE, PR, PRHODREF ) -CALL Sensor_rare_compute( TPFLYER, ISTORE, PR, PSV, PRHODREF, PCIT, ZTH_EXN, ZZ, PSEA ) - -! vertical wind -TPFLYER%XWZ (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( ZWM(:,:,:) ) - -! Dry air density at flyer position -TPFLYER%XRHOD_SENSOR(ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( PRHODREF ) - -IF (SIZE(PTKE)>0) TPFLYER%XTKE (1,ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( PTKE ) -IF ( CRAD /= 'NONE' ) TPFLYER%XTSRAD(ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT(PTS ) -TPFLYER%XTKE_DISS(ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( XCURRENT_TKE_DISS ) -TPFLYER%XZS(ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PZ(:,:,1+JPVEXT) ) -TPFLYER%XTHW_FLUX(ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( ZTHW_FLUX ) -TPFLYER%XRCW_FLUX(ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( ZRCW_FLUX ) -DO JLOOP=1,SIZE(PSV,4) -TPFLYER%XSVW_FLUX(ISTORE,JLOOP) = TPFLYER%INTERP_FROM_MASSPOINT( ZSVW_FLUX(:,:,:,JLOOP) ) -END DO - -END SUBROUTINE FLYER_RECORD_DATA -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -END SUBROUTINE AIRCRAFT_BALLOON_EVOL -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE AIRCRAFT_COMPUTE_POSITION( TPDATE, TPAIRCRAFT ) - -USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA -USE MODD_TYPE_DATE, ONLY: DATE_TIME - -USE MODE_DATETIME -USE MODE_POSITION_TOOLS, ONLY: FIND_PROCESS_AND_MODEL_FROM_XY_POS - -IMPLICIT NONE - -TYPE(DATE_TIME), INTENT(IN) :: TPDATE -CLASS(TAIRCRAFTDATA), INTENT(INOUT) :: TPAIRCRAFT !aircraft - -INTEGER :: IL ! flight segment index -REAL :: ZTDIST ! time since launch (sec) -REAL :: ZSEG_FRAC ! fraction of flight in the current segment - -! Find the flight segment -ZTDIST = TPDATE - TPAIRCRAFT%TLAUNCH -IL = TPAIRCRAFT%NPOSCUR -DO WHILE ( ZTDIST > TPAIRCRAFT%XPOSTIME(IL+1) ) - IL = IL + 1 - IF ( IL > TPAIRCRAFT%NPOS-1 ) THEN - !Security (should not happen) - IL = TPAIRCRAFT%NPOS-1 - EXIT - END IF -END DO -TPAIRCRAFT%NPOSCUR = IL - -! Compute the current position -ZSEG_FRAC = ( ZTDIST - TPAIRCRAFT%XPOSTIME(IL) ) / ( TPAIRCRAFT%XPOSTIME(IL+1) - TPAIRCRAFT%XPOSTIME(IL) ) - -TPAIRCRAFT%XX_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSX(IL ) & - + ZSEG_FRAC * TPAIRCRAFT%XPOSX(IL+1) -TPAIRCRAFT%XY_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSY(IL ) & - + ZSEG_FRAC * TPAIRCRAFT%XPOSY(IL+1) - -IF (TPAIRCRAFT%LALTDEF) THEN - TPAIRCRAFT%XP_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSP(IL ) & - + ZSEG_FRAC * TPAIRCRAFT%XPOSP(IL+1) -ELSE - TPAIRCRAFT%XZ_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSZ(IL ) & - + ZSEG_FRAC * TPAIRCRAFT%XPOSZ(IL +1) -END IF - -END SUBROUTINE AIRCRAFT_COMPUTE_POSITION -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER, PX, PY, KMODEL ) - -USE MODD_AIRCRAFT_BALLOON, ONLY: NCRASH_NO, NCRASH_OUT_HORIZ, TFLYERDATA - -USE MODE_POSITION_TOOLS, ONLY: FIND_PROCESS_AND_MODEL_FROM_XY_POS - -IMPLICIT NONE - -CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER ! balloon/aircraft -REAL, OPTIONAL, INTENT(IN) :: PX ! X position (if not provided, takes current flyer position) -REAL, OPTIONAL, INTENT(IN) :: PY ! Y position (if not provided, takes current flyer position) -INTEGER, OPTIONAL, INTENT(IN) :: KMODEL ! if provided, model number is imposed (if not 0) - -INTEGER :: IMODEL -INTEGER :: IRANK -REAL :: ZX, ZY - -IF ( PRESENT( KMODEL ) ) THEN - IMODEL = KMODEL -ELSE - IF ( TPFLYER%CMODEL == 'FIX' ) THEN - IMODEL = TPFLYER%NMODEL - ELSE - IMODEL = 0 - END IF -END IF - -IF ( PRESENT( PX ) ) THEN - ZX = PX -ELSE - ZX = TPFLYER%XX_CUR -END IF - -IF ( PRESENT( PY ) ) THEN - ZY = PY -ELSE - ZY = TPFLYER%XY_CUR -END IF - -CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( ZX, ZY, IRANK, IMODEL ) - -IF ( IRANK < 1 ) THEN - ! Flyer is outside of horizontal domain - ! TPFLYER%NMODEL !Do not change to keep a valid value - TPFLYER%LCRASH = .TRUE. - TPFLYER%NCRASH = NCRASH_OUT_HORIZ - TPFLYER%LFLY = .FALSE. -ELSE - TPFLYER%NMODEL = IMODEL - TPFLYER%LCRASH = .FALSE. - TPFLYER%NCRASH = NCRASH_NO - !TPFLYER%LFLY = !Do not touch LFLY (flyer could be in flight or not) - TPFLYER%NRANK_CUR = IRANK -END IF - -END SUBROUTINE FLYER_GET_RANK_MODEL_ISCRASHED -!---------------------------------------------------------------------------- - -END MODULE MODE_AIRCRAFT_BALLOON_EVOL diff --git a/src/PHYEX/ext/boundaries.f90 b/src/PHYEX/ext/boundaries.f90 deleted file mode 100644 index 04860f27e..000000000 --- a/src/PHYEX/ext/boundaries.f90 +++ /dev/null @@ -1,1281 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!##################### -MODULE MODI_BOUNDARIES -!##################### -! -INTERFACE -! - SUBROUTINE BOUNDARIES ( & - PTSTEP,HLBCX,HLBCY,KRR,KSV,KTCOUNT, & - PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & - PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & - PLBXUS,PLBXVS,PLBXWS,PLBXTHS,PLBXTKES,PLBXRS,PLBXSVS, & - PLBYUS,PLBYVS,PLBYWS,PLBYTHS,PLBYTKES,PLBYRS,PLBYSVS, & - PRHODJ,PRHODREF, & - PUT,PVT,PWT,PTHT,PTKET,PRT,PSVT,PSRCT ) -! -REAL, INTENT(IN) :: PTSTEP ! time step dt -CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY ! X and Y-direc. LBC type -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop COUNTer - ! (=1 at the segment beginning) -! -! Lateral Boundary fields at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUM,PLBXVM,PLBXWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYUM,PLBYVM,PLBYWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTKEM ! TKE -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTKEM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBXRM ,PLBXSVM ! Moisture and SV -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRM ,PLBYSVM ! in x and y-dir. -! temporal derivative of the Lateral Boundary fields -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTHS ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYUS,PLBYVS,PLBYWS ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTHS ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTKES ! TKE -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTKES -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBXRS ,PLBXSVS ! Moisture and SV -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRS ,PLBYSVS ! in x and y-dir. -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Jacobian * dry density of - ! the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUT,PVT,PWT,PTHT,PTKET,PSRCT -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT,PSVT - ! Variables at t -! -END SUBROUTINE BOUNDARIES -! -END INTERFACE -! - -END MODULE MODI_BOUNDARIES -! -! -! #################################################################### - SUBROUTINE BOUNDARIES ( & - PTSTEP,HLBCX,HLBCY,KRR,KSV,KTCOUNT, & - PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & - PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & - PLBXUS,PLBXVS,PLBXWS,PLBXTHS,PLBXTKES,PLBXRS,PLBXSVS, & - PLBYUS,PLBYVS,PLBYWS,PLBYTHS,PLBYTKES,PLBYRS,PLBYSVS, & - PRHODJ,PRHODREF, & - PUT,PVT,PWT,PTHT,PTKET,PRT,PSVT,PSRCT ) -! #################################################################### -! -!!**** *BOUNDARIES* - routine to prepare the Lateral Boundary Conditions for -!! all variables at a scalar localization relative to the -!! considered boundary. -!! -!! PURPOSE -!! ------- -! Fill up the left and right lateral EXTernal zones, for all prognostic -! variables, at time t and t-dt, to avoid particular cases close to -! the Lateral Boundaries in routines computing the evolution terms, in -! particular in the advection routines. -! -!!** METHOD -!! ------ -!! 3 different options are proposed: 'WALL' 'CYCL' 'OPEN' -!! to define the Boundary Condition type, -!! though the variables HLBCX and HLBCY (for the X and Y-directions -!! respectively). -!! For the 'OPEN' type of LBC, the treatment depends -!! on the flow configuration: i.e. INFLOW or OUTFLOW conditions. -!! -!! EXTERNAL -!! -------- -!! GET_INDICE_ll : get physical sub-domain bounds -!! LWEAST_ll,LEAST_ll,LNORTH_ll,LSOUTH_ll : position functions -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_PARAMETERS : -!! JPHEXT ,JPVEXT -!! -!! Module MODD_CONF : -!! CCONF -!! -!! Module MODE_UPDATE_NSV : -!! NSV_CHEM, NSV_CHEMBEG, NSV_CHEMEND -!! -!! Module MODD_CTURB : -!! XTKEMIN -!! -!! REFERENCE -!! --------- -!! Book1 and book2 of documentation (routine BOUNDARIES) -!! -!! AUTHOR -!! ------ -!! J.-P. Lafore J. Stein * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 17/10/94 -!! Modification 02/11/94 (J.Stein) copy for t-dt at the external points -!! + change the copy formulation -!! Modification 18/11/94 (J.Stein) bug correction in the normal velocity -!! prescription in the WALL cases -!! Modification 13/02/95 (Lafore) to account for the OPEN case and -!! for the LS fields introduction -!! Modification 03/03/95 (Mallet) corrections in variables names in -!! the Y-OPEN case -!! 16/03/95 (J.Stein) remove R from the historical variables -!! Modification 31/05/95 (Lafore) MASTER_DEV2.1 preparation after the -!! LBC tests performed by I. Mallet -!! Modification 15/03/96 (Richard) bug correction for OPEN CASE: (TOP Y-LBC) -!! Rv case -!! Modification 15/03/96 (Shure) bug correction for SV variable in -!! open x right case -!! Modification 24/10/96 (Masson) initialization of outer points in -!! wall cases for spawning interpolations -!! Modification 13/03/97 (Lafore) "surfacic" LS-fields introduction -!! Modification 10/04/97 (Lafore) proper treatment of minima for TKE and EPS -!! Modification 01/09/97 (Masson) minimum value for water and passive -!! scalars set to zero at instants M,T -!! Modification 20/10/97 (Lafore) introduction of DAVI type of lbc -!! suppression of NEST type -!! Modification 12/11/97 ( Stein ) use the lB fields -!! Modification 02/06/98 (Lafore) declaration of local variables (PLBXUM -!! and PLBXWM do'nt have the same size) -!! Modification 24/08/98 (Jabouille) parallelize the code -!! Modification 20/04/99 ( Stein ) use the same conditions for times t -!! and t-dt -!! Modification 11/04/00 (Mari) special conditions for chemical variables -!! Modification 10/01/01 (Tulet) update for MOCAGE boundary conditions -!! Modification 22/01/01 (Gazen) use NSV_CHEM,NSV_CHEMBEG,NSV_CHEMEND variables -!! Modification 22/06/01(Jabouille) use XSVMIN -!! Modification 20/11/01(Gazen & Escobar) rewrite GCHBOUNDARY for portability -!! Modification 14/03/05 (Tulet) bug : in case of CYCL do not call ch_boundaries -!! Modification 14/05/05 (Tulet) add aerosols / dust -!! Modification 05/06 Suppression of DAVI type of lbc -!! Modification 05/06 Remove EPS -!! Modification 12/2010 (Chong) Add boundary condition for ions -!! (fair weather profiles) -!! Modification 07/2013 (Bosseur & Filippi) adds Forefire -!! Modification 04/2013 (C.Lac) Remove instant M -!! Modification 01/2015 (JL Redelsperger) Introduction of ponderation -!! for non normal velocity and potential temp -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! Redelsperger & Pianezze : 08/2015 : add XPOND coefficient -!! Modification 01/2016 (JP Pinty) Add LIMA that is LBC for CCN and IFN -!! Modification 18/07/17 (Vionnet) Add blowing snow variables -!! Modification 01/2018 (JL Redelsperger) Correction for TKE treatment -!! Modification 03/02/2020 (B. Vié) Correction for SV with LIMA -! P. Wautelet 04/06/2020: correct call to Set_conc_lima -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -USE MODD_BLOWSNOW, ONLY : LBLOWSNOW,NBLOWSNOW_2D -USE MODD_BLOWSNOW_n -USE MODD_CH_AEROSOL , ONLY : LORILAM -USE MODD_CH_MNHC_n, ONLY : LUSECHEM, LUSECHIC -USE MODD_CONDSAMP, ONLY : LCONDSAMP -USE MODD_CONF -USE MODD_TURB_n, ONLY : XTKEMIN -USE MODD_DUST -USE MODD_GRID_n, ONLY : XZZ -USE MODD_ELEC_DESCR -USE MODD_ELEC_n -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE, ONLY : LFOREFIRE -#endif -USE MODD_LBC_n, ONLY : XPOND -USE MODE_ll -USE MODD_NESTING, ONLY : NDAD -USE MODD_NSV -USE MODD_PARAMETERS -USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN -USE MODD_PARAM_n, ONLY : CELEC,CCLOUD -USE MODD_PASPOL, ONLY : LPASPOL -USE MODD_PRECISION, ONLY: MNHREAL32 -USE MODD_REF_n -USE MODD_SALT, ONLY : LSALT - -USE MODE_MODELN_HANDLER -USE MODE_SET_CONC_LIMA - -USE MODI_CH_BOUNDARIES -USE MODI_INIT_AEROSOL_CONCENTRATION -USE MODI_ION_BOUNDARIES - -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -! -! -REAL, INTENT(IN) :: PTSTEP ! time step dt -CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY ! X and Y-direc. LBC type -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop COUNTer - ! (=1 at the segment beginning) -! -! Lateral Boundary fields at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUM,PLBXVM,PLBXWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYUM,PLBYVM,PLBYWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTKEM ! TKE -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTKEM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBXRM ,PLBXSVM ! Moisture and SV -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRM ,PLBYSVM ! in x and y-dir. -! temporal derivative of the Lateral Boundary fields -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTHS ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYUS,PLBYVS,PLBYWS ! Wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTHS ! Mass -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXTKES ! TKE -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYTKES -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBXRS ,PLBXSVS ! Moisture and SV -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRS ,PLBYSVS ! in x and y-dir. -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Jacobian * dry density of - ! the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUT,PVT,PWT,PTHT,PTKET,PSRCT -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT,PSVT - ! Variables at t -! -!* 0.2 declarations of local variables -! -INTEGER :: IIB ! indice I Beginning in x direction -INTEGER :: IJB ! indice J Beginning in y direction -INTEGER :: IKB ! indice K Beginning in z direction -INTEGER :: IIE ! indice I End in x direction -INTEGER :: IJE ! indice J End in y direction -INTEGER :: IKE ! indice K End in z direction -INTEGER :: JEXT ! Loop index for EXTernal points -INTEGER :: JRR ! Loop index for RR variables (water) -INTEGER :: JSV ! Loop index for Scalar Variables -INTEGER :: IMI ! Model Index -REAL :: ZTSTEP ! effective time step -REAL :: ZPOND ! Coeff PONDERATION LS -INTEGER :: ILBX,ILBY ! size of LB fields' arrays -LOGICAL, SAVE, DIMENSION(:), ALLOCATABLE :: GCHBOUNDARY, GAERBOUNDARY,& - GDSTBOUNDARY, GSLTBOUNDARY, GPPBOUNDARY, & - GCSBOUNDARY, GICBOUNDARY, GLIMABOUNDARY,GSNWBOUNDARY -LOGICAL, SAVE :: GFIRSTCALL1 = .TRUE. -LOGICAL, SAVE :: GFIRSTCALL2 = .TRUE. -LOGICAL, SAVE :: GFIRSTCALL3 = .TRUE. -LOGICAL, SAVE :: GFIRSTCALL5 = .TRUE. -LOGICAL, SAVE :: GFIRSTCALLPP = .TRUE. -LOGICAL, SAVE :: GFIRSTCALLCS = .TRUE. -LOGICAL, SAVE :: GFIRSTCALLIC = .TRUE. -LOGICAL, SAVE :: GFIRSTCALLLIMA = .TRUE. -! -REAL, DIMENSION(SIZE(PLBXWM,1),SIZE(PLBXWM,2),SIZE(PLBXWM,3)) :: & - ZLBXVT,ZLBXWT,ZLBXTHT -REAL, DIMENSION(SIZE(PLBYWM,1),SIZE(PLBYWM,2),SIZE(PLBYWM,3)) :: & - ZLBYUT,ZLBYWT,ZLBYTHT -REAL, DIMENSION(SIZE(PLBXTKEM,1),SIZE(PLBXTKEM,2),SIZE(PLBXTKEM,3)) :: & - ZLBXTKET -REAL, DIMENSION(SIZE(PLBYTKEM,1),SIZE(PLBYTKEM,2),SIZE(PLBYTKEM,3)) :: & - ZLBYTKET -REAL, DIMENSION(SIZE(PLBXRM,1),SIZE(PLBXRM,2),SIZE(PLBXRM,3),SIZE(PLBXRM,4)) :: & - ZLBXRT -REAL, DIMENSION(SIZE(PLBYRM,1),SIZE(PLBYRM,2),SIZE(PLBYRM,3),SIZE(PLBYRM,4)) :: & - ZLBYRT -REAL, DIMENSION(SIZE(PLBXSVM,1),SIZE(PLBXSVM,2),SIZE(PLBXSVM,3),SIZE(PLBXSVM,4)) :: & - ZLBXSVT -REAL, DIMENSION(SIZE(PLBYSVM,1),SIZE(PLBYSVM,2),SIZE(PLBYSVM,3),SIZE(PLBYSVM,4)) :: & - ZLBYSVT -LOGICAL :: GCHTMP -LOGICAL :: GPPTMP -LOGICAL :: GCSTMP -! -LOGICAL, SAVE :: GFIRSTCALL4 = .TRUE. -! -#ifdef MNH_FOREFIRE -LOGICAL, SAVE, DIMENSION(:), ALLOCATABLE :: GFFBOUNDARY -LOGICAL, SAVE :: GFIRSTCALLFF = .TRUE. -LOGICAL :: GFFTMP -#endif -! -INTEGER :: JI,JJ -! -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),SIZE(PSVT,4)) :: ZSVT -REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)) :: ZRT -! -!------------------------------------------------------------------------------- -! -!* 1. COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES: -! ---------------------------------------------- -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB = 1 + JPVEXT -IKE = SIZE(PUT,3) - JPVEXT -IMI = GET_CURRENT_MODEL_INDEX() -! -!------------------------------------------------------------------------------- -! -!* 2. UPPER AND LOWER BC FILLING: -! --------------------------- -! -!* 2.1 COMPUTE THE FIELD EXTRAPOLATIONS AT THE GROUND -! - -! -! at the instant t -! -IF(SIZE(PUT) /= 0) PUT (:,:,IKB-1) = PUT (:,:,IKB) -IF(SIZE(PVT) /= 0) PVT (:,:,IKB-1) = PVT (:,:,IKB) -IF(SIZE(PWT) /= 0) PWT (:,:,IKB-1) = PWT (:,:,IKB) -IF(SIZE(PTHT) /= 0) PTHT (:,:,IKB-1) = PTHT (:,:,IKB) -IF(SIZE(PTKET) /= 0) PTKET(:,:,IKB-1) = PTKET(:,:,IKB) -IF(SIZE(PRT) /= 0) PRT (:,:,IKB-1,:)= PRT (:,:,IKB,:) -IF(SIZE(PSVT)/= 0) PSVT (:,:,IKB-1,:)= PSVT (:,:,IKB,:) -IF(SIZE(PSRCT) /= 0) PSRCT(:,:,IKB-1) = PSRCT(:,:,IKB) -! -! -!* 2.2 COMPUTE THE FIELD EXTRAPOLATIONS AT THE TOP -! -! at the instant t -! -IF(SIZE(PWT) /= 0) PWT (:,:,IKE+1) = 0. -IF(SIZE(PUT) /= 0) PUT (:,:,IKE+1) = PUT (:,:,IKE) -IF(SIZE(PVT) /= 0) PVT (:,:,IKE+1) = PVT (:,:,IKE) -IF(SIZE(PTHT) /= 0) PTHT (:,:,IKE+1) = PTHT (:,:,IKE) -IF(SIZE(PTKET) /= 0) PTKET(:,:,IKE+1) = PTKET(:,:,IKE) -IF(SIZE(PRT) /= 0) PRT (:,:,IKE+1,:) = PRT (:,:,IKE,:) -IF(SIZE(PSVT)/= 0) PSVT (:,:,IKE+1,:) = PSVT (:,:,IKE,:) -IF(SIZE(PSRCT) /= 0) PSRCT(:,:,IKE+1) = PSRCT(:,:,IKE) - -! specific for positive and negative ions mixing ratios (1/kg) - -IF (NSV_ELEC .NE. 0) THEN -! - IF (SIZE(PWT) /= 0) THEN - WHERE ( PWT(:,:,IKE+1) .GE. 0.) ! Outflow - PSVT (:,:,IKE+1,NSV_ELECBEG) = 2.*PSVT (:,:,IKE,NSV_ELECBEG) - & - PSVT (:,:,IKE-1,NSV_ELECBEG) - PSVT (:,:,IKE+1,NSV_ELECEND) = 2.*PSVT (:,:,IKE,NSV_ELECEND) - & - PSVT (:,:,IKE-1,NSV_ELECEND) - ELSE WHERE ! Inflow from the top - PSVT (:,:,IKE+1,NSV_ELECBEG) = XCION_POS_FW(:,:,IKE+1) - PSVT (:,:,IKE+1,NSV_ELECEND) = XCION_NEG_FW(:,:,IKE+1) - END WHERE - ENDIF -! -END IF - -! -! -!------------------------------------------------------------------------------- -! -!* 3. COMPUTE LB FIELDS AT TIME T -! --------------------------- -! -! -IF ( KTCOUNT == 1) THEN - ZTSTEP = 0. -ELSE - ZTSTEP = PTSTEP -END IF -! -! -IF ( SIZE(PLBXTHS,1) /= 0 .AND. & - ( HLBCX(1)=='OPEN' .OR. HLBCX(2)=='OPEN') ) THEN - ZLBXVT(:,:,:) = PLBXVM(:,:,:) + ZTSTEP * PLBXVS(:,:,:) - ZLBXWT(:,:,:) = PLBXWM(:,:,:) + ZTSTEP * PLBXWS(:,:,:) - ZLBXTHT(:,:,:) = PLBXTHM(:,:,:) + ZTSTEP * PLBXTHS(:,:,:) - IF ( SIZE(PTKET,1) /= 0 ) THEN - ZLBXTKET(:,:,:) = PLBXTKEM(:,:,:) + ZTSTEP * PLBXTKES(:,:,:) - END IF - IF ( KRR > 0) THEN - ZLBXRT(:,:,:,:) = PLBXRM(:,:,:,:) + ZTSTEP * PLBXRS(:,:,:,:) - END IF - IF ( KSV > 0) THEN - ZLBXSVT(:,:,:,:) = PLBXSVM(:,:,:,:) + ZTSTEP * PLBXSVS(:,:,:,:) - END IF -! -ELSE -! - ZLBXVT(:,:,:) = PLBXVM(:,:,:) - ZLBXWT(:,:,:) = PLBXWM(:,:,:) - ZLBXTHT(:,:,:) = PLBXTHM(:,:,:) - IF ( SIZE(PTKET,1) /= 0 ) THEN - ZLBXTKET(:,:,:) = PLBXTKEM(:,:,:) - END IF - IF ( KRR > 0) THEN - ZLBXRT(:,:,:,:) = PLBXRM(:,:,:,:) - END IF - IF ( KSV > 0) THEN - ZLBXSVT(:,:,:,:) = PLBXSVM(:,:,:,:) - END IF -! -END IF -! -! ============================================================ -! -! Reproductibility for RSTART -> truncate ZLB to real(knd=4) to have reproductible result -! -ZLBXVT(:,:,:) = real(ZLBXVT(:,:,:),kind=MNHREAL32) -ZLBXWT(:,:,:) = real(ZLBXWT(:,:,:),kind=MNHREAL32) -ZLBXTHT(:,:,:) = real(ZLBXTHT(:,:,:),kind=MNHREAL32) -IF ( SIZE(PTKET,1) /= 0 ) THEN - ZLBXTKET(:,:,:) = real(ZLBXTKET(:,:,:),kind=MNHREAL32) -END IF -IF ( KRR > 0) THEN - ZLBXRT(:,:,:,:) = real(ZLBXRT(:,:,:,:),kind=MNHREAL32) -END IF -IF ( KSV > 0) THEN - ZLBXSVT(:,:,:,:) = real(ZLBXSVT(:,:,:,:),kind=MNHREAL32) -END IF -! ============================================================ -! -IF ( SIZE(PLBYTHS,1) /= 0 .AND. & - ( HLBCY(1)=='OPEN' .OR. HLBCY(2)=='OPEN' )) THEN - ZLBYUT(:,:,:) = PLBYUM(:,:,:) + ZTSTEP * PLBYUS(:,:,:) - ZLBYWT(:,:,:) = PLBYWM(:,:,:) + ZTSTEP * PLBYWS(:,:,:) - ZLBYTHT(:,:,:) = PLBYTHM(:,:,:) + ZTSTEP * PLBYTHS(:,:,:) - IF ( SIZE(PTKET,1) /= 0 ) THEN - ZLBYTKET(:,:,:) = PLBYTKEM(:,:,:) + ZTSTEP * PLBYTKES(:,:,:) - END IF - IF ( KRR > 0) THEN - ZLBYRT(:,:,:,:) = PLBYRM(:,:,:,:) + ZTSTEP * PLBYRS(:,:,:,:) - END IF - IF ( KSV > 0) THEN - ZLBYSVT(:,:,:,:) = PLBYSVM(:,:,:,:) + ZTSTEP * PLBYSVS(:,:,:,:) - END IF -! -ELSE -! - ZLBYUT(:,:,:) = PLBYUM(:,:,:) - ZLBYWT(:,:,:) = PLBYWM(:,:,:) - ZLBYTHT(:,:,:) = PLBYTHM(:,:,:) - IF ( SIZE(PTKET,1) /= 0 ) THEN - ZLBYTKET(:,:,:) = PLBYTKEM(:,:,:) - END IF - IF ( KRR > 0) THEN - ZLBYRT(:,:,:,:) = PLBYRM(:,:,:,:) - END IF - IF ( KSV > 0) THEN - ZLBYSVT(:,:,:,:) = PLBYSVM(:,:,:,:) - END IF -! -END IF -! -! -! ============================================================ -! -! Reproductibility for RSTART -> truncate ZLB to real(knd=4) to have reproductible result -! -ZLBYUT(:,:,:) = real(ZLBYUT(:,:,:),kind=MNHREAL32) -ZLBYWT(:,:,:) = real(ZLBYWT(:,:,:),kind=MNHREAL32) -ZLBYTHT(:,:,:) = real(ZLBYTHT(:,:,:),kind=MNHREAL32) -IF ( SIZE(PTKET,1) /= 0 ) THEN - ZLBYTKET(:,:,:) = real(ZLBYTKET(:,:,:),kind=MNHREAL32) -END IF -IF ( KRR > 0) THEN - ZLBYRT(:,:,:,:) = real(ZLBYRT(:,:,:,:),kind=MNHREAL32) -END IF -IF ( KSV > 0) THEN - ZLBYSVT(:,:,:,:) = real(ZLBYSVT(:,:,:,:),kind=MNHREAL32) -END IF -! ============================================================ -! -!------------------------------------------------------------------------------- -! PONDERATION COEFF for Non-Normal velocities and pot temperature -! -ZPOND = XPOND -! -!* 4. LBC FILLING IN THE X DIRECTION (LEFT WEST SIDE): -! ------------------------------------------------ -IF (LWEST_ll( )) THEN -! -! -SELECT CASE ( HLBCX(1) ) -! -!* 4.1 WALL CASE: -! ========= -! - CASE ('WALL') -! - DO JEXT=1,JPHEXT - IF(SIZE(PUT) /= 0) PUT (IIB-JEXT,:,:) = PUT (IIB ,:,:) ! never used during run - IF(SIZE(PVT) /= 0) PVT (IIB-JEXT,:,:) = PVT (IIB-1+JEXT,:,:) - IF(SIZE(PWT) /= 0) PWT (IIB-JEXT,:,:) = PWT (IIB-1+JEXT,:,:) - IF(SIZE(PTHT) /= 0) PTHT(IIB-JEXT,:,:) = PTHT (IIB-1+JEXT,:,:) - IF(SIZE(PTKET)/= 0) PTKET(IIB-JEXT,:,:) = PTKET(IIB-1+JEXT,:,:) - IF(SIZE(PRT) /= 0) PRT (IIB-JEXT,:,:,:) = PRT (IIB-1+JEXT,:,:,:) - IF(SIZE(PSVT) /= 0) PSVT(IIB-JEXT,:,:,:) = PSVT (IIB-1+JEXT,:,:,:) - IF(SIZE(PSRCT) /= 0) PSRCT (IIB-JEXT,:,:) = PSRCT (IIB-1+JEXT,:,:) - IF(LBLOWSNOW) XSNWCANO(IIB-JEXT,:,:) = XSNWCANO(IIB-1+JEXT,:,:) -! - END DO -! - IF(SIZE(PUT) /= 0) PUT(IIB ,:,:) = 0. ! set the normal velocity -! -! -!* 4.2 OPEN CASE: -! ========= -! - CASE ('OPEN') -! - IF(SIZE(PUT) /= 0) THEN - DO JI=JPHEXT,1,-1 - PUT(JI,:,:)=0. - WHERE ( PUT(IIB,:,:) <= 0. ) ! OUTFLOW condition - PVT (JI,:,:) = 2.*PVT (JI+1,:,:) -PVT (JI+2,:,:) - PWT (JI,:,:) = 2.*PWT (JI+1,:,:) -PWT (JI+2,:,:) - PTHT (JI,:,:) = 2.*PTHT (JI+1,:,:) -PTHT (JI+2,:,:) - ! - ELSEWHERE ! INFLOW condition - PVT (JI,:,:) = ZPOND*ZLBXVT (JI,:,:) + (1.-ZPOND)* PVT(JI+1,:,:) ! 1 - PWT (JI,:,:) = ZPOND*ZLBXWT (JI,:,:) + (1.-ZPOND)* PWT(JI+1,:,:) ! 1 - PTHT (JI,:,:) = ZPOND*ZLBXTHT (JI,:,:) + (1.-ZPOND)* PTHT(JI+1,:,:)! 1 - ENDWHERE - ENDDO - ENDIF -! -! - IF(SIZE(PTKET) /= 0) THEN - DO JI=JPHEXT,1,-1 - WHERE ( PUT(IIB,:,:) <= 0. ) ! OUTFLOW condition - PTKET(JI,:,:) = MAX(XTKEMIN, 2.*PTKET(JI+1,:,:)-PTKET(JI+2,:,:)) - ELSEWHERE ! INFLOW condition - PTKET(JI,:,:) = MAX(XTKEMIN, ZPOND*ZLBXTKET(JI,:,:) + (1.-ZPOND)*PTKET(JI+1,:,:)) - ENDWHERE - ENDDO - END IF - ! -! Case with KRR moist variables -! -! -! - DO JRR =1 ,KRR - IF(SIZE(PUT) /= 0) THEN - DO JI=JPHEXT,1,-1 - WHERE ( PUT(IIB,:,:) <= 0. ) ! OUTFLOW condition - PRT(JI,:,:,JRR) = MAX(0.,2.*PRT(JI+1,:,:,JRR) -PRT(JI+2,:,:,JRR)) - ELSEWHERE ! INFLOW condition - PRT(JI,:,:,JRR) = MAX(0.,ZLBXRT(JI,:,:,JRR)) ! 1 - END WHERE - END DO - END IF - ! - END DO -! - IF(SIZE(PSRCT) /= 0) THEN - DO JI=JPHEXT,1,-1 - PSRCT (JI,:,:) = PSRCT (JI+1,:,:) - END DO - END IF -! -! Case with KSV scalar variables - DO JSV=1 ,KSV - IF(SIZE(PUT) /= 0) THEN - DO JI=JPHEXT,1,-1 - WHERE ( PUT(IIB,:,:) <= 0. ) ! OUTFLOW condition - PSVT(JI,:,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(JI+1,:,:,JSV) - & - PSVT(JI+2,:,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(JI,:,:,JSV) = MAX(XSVMIN(JSV),ZLBXSVT(JI,:,:,JSV)) ! 1 - END WHERE - END DO - END IF - ! - END DO - ! - IF(LBLOWSNOW) THEN - DO JSV=1 ,NBLOWSNOW_2D - WHERE ( PUT(IIB,:,IKB) <= 0. ) ! OUTFLOW condition - XSNWCANO(IIB-1,:,JSV) = MAX(0.,2.*XSNWCANO(IIB,:,JSV) - & - XSNWCANO(IIB+1,:,JSV)) - ELSEWHERE ! INFLOW condition - XSNWCANO(IIB-1,:,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END DO - DO JSV=NSV_SNWBEG ,NSV_SNWEND - IF(SIZE(PUT) /= 0) THEN - WHERE ( PUT(IIB,:,:) <= 0. ) ! OUTFLOW condition - PSVT(IIB-1,:,:,JSV) = MAX(0.,2.*PSVT(IIB,:,:,JSV) - & - PSVT(IIB+1,:,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(IIB-1,:,:,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END IF - ! - END DO - ENDIF -! -! -END SELECT -! -END IF -!------------------------------------------------------------------------------- -! -!* 5 LBC FILLING IN THE X DIRECTION (RIGHT EAST SIDE): -! ===============-------------------------------- -! -IF (LEAST_ll( )) THEN -! -SELECT CASE ( HLBCX(2) ) -! -!* 5.1 WALL CASE: -! ========= -! - CASE ('WALL') -! - DO JEXT=1,JPHEXT - IF(SIZE(PUT) /= 0) PUT (IIE+JEXT,:,:) = PUT (IIE ,:,:) ! never used during run - IF(SIZE(PVT) /= 0) PVT (IIE+JEXT,:,:) = PVT (IIE+1-JEXT,:,:) - IF(SIZE(PWT) /= 0) PWT (IIE+JEXT,:,:) = PWT (IIE+1-JEXT,:,:) - IF(SIZE(PTHT) /= 0) PTHT (IIE+JEXT,:,:) = PTHT (IIE+1-JEXT,:,:) - IF(SIZE(PTKET) /= 0) PTKET(IIE+JEXT,:,:) = PTKET(IIE+1-JEXT,:,:) - IF(SIZE(PRT) /= 0) PRT (IIE+JEXT,:,:,:) = PRT (IIE+1-JEXT,:,:,:) - IF(SIZE(PSVT) /= 0) PSVT(IIE+JEXT,:,:,:) = PSVT (IIE+1-JEXT,:,:,:) - IF(SIZE(PSRCT) /= 0) PSRCT (IIE+JEXT,:,:)= PSRCT (IIE+1-JEXT,:,:) - IF(LBLOWSNOW) XSNWCANO(IIE+JEXT,:,:) = XSNWCANO(IIE+1-JEXT,:,:) -! - END DO -! - IF(SIZE(PUT) /= 0) PUT(IIE+1 ,:,:) = 0. ! set the normal velocity -! -!* 5.2 OPEN CASE: -! ========= -! - CASE ('OPEN') -! - ILBX = SIZE(PLBXVM,1) - IF(SIZE(PUT) /= 0) THEN - DO JI=1,JPHEXT - WHERE ( PUT(IIE+1,:,:) >= 0. ) ! OUTFLOW condition - PVT (IIE+JI,:,:) = 2.*PVT (IIE+JI-1,:,:) -PVT (IIE+JI-2,:,:) - PWT (IIE+JI,:,:) = 2.*PWT (IIE+JI-1,:,:) -PWT (IIE+JI-2,:,:) - PTHT (IIE+JI,:,:) = 2.*PTHT (IIE+JI-1,:,:) -PTHT (IIE+JI-2,:,:) - ! - ELSEWHERE ! INFLOW condition - PVT (IIE+JI,:,:) = ZPOND*ZLBXVT (ILBX-JPHEXT+JI,:,:) + (1.-ZPOND)* PVT(IIE+JI-1,:,:) - PWT (IIE+JI,:,:) = ZPOND*ZLBXWT (ILBX-JPHEXT+JI,:,:) + (1.-ZPOND)* PWT(IIE+JI-1,:,:) - PTHT (IIE+JI,:,:) = ZPOND*ZLBXTHT (ILBX-JPHEXT+JI,:,:) + (1.-ZPOND)* PTHT(IIE+JI-1,:,:) - ENDWHERE - END DO - ENDIF - ! - IF(SIZE(PTKET) /= 0) THEN - ILBX = SIZE(PLBXTKEM,1) - DO JI=1,JPHEXT - WHERE ( PUT(IIE+1,:,:) >= 0. ) ! OUTFLOW condition - PTKET(IIE+JI,:,:) = MAX(XTKEMIN, 2.*PTKET(IIE+JI-1,:,:)-PTKET(IIE+JI-2,:,:)) - ELSEWHERE ! INFLOW condition - PTKET(IIE+JI,:,:) = MAX(XTKEMIN, ZPOND*ZLBXTKET(ILBX-JPHEXT+JI,:,:) + & - (1.-ZPOND)*PTKET(IIE+JI-1,:,:)) - ENDWHERE - END DO - END IF - ! -! -! Case with KRR moist variables -! -! - DO JRR =1 ,KRR - ILBX=SIZE(PLBXRM,1) - ! - IF(SIZE(PUT) /= 0) THEN - DO JI=1,JPHEXT - WHERE ( PUT(IIE+1,:,:) >= 0. ) ! OUTFLOW condition - PRT(IIE+JI,:,:,JRR) = MAX(0.,2.*PRT(IIE+JI-1,:,:,JRR) -PRT(IIE+JI-2,:,:,JRR)) - ELSEWHERE ! INFLOW condition - PRT(IIE+JI,:,:,JRR) = MAX(0.,ZLBXRT(ILBX-JPHEXT+JI,:,:,JRR)) - END WHERE - END DO - END IF - ! - END DO -! - IF(SIZE(PSRCT) /= 0) THEN - DO JI=1,JPHEXT - PSRCT (IIE+JI,:,:) = PSRCT (IIE+JI-1,:,:) - END DO - END IF -! Case with KSV scalar variables - DO JSV=1 ,KSV - ILBX=SIZE(PLBXSVM,1) - IF(SIZE(PUT) /= 0) THEN - DO JI=1,JPHEXT - WHERE ( PUT(IIE+1,:,:) >= 0. ) ! OUTFLOW condition - PSVT(IIE+JI,:,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(IIE+JI-1,:,:,JSV) - & - PSVT(IIE+JI-2,:,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(IIE+JI,:,:,JSV) = MAX(XSVMIN(JSV),ZLBXSVT(ILBX-JPHEXT+JI,:,:,JSV)) - END WHERE - END DO - END IF - ! - END DO -! - IF(LBLOWSNOW) THEN - DO JSV=1 ,3 - WHERE ( PUT(IIE+1,:,IKB) >= 0. ) ! OUTFLOW condition - XSNWCANO(IIE+1,:,JSV) = MAX(0.,2.*XSNWCANO(IIE,:,JSV) - & - XSNWCANO(IIE-1,:,JSV)) - ELSEWHERE ! INFLOW condition - XSNWCANO(IIE+1,:,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END DO - DO JSV=NSV_SNWBEG ,NSV_SNWEND - IF(SIZE(PUT) /= 0) THEN - WHERE ( PUT(IIE+1,:,:) >= 0. ) ! OUTFLOW condition - PSVT(IIE+1,:,:,JSV) = MAX(0.,2.*PSVT(IIE,:,:,JSV) - & - PSVT(IIE-1,:,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(IIE+1,:,:,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END IF - ! - END DO - END IF -! -END SELECT -! -END IF -!------------------------------------------------------------------------------- -! -!* 6. LBC FILLING IN THE Y DIRECTION (BOTTOM SOUTH SIDE): -! ------------------------------ -IF (LSOUTH_ll( )) THEN -! -SELECT CASE ( HLBCY(1) ) -! -!* 6.1 WALL CASE: -! ========= -! - CASE ('WALL') -! - DO JEXT=1,JPHEXT - IF(SIZE(PUT) /= 0) PUT (:,IJB-JEXT,:) = PUT (:,IJB-1+JEXT,:) - IF(SIZE(PVT) /= 0) PVT (:,IJB-JEXT,:) = PVT (:,IJB ,:) ! never used during run - IF(SIZE(PWT) /= 0) PWT (:,IJB-JEXT,:) = PWT (:,IJB-1+JEXT,:) - IF(SIZE(PTHT) /= 0) PTHT (:,IJB-JEXT,:) = PTHT (:,IJB-1+JEXT,:) - IF(SIZE(PTKET) /= 0) PTKET(:,IJB-JEXT,:) = PTKET(:,IJB-1+JEXT,:) - IF(SIZE(PRT) /= 0) PRT (:,IJB-JEXT,:,:) = PRT (:,IJB-1+JEXT,:,:) - IF(SIZE(PSVT) /= 0) PSVT (:,IJB-JEXT,:,:)= PSVT (:,IJB-1+JEXT,:,:) - IF(SIZE(PSRCT) /= 0) PSRCT(:,IJB-JEXT,:) = PSRCT(:,IJB-1+JEXT,:) - IF(LBLOWSNOW) XSNWCANO(:,IJB-JEXT,:) = XSNWCANO(:,IJB-1+JEXT,:) -! - END DO -! - IF(SIZE(PVT) /= 0) PVT(:,IJB ,:) = 0. ! set the normal velocity -! -!* 6.2 OPEN CASE: -! ========= -! - CASE ('OPEN') -! - IF(SIZE(PVT) /= 0) THEN - DO JJ=JPHEXT,1,-1 - PVT(:,JJ,:)=0. - WHERE ( PVT(:,IJB,:) <= 0. ) ! OUTFLOW condition - PUT (:,JJ,:) = 2.*PUT (:,JJ+1,:) -PUT (:,JJ+2,:) - PWT (:,JJ,:) = 2.*PWT (:,JJ+1,:) -PWT (:,JJ+2,:) - PTHT (:,JJ,:) = 2.*PTHT (:,JJ+1,:) -PTHT (:,JJ+2,:) - ELSEWHERE ! INFLOW condition - PUT (:,JJ,:) = ZPOND*ZLBYUT (:,JJ,:) + (1.-ZPOND)* PUT(:,JJ+1,:) - PWT (:,JJ,:) = ZPOND*ZLBYWT (:,JJ,:) + (1.-ZPOND)* PWT(:,JJ+1,:) - PTHT (:,JJ,:) = ZPOND*ZLBYTHT (:,JJ,:) + (1.-ZPOND)* PTHT(:,JJ+1,:) - ENDWHERE - END DO - ENDIF -! - IF(SIZE(PTKET) /= 0) THEN - DO JJ=JPHEXT,1,-1 - WHERE ( PVT(:,IJB,:) <= 0. ) ! OUTFLOW condition - PTKET(:,JJ,:) = MAX(XTKEMIN, 2.*PTKET(:,JJ+1,:)-PTKET(:,JJ+2,:)) - ELSEWHERE ! INFLOW condition - PTKET(:,JJ,:) = MAX(XTKEMIN,ZPOND*ZLBYTKET(:,JJ,:) + & - (1.-ZPOND)*PTKET(:,JJ+1,:)) - ENDWHERE - END DO - END IF - ! -! -! Case with KRR moist variables -! -! - DO JRR =1 ,KRR - IF(SIZE(PVT) /= 0) THEN - DO JJ=JPHEXT,1,-1 - WHERE ( PVT(:,IJB,:) <= 0. ) ! OUTFLOW condition - PRT(:,JJ,:,JRR) = MAX(0.,2.*PRT(:,JJ+1,:,JRR) -PRT(:,JJ+2,:,JRR)) - ELSEWHERE ! INFLOW condition - PRT(:,JJ,:,JRR) = MAX(0.,ZLBYRT(:,JJ,:,JRR)) - END WHERE - END DO - END IF - ! - END DO -! - IF(SIZE(PSRCT) /= 0) THEN - DO JJ=JPHEXT,1,-1 - PSRCT(:,JJ,:) = PSRCT(:,JJ+1,:) - END DO - END IF -! -! Case with KSV scalar variables -! - DO JSV=1 ,KSV - IF(SIZE(PVT) /= 0) THEN - DO JJ=JPHEXT,1,-1 - WHERE ( PVT(:,IJB,:) <= 0. ) ! OUTFLOW condition - PSVT(:,JJ,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(:,JJ+1,:,JSV) - & - PSVT(:,JJ+2,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(:,JJ,:,JSV) = MAX(XSVMIN(JSV),ZLBYSVT(:,JJ,:,JSV)) - END WHERE - END DO - END IF - ! - END DO -! - IF(LBLOWSNOW) THEN - DO JSV=1 ,3 - WHERE ( PVT(:,IJB,IKB) <= 0. ) ! OUTFLOW condition - XSNWCANO(:,IJB-1,JSV) = MAX(0.,2.*XSNWCANO(:,IJB,JSV) - & - XSNWCANO(:,IJB+1,JSV)) - ELSEWHERE ! INFLOW condition - XSNWCANO(:,IJB-1,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END DO - DO JSV=NSV_SNWBEG ,NSV_SNWEND - IF(SIZE(PVT) /= 0) THEN - WHERE ( PVT(:,IJB,:) <= 0. ) ! OUTFLOW condition - PSVT(:,IJB-1,:,JSV) = MAX(0.,2.*PSVT(:,IJB,:,JSV) - & - PSVT(:,IJB+1,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(:,IJB-1,:,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END IF - ! - END DO - END IF -! -! -END SELECT -! -END IF -!------------------------------------------------------------------------------- -! -!* 7. LBC FILLING IN THE Y DIRECTION (TOP NORTH SIDE): -! =============== -! -IF (LNORTH_ll( )) THEN -! -SELECT CASE ( HLBCY(2) ) -! -!* 4.3.1 WALL CASE: -! ========= -! - CASE ('WALL') -! - DO JEXT=1,JPHEXT - IF(SIZE(PUT) /= 0) PUT (:,IJE+JEXT,:) = PUT (:,IJE+1-JEXT,:) - IF(SIZE(PVT) /= 0) PVT (:,IJE+JEXT,:) = PVT (:,IJE ,:) ! never used during run - IF(SIZE(PWT) /= 0) PWT (:,IJE+JEXT,:) = PWT (:,IJE+1-JEXT,:) - IF(SIZE(PTHT) /= 0) PTHT (:,IJE+JEXT,:) = PTHT (:,IJE+1-JEXT,:) - IF(SIZE(PTKET) /= 0) PTKET(:,IJE+JEXT,:) = PTKET(:,IJE+1-JEXT,:) - IF(SIZE(PRT) /= 0) PRT (:,IJE+JEXT,:,:) = PRT (:,IJE+1-JEXT,:,:) - IF(SIZE(PSVT) /= 0) PSVT (:,IJE+JEXT,:,:)= PSVT (:,IJE+1-JEXT,:,:) - IF(SIZE(PSRCT) /= 0) PSRCT(:,IJE+JEXT,:) = PSRCT(:,IJE+1-JEXT,:) - IF(LBLOWSNOW) XSNWCANO(:,IJE+JEXT,:) = XSNWCANO(:,IJE+1-JEXT,:) -! - END DO -! - IF(SIZE(PVT) /= 0) PVT(:,IJE+1 ,:) = 0. ! set the normal velocity -! -!* 4.3.2 OPEN CASE: -! ========= -! - CASE ('OPEN') -! -! - ILBY=SIZE(PLBYUM,2) - IF(SIZE(PVT) /= 0) THEN - DO JJ=1,JPHEXT - WHERE ( PVT(:,IJE+1,:) >= 0. ) ! OUTFLOW condition - PUT (:,IJE+JJ,:) = 2.*PUT (:,IJE+JJ-1,:) -PUT (:,IJE+JJ-2,:) - PWT (:,IJE+JJ,:) = 2.*PWT (:,IJE+JJ-1,:) -PWT (:,IJE+JJ-2,:) - PTHT (:,IJE+JJ,:) = 2.*PTHT (:,IJE+JJ-1,:) -PTHT (:,IJE+JJ-2,:) - ELSEWHERE ! INFLOW condition - PUT (:,IJE+JJ,:) = ZPOND*ZLBYUT (:,ILBY-JPHEXT+JJ,:) + (1.-ZPOND)* PUT(:,IJE+JJ-1,:) - PWT (:,IJE+JJ,:) = ZPOND*ZLBYWT (:,ILBY-JPHEXT+JJ,:) + (1.-ZPOND)* PWT(:,IJE+JJ-1,:) - PTHT (:,IJE+JJ,:) = ZPOND*ZLBYTHT (:,ILBY-JPHEXT+JJ,:) + (1.-ZPOND)* PTHT(:,IJE+JJ-1,:) - ENDWHERE - END DO - ENDIF -! - IF(SIZE(PTKET) /= 0) THEN - ILBY=SIZE(PLBYTKEM,2) - DO JJ=1,JPHEXT - WHERE ( PVT(:,IJE+1,:) >= 0. ) ! OUTFLOW condition - PTKET(:,IJE+JJ,:) = MAX(XTKEMIN, 2.*PTKET(:,IJE+JJ-1,:)-PTKET(:,IJE+JJ-2,:)) - ELSEWHERE ! INFLOW condition - PTKET(:,IJE+JJ,:) = MAX(XTKEMIN,ZPOND*ZLBYTKET(:,ILBY-JPHEXT+JJ,:) + & - (1.-ZPOND)*PTKET(:,IJE+JJ-1,:)) - ENDWHERE - END DO - ENDIF - ! -! Case with KRR moist variables -! -! - DO JRR =1 ,KRR - ILBY=SIZE(PLBYRM,2) - ! - IF(SIZE(PVT) /= 0) THEN - DO JJ=1,JPHEXT - WHERE ( PVT(:,IJE+1,:) >= 0. ) ! OUTFLOW condition - PRT(:,IJE+JJ,:,JRR) = MAX(0.,2.*PRT(:,IJE+JJ-1,:,JRR) -PRT(:,IJE+JJ-2,:,JRR)) - ELSEWHERE ! INFLOW condition - PRT(:,IJE+JJ,:,JRR) = MAX(0.,ZLBYRT(:,ILBY-JPHEXT+JJ,:,JRR)) - END WHERE - END DO - END IF - ! - END DO -! - IF(SIZE(PSRCT) /= 0) THEN - DO JJ=1,JPHEXT - PSRCT(:,IJE+JJ,:) = PSRCT(:,IJE+JJ-1,:) - END DO - END IF -! -! Case with KSV scalar variables - DO JSV=1 ,KSV - ILBY=SIZE(PLBYSVM,2) - ! - IF(SIZE(PVT) /= 0) THEN - DO JJ=1,JPHEXT - WHERE ( PVT(:,IJE+1,:) >= 0. ) ! OUTFLOW condition - PSVT(:,IJE+JJ,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(:,IJE+JJ-1,:,JSV) - & - PSVT(:,IJE+JJ-2,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(:,IJE+JJ,:,JSV) = MAX(XSVMIN(JSV),ZLBYSVT(:,ILBY-JPHEXT+JJ,:,JSV)) - END WHERE - END DO - END IF - ! - END DO -! - IF(LBLOWSNOW) THEN - DO JSV=1 ,3 - WHERE ( PVT(:,IJE+1,IKB) >= 0. ) ! OUTFLOW condition - XSNWCANO(:,IJE+1,JSV) = MAX(0.,2.*XSNWCANO(:,IJE,JSV) - & - XSNWCANO(:,IJE-1,JSV)) - ELSEWHERE ! INFLOW condition - XSNWCANO(:,IJE+1,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END DO - DO JSV=NSV_SNWBEG ,NSV_SNWEND - ! - IF(SIZE(PVT) /= 0) THEN - WHERE ( PVT(:,IJE+1,:) >= 0. ) ! OUTFLOW condition - PSVT(:,IJE+1,:,JSV) = MAX(0.,2.*PSVT(:,IJE,:,JSV) - & - PSVT(:,IJE-1,:,JSV)) - ELSEWHERE ! INFLOW condition - PSVT(:,IJE+1,:,JSV) = 0. ! Assume no snow enter throug - ! boundaries - END WHERE - END IF - ! - END DO - ENDIF -! -END SELECT -END IF -! -! -IF (CCLOUD == 'LIMA' .AND. IMI == 1 .AND. CPROGRAM=='MESONH') THEN - - ZSVT=PSVT - ZRT=PRT - - IF (GFIRSTCALLLIMA) THEN - ALLOCATE(GLIMABOUNDARY(NSV_LIMA)) - GFIRSTCALLLIMA = .FALSE. - DO JSV=NSV_LIMA_BEG,NSV_LIMA_END - GCHTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GLIMABOUNDARY(JSV-NSV_LIMA_BEG+1) = GCHTMP - ENDDO - ENDIF - CALL INIT_AEROSOL_CONCENTRATION(PRHODREF,ZSVT,XZZ) - DO JSV=NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1 ! LBC for CCN - IF (GLIMABOUNDARY(JSV-NSV_LIMA_BEG+1)) THEN - PSVT(IIB-1,:,:,JSV)=ZSVT(IIB-1,:,:,JSV) - PSVT(IIE+1,:,:,JSV)=ZSVT(IIE+1,:,:,JSV) - PSVT(:,IJB-1,:,JSV)=ZSVT(:,IJB-1,:,JSV) - PSVT(:,IJE+1,:,JSV)=ZSVT(:,IJE+1,:,JSV) - ENDIF - END DO - DO JSV=NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1 ! LBC for IFN - IF (GLIMABOUNDARY(JSV-NSV_LIMA_BEG+1)) THEN - PSVT(IIB-1,:,:,JSV)=ZSVT(IIB-1,:,:,JSV) - PSVT(IIE+1,:,:,JSV)=ZSVT(IIE+1,:,:,JSV) - PSVT(:,IJB-1,:,JSV)=ZSVT(:,IJB-1,:,JSV) - PSVT(:,IJE+1,:,JSV)=ZSVT(:,IJE+1,:,JSV) - ENDIF - END DO - - CALL SET_CONC_LIMA( IMI, 'NONE', PRHODREF, ZRT(:, :, :, :), ZSVT(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) ) - IF (NSV_LIMA_NC.GE.1) THEN - IF (GLIMABOUNDARY(NSV_LIMA_NC-NSV_LIMA_BEG+1)) THEN - PSVT(IIB-1,:,:,NSV_LIMA_NC)=ZSVT(IIB-1,:,:,NSV_LIMA_NC) ! cloud - PSVT(IIE+1,:,:,NSV_LIMA_NC)=ZSVT(IIE+1,:,:,NSV_LIMA_NC) - PSVT(:,IJB-1,:,NSV_LIMA_NC)=ZSVT(:,IJB-1,:,NSV_LIMA_NC) - PSVT(:,IJE+1,:,NSV_LIMA_NC)=ZSVT(:,IJE+1,:,NSV_LIMA_NC) - ENDIF - ENDIF - IF (NSV_LIMA_NR.GE.1) THEN - IF (GLIMABOUNDARY(NSV_LIMA_NR-NSV_LIMA_BEG+1)) THEN - PSVT(IIB-1,:,:,NSV_LIMA_NR)=ZSVT(IIB-1,:,:,NSV_LIMA_NR) ! rain - PSVT(IIE+1,:,:,NSV_LIMA_NR)=ZSVT(IIE+1,:,:,NSV_LIMA_NR) - PSVT(:,IJB-1,:,NSV_LIMA_NR)=ZSVT(:,IJB-1,:,NSV_LIMA_NR) - PSVT(:,IJE+1,:,NSV_LIMA_NR)=ZSVT(:,IJE+1,:,NSV_LIMA_NR) - ENDIF - ENDIF - IF (NSV_LIMA_NI.GE.1) THEN - IF (GLIMABOUNDARY(NSV_LIMA_NI-NSV_LIMA_BEG+1)) THEN - PSVT(IIB-1,:,:,NSV_LIMA_NI)=ZSVT(IIB-1,:,:,NSV_LIMA_NI) ! ice - PSVT(IIE+1,:,:,NSV_LIMA_NI)=ZSVT(IIE+1,:,:,NSV_LIMA_NI) - PSVT(:,IJB-1,:,NSV_LIMA_NI)=ZSVT(:,IJB-1,:,NSV_LIMA_NI) - PSVT(:,IJE+1,:,NSV_LIMA_NI)=ZSVT(:,IJE+1,:,NSV_LIMA_NI) - ENDIF - END IF -END IF -! -! -IF (LUSECHEM .AND. IMI == 1) THEN - IF (GFIRSTCALL1) THEN - ALLOCATE(GCHBOUNDARY(NSV_CHEM)) - GFIRSTCALL1 = .FALSE. - DO JSV=NSV_CHEMBEG,NSV_CHEMEND - GCHTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GCHBOUNDARY(JSV-NSV_CHEMBEG+1) = GCHTMP - ENDDO - ENDIF - - DO JSV=NSV_CHEMBEG,NSV_CHEMEND - IF (GCHBOUNDARY(JSV-NSV_CHEMBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF -! -IF (LUSECHIC .AND. IMI == 1) THEN - IF (GFIRSTCALLIC) THEN - ALLOCATE(GICBOUNDARY(NSV_CHIC)) - GFIRSTCALLIC = .FALSE. - DO JSV=NSV_CHICBEG,NSV_CHICEND - GCHTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GICBOUNDARY(JSV-NSV_CHICBEG+1) = GCHTMP - ENDDO - ENDIF - - DO JSV=NSV_CHICBEG,NSV_CHICEND - IF (GICBOUNDARY(JSV-NSV_CHICBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF -IF (LORILAM .AND. IMI == 1) THEN - IF (GFIRSTCALL2) THEN - ALLOCATE(GAERBOUNDARY(NSV_AER)) - GFIRSTCALL2 = .FALSE. - DO JSV=NSV_AERBEG,NSV_AEREND - GCHTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GAERBOUNDARY(JSV-NSV_AERBEG+1) = GCHTMP - ENDDO - ENDIF - - DO JSV=NSV_AERBEG,NSV_AEREND - IF (GAERBOUNDARY(JSV-NSV_AERBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF -! -IF (LDUST .AND. IMI == 1) THEN - IF (GFIRSTCALL3) THEN - ALLOCATE(GDSTBOUNDARY(NSV_DST)) - GFIRSTCALL3 = .FALSE. - DO JSV=NSV_DSTBEG,NSV_DSTEND - GCHTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GDSTBOUNDARY(JSV-NSV_DSTBEG+1) = GCHTMP - ENDDO - ENDIF - - DO JSV=NSV_DSTBEG,NSV_DSTEND - IF (GDSTBOUNDARY(JSV-NSV_DSTBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF -! -IF (LSALT .AND. IMI == 1) THEN - IF (GFIRSTCALL5) THEN - ALLOCATE(GSLTBOUNDARY(NSV_SLT)) - GFIRSTCALL5 = .FALSE. - DO JSV=NSV_SLTBEG,NSV_SLTEND - GCHTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GSLTBOUNDARY(JSV-NSV_SLTBEG+1) = GCHTMP - ENDDO - ENDIF - - DO JSV=NSV_SLTBEG,NSV_SLTEND - IF (GSLTBOUNDARY(JSV-NSV_SLTBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF -! -IF ( LPASPOL .AND. IMI == 1) THEN - IF (GFIRSTCALLPP) THEN - ALLOCATE(GPPBOUNDARY(NSV_PP)) - GFIRSTCALLPP = .FALSE. - DO JSV=NSV_PPBEG,NSV_PPEND - GPPTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GPPBOUNDARY(JSV-NSV_PPBEG+1) = GPPTMP - ENDDO - ENDIF - - DO JSV=NSV_PPBEG,NSV_PPEND - IF (GPPBOUNDARY(JSV-NSV_PPBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF -! -IF ( LCONDSAMP .AND. IMI == 1) THEN - IF (GFIRSTCALLCS) THEN - ALLOCATE(GCSBOUNDARY(NSV_CS)) - GFIRSTCALLCS = .FALSE. - DO JSV=NSV_CSBEG,NSV_CSEND - GCSTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GCSBOUNDARY(JSV-NSV_CSBEG+1) = GCSTMP - ENDDO - ENDIF - - DO JSV=NSV_CSBEG,NSV_CSEND - IF (GCSBOUNDARY(JSV-NSV_CSBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF - -IF (LBLOWSNOW .AND. IMI == 1) THEN - IF (GFIRSTCALL3) THEN - ALLOCATE(GSNWBOUNDARY(NSV_SNW)) - GFIRSTCALL3 = .FALSE. - DO JSV=NSV_SNWBEG,NSV_SNWEND - GCHTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(1,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,1,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY,:,JSV)==0) - GSNWBOUNDARY(JSV-NSV_SNWBEG+1) = GCHTMP - ENDDO - ENDIF -ENDIF - -#ifdef MNH_FOREFIRE -!ForeFire -IF ( LFOREFIRE .AND. IMI == 1) THEN - IF (GFIRSTCALLFF) THEN - ALLOCATE(GFFBOUNDARY(NSV_FF)) - GFIRSTCALLFF = .FALSE. - DO JSV=NSV_FFBEG,NSV_FFEND - GFFTMP = .FALSE. - IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0) - IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0) - IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0) - IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0) - GFFBOUNDARY(JSV-NSV_FFBEG+1) = GFFTMP - ENDDO - ENDIF - - DO JSV=NSV_FFBEG,NSV_FFEND - IF (GFFBOUNDARY(JSV-NSV_FFBEG+1)) THEN - IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) - ENDIF - ENDIF - ENDDO -ENDIF -#endif -! -IF ( CELEC /= 'NONE' .AND. (NSV_ELEC_A(NDAD(IMI)) == 0 .OR. IMI == 1)) THEN - CALL ION_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT) -ENDIF -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE BOUNDARIES diff --git a/src/PHYEX/ext/ch_aqueous_sedim1mom.f90 b/src/PHYEX/ext/ch_aqueous_sedim1mom.f90 deleted file mode 100644 index ba0b6ffd5..000000000 --- a/src/PHYEX/ext/ch_aqueous_sedim1mom.f90 +++ /dev/null @@ -1,382 +0,0 @@ -!MNH_LIC Copyright 2007-2019 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!------------------------------------------------------------------------------- -! ################################ - MODULE MODI_CH_AQUEOUS_SEDIM1MOM -! ################################ -! -INTERFACE - SUBROUTINE CH_AQUEOUS_SEDIM1MOM (KSPLITR, HCLOUD, OUSECHIC, PTSTEP, & - PZZ, PRHODREF, PRHODJ, PRRS, & - PRSS, PRGS, PRRSVS, PSGRSVS, PINPRR ) -! -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Cloud parameterization -INTEGER, INTENT(IN) :: KSPLITR ! Current time -REAL, INTENT(IN) :: PTSTEP ! Time step -LOGICAL, INTENT(IN) :: OUSECHIC ! flag for ice chem. -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRS ! Rainwater m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRSS ! Snow m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS ! Graupel m.r. source -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRSVS ! Rainwater aq. species source -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSGRSVS ! Precip. ice species source -REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRR ! instantaneaous precip. -! -END SUBROUTINE CH_AQUEOUS_SEDIM1MOM -END INTERFACE -END MODULE MODI_CH_AQUEOUS_SEDIM1MOM -! -! ###################################################################### - SUBROUTINE CH_AQUEOUS_SEDIM1MOM (KSPLITR, HCLOUD, OUSECHIC, PTSTEP, & - PZZ, PRHODREF, PRHODJ, PRRS, & - PRSS, PRGS, PRRSVS, PSGRSVS, PINPRR ) -! ###################################################################### -! -!!**** * - compute the explicit microphysical sources -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the sedimentation -!! of chemical species in the raindrops for the Kessler, ICE2, ICE3 and -!! ICE4 cloud microphysical scheme -!! The sedimentation rates are computed with a time spliting technique: -!! an upstream scheme, written as a difference of non-advective fluxes. -!! This source term is added to the next coming time step (split-implicit -!! process). see rain_ice.f90 -!! -!! -!!** METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! None -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_PARAMETERS -!! JPHEXT : Horizontal external points number -!! JPVEXT : Vertical external points number -!! Module MODD_CONF : -!! CCONF configuration of the model for the first time step -!! -!! REFERENCE -!! --------- -!! Book1 of the documentation ( routine CH_AQUEOUS_SEDIM1MOM ) -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 22/07/07 -!! 04/11/08 (M Leriche) add ICE3 -!! 17/09/10 (M Leriche) add LUSECHIC flag -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! 16/12/15 (M Leriche) compute instantaneous rain at the surface -! P. Wautelet 12/02/2019: bugfix: ZRR_SEDIM was not initialized everywhere -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 -! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT -USE MODD_CONF -USE MODD_CST, ONLY : XRHOLW -USE MODD_CLOUDPAR, ONLY : VCEXVT=>XCEXVT, XCRS, XCEXRS -USE MODD_RAIN_ICE_DESCR_n, ONLY : WCEXVT=>XCEXVT, WRTMIN=>XRTMIN -USE MODD_RAIN_ICE_PARAM_n, ONLY : XFSEDR, XEXSEDR, & - XFSEDS, XEXSEDS, & - XFSEDG, XEXSEDG - -use mode_tools, only: Countjv -use mode_tools_ll, only: GET_INDICE_ll - -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -! -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Cloud parameterization -INTEGER, INTENT(IN) :: KSPLITR ! Current time -REAL, INTENT(IN) :: PTSTEP ! Time step -LOGICAL, INTENT(IN) :: OUSECHIC ! flag for ice chem. -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRS ! Rainwater m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRSS ! Snow m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS ! Graupel m.r. source -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRSVS ! Rainwater aq. species source -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSGRSVS ! Precip. ice species source -REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRR ! instantaneaous precip. -! -!* 0.2 Declarations of local variables : -! -INTEGER :: JK,JI,JJ ! Vertical loop index for the rain sedimentation -INTEGER :: JN ! Temporal loop index for the rain sedimentation -INTEGER :: IIB ! Define the domain where is -INTEGER :: IIE ! the microphysical sources have to be computed -INTEGER :: IJB ! -INTEGER :: IJE ! -INTEGER :: IKB ! -INTEGER :: IKE ! -! -REAL :: ZTSPLITR ! Small time step for rain sedimentation -! -INTEGER :: ISEDIMR, ISEDIMS, ISEDIMG ! Case number of sedimentation -LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: GSEDIMR ! where to compute the SED processes -LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: GSEDIMS ! where to compute the SED processes -LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: GSEDIMG ! where to compute the SED processes -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZRRS ! rainwater m.r.source phys.tendency -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZRSS ! snow m.r.source phys.tendency -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZRGS ! graupel m.r.source phys.tendency -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZW ! work array -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZWSED ! sedimentation fluxes -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZZRRS ! Rainwater m.r. source phys.tendency *dt -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZZRSS ! Snow m.r. source phys.tendency *dt -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZZRGS ! Graupel m.r. source phys.tendency *dt -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZRR_SEDIM ! Drain/Dt sur ZTSPLIT -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZSV_SEDIM_FACTR ! Cumul des Dsv/DT -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZSV_SEDIM_FACTS ! Cumul des Dsv/DT -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & - :: ZSV_SEDIM_FACTG ! Cumul des Dsv/DT -REAL, DIMENSION(:), ALLOCATABLE :: ZZZRRS ! Rainwater m.r. source -REAL, DIMENSION(:), ALLOCATABLE :: ZZZRSS ! Snow m.r. source -REAL, DIMENSION(:), ALLOCATABLE :: ZZZRGS ! Graupel m.r. source -! -REAL, DIMENSION(:), ALLOCATABLE :: ZRHODREF, & ! RHO Dry REFerence - ZZW ! Work array -REAL, DIMENSION(7), SAVE :: Z_XRTMIN -! -REAL :: ZVTRMAX, ZT -LOGICAL, SAVE :: GSFIRSTCALL = .TRUE. -REAL, SAVE :: ZFSEDR, ZEXSEDR, ZCEXVT -! -INTEGER , DIMENSION(SIZE(GSEDIMR)) :: IR1,IR2,IR3 ! Used to replace the COUNT -INTEGER , DIMENSION(SIZE(GSEDIMS)) :: IS1,IS2,IS3 ! Used to replace the COUNT -INTEGER , DIMENSION(SIZE(GSEDIMG)) :: IG1,IG2,IG3 ! Used to replace the COUNT -INTEGER :: JL ! and PACK intrinsics -! -!------------------------------------------------------------------------------- -! -!* 1. COMPUTE THE LOOP BOUNDS -! ----------------------- -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB=1+JPVEXT -IKE=SIZE(PZZ,3) - JPVEXT -PINPRR(:,:) = 0. ! initialize instantaneous precip. -! -!------------------------------------------------------------------------------- -! -!!* 2. TRANSFORMATION INTO PHYSICAL TENDENCIES -! --------------------------------------- -! -ZRRS(:,:,:) = PRRS(:,:,:) / PRHODJ(:,:,:) -IF (HCLOUD(1:3) == 'ICE') THEN - ZRSS(:,:,:) = PRSS(:,:,:) / PRHODJ(:,:,:) - ZRGS(:,:,:) = PRGS(:,:,:) / PRHODJ(:,:,:) -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 3. COMPUTE THE SEDIMENTATION (RS) SOURCE -! ------------------------------------- -! -!* 3.1 Initialize some constants -! -firstcall : IF (GSFIRSTCALL) THEN - GSFIRSTCALL = .FALSE. - SELECT CASE ( HCLOUD) - CASE('KESS') - ZVTRMAX = 20. - CASE('ICE3') - ZVTRMAX = 10. - CASE('ICE4') - ZVTRMAX = 40. - END SELECT -! - SELECT CASE ( HCLOUD ) ! constants for rain sedimentation - CASE('KESS') - Z_XRTMIN(2:3) = 1.0E-20 ! Default values - ZFSEDR = XCRS - ZEXSEDR = XCEXRS - ZCEXVT = VCEXVT - CASE('ICE3','ICE4') - Z_XRTMIN(1:SIZE(WRTMIN)) = WRTMIN ! Values given in ICEx schemes - ZFSEDR = XFSEDR - ZEXSEDR = XEXSEDR - ZCEXVT = WCEXVT - END SELECT -END IF firstcall -! -!* 3.2 time splitting loop initialization -! -ZTSPLITR = PTSTEP / REAL(KSPLITR) ! Small time step -! -!* 3.3 compute the fluxes -! -ZSV_SEDIM_FACTR(:,:,:) = 1.0 -ZZRRS(:,:,:) = ZRRS(:,:,:) * PTSTEP -IF (HCLOUD(1:3) == 'ICE') THEN - ZZRSS(:,:,:) = ZRSS(:,:,:) * PTSTEP - ZZRGS(:,:,:) = ZRGS(:,:,:) * PTSTEP - ZSV_SEDIM_FACTS(:,:,:) = 1.0 - ZSV_SEDIM_FACTG(:,:,:) = 1.0 -ENDIF -DO JN = 1 , KSPLITR - IF( JN==1 ) THEN - ZW(:,:,:) = 0.0 - DO JK = IKB , IKE-1 - ZW(:,:,JK) =ZTSPLITR*2./(PRHODREF(:,:,JK)*(PZZ(:,:,JK+2)-PZZ(:,:,JK))) - END DO - ZW(:,:,IKE) =ZTSPLITR/(PRHODREF(:,:,IKE)*(PZZ(:,:,IKE+1)-PZZ(:,:,IKE))) - END IF -! -!* 3.3.1 for rain -! - GSEDIMR(:,:,:) = .FALSE. - GSEDIMR(IIB:IIE,IJB:IJE,IKB:IKE) = ZZRRS(IIB:IIE,IJB:IJE,IKB:IKE) > Z_XRTMIN(3) - ISEDIMR = COUNTJV( GSEDIMR(:,:,:),IR1(:),IR2(:),IR3(:)) -! - IF ( ISEDIMR >= 1 ) THEN - ALLOCATE(ZZZRRS(ISEDIMR)) - ALLOCATE(ZRHODREF(ISEDIMR)) - DO JL=1,ISEDIMR - ZZZRRS(JL) = ZZRRS(IR1(JL),IR2(JL),IR3(JL)) - ZRHODREF(JL) = PRHODREF(IR1(JL),IR2(JL),IR3(JL)) - ENDDO - ALLOCATE(ZZW(ISEDIMR)) ; ZZW(:) = 0.0 -! - ZZW(:) = ZFSEDR * ZZZRRS(:)**(ZEXSEDR) * ZRHODREF(:)**(ZEXSEDR-ZCEXVT) - ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMR(:,:,:),FIELD=0.0 ) - ZRR_SEDIM(:,:,:) = 0.0 - DO JK = IKB , IKE - ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK)) - END DO - ZZRRS(:,:,:) = ZZRRS(:,:,:) + ZRR_SEDIM(:,:,:) - PINPRR(:,:) = PINPRR(:,:) + ZWSED(:,:,IKB)/XRHOLW/KSPLITR -! - ZZW(:) = ZFSEDR * ZZZRRS(:)**(ZEXSEDR-1.0) * ZRHODREF(:)**(ZEXSEDR-ZCEXVT) - ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMR(:,:,:),FIELD=0.0 ) - ZRR_SEDIM(:,:,:) = 0.0 - DO JK = IKB , IKE - ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK)) - END DO - DEALLOCATE(ZRHODREF) - DEALLOCATE(ZZZRRS) - DEALLOCATE(ZZW) - ZSV_SEDIM_FACTR(:,:,:) = ZSV_SEDIM_FACTR(:,:,:) * (1.0 + ZRR_SEDIM(:,:,:)) -!! (1.0 + ZRR_SEDIM(:,:,:)/MAX(ZZRRS(:,:,:),XRTMIN_AQ)) - END IF - IF (HCLOUD == 'KESS') EXIT -! -!* 3.3.1 for iced precip.hydrometeors -! - GSEDIMS(:,:,:) = .FALSE. - GSEDIMG(:,:,:) = .FALSE. - GSEDIMS(IIB:IIE,IJB:IJE,IKB:IKE) = ZZRSS(IIB:IIE,IJB:IJE,IKB:IKE) > Z_XRTMIN(5) - GSEDIMG(IIB:IIE,IJB:IJE,IKB:IKE) = ZZRGS(IIB:IIE,IJB:IJE,IKB:IKE) > Z_XRTMIN(6) - ISEDIMS = COUNTJV( GSEDIMS(:,:,:),IS1(:),IS2(:),IS3(:)) - ISEDIMG = COUNTJV( GSEDIMG(:,:,:),IG1(:),IG2(:),IG3(:)) -! for snow - IF ( ISEDIMS >= 1) THEN - ALLOCATE(ZZZRSS(ISEDIMS)) - ALLOCATE(ZRHODREF(ISEDIMS)) - DO JL=1,ISEDIMS - ZZZRSS(JL) = ZZRSS(IS1(JL),IS2(JL),IS3(JL)) - ZRHODREF(JL) = PRHODREF(IS1(JL),IS2(JL),IS3(JL)) - ENDDO - ALLOCATE(ZZW(ISEDIMS)) ; ZZW(:) = 0.0 -! - ZZW(:) = XFSEDS * ZZZRSS(:)**(XEXSEDS) * ZRHODREF(:)**(XEXSEDS-ZCEXVT) - ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMS(:,:,:),FIELD=0.0 ) - ZRR_SEDIM(:,:,:) = 0.0 - DO JK = IKB , IKE - ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK)) - END DO - ZZRSS(:,:,:) = ZZRSS(:,:,:) + ZRR_SEDIM(:,:,:) -! - ZZW(:) = XFSEDS * ZZZRSS(:)**(XEXSEDS-1.0) * ZRHODREF(:)**(XEXSEDS-ZCEXVT) - ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMS(:,:,:),FIELD=0.0 ) - ZRR_SEDIM(:,:,:) = 0.0 - DO JK = IKB , IKE - ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK)) - END DO - DEALLOCATE(ZRHODREF) - DEALLOCATE(ZZZRSS) - DEALLOCATE(ZZW) - ZSV_SEDIM_FACTS(:,:,:) = ZSV_SEDIM_FACTS(:,:,:) * (1.0 + ZRR_SEDIM(:,:,:)) - ENDIF -! for graupel - IF ( ISEDIMG >= 1) THEN - ALLOCATE(ZZZRGS(ISEDIMG)) - ALLOCATE(ZRHODREF(ISEDIMG)) - DO JL=1,ISEDIMG - ZZZRGS(JL) = ZZRGS(IG1(JL),IG2(JL),IG3(JL)) - ZRHODREF(JL) = PRHODREF(IG1(JL),IG2(JL),IG3(JL)) - ENDDO - ALLOCATE(ZZW(ISEDIMG)) ; ZZW(:) = 0.0 -! - ZZW(:) = XFSEDG * ZZZRGS(:)**(XEXSEDG) * ZRHODREF(:)**(XEXSEDG-ZCEXVT) - ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMG(:,:,:),FIELD=0.0 ) - ZRR_SEDIM(:,:,:) = 0.0 - DO JK = IKB , IKE - ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK)) - END DO - ZZRGS(:,:,:) = ZZRGS(:,:,:) + ZRR_SEDIM(:,:,:) -! - ZZW(:) = XFSEDG * ZZZRGS(:)**(XEXSEDG-1.0) * ZRHODREF(:)**(XEXSEDG-ZCEXVT) - ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMG(:,:,:),FIELD=0.0 ) - ZRR_SEDIM(:,:,:) = 0.0 - DO JK = IKB , IKE - ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK)) - END DO - DEALLOCATE(ZRHODREF) - DEALLOCATE(ZZZRGS) - DEALLOCATE(ZZW) - ZSV_SEDIM_FACTG(:,:,:) = ZSV_SEDIM_FACTG(:,:,:) * (1.0 + ZRR_SEDIM(:,:,:)) - ENDIF -END DO -! -! Apply the rain sedimentation rate to the WR_xxx aqueous species -DO JL= 1, SIZE(PRRSVS,4) - PRRSVS(:,:,:,JL) = MAX( 0.0,ZSV_SEDIM_FACTR(:,:,:)*PRRSVS(:,:,:,JL) ) -ENDDO -!ice phase -IF (OUSECHIC) THEN - DO JL= 1, SIZE(PSGRSVS,4) - PSGRSVS(:,:,:,JL) = MAX( 0.0, & - ((ZSV_SEDIM_FACTS(:,:,:)+ZSV_SEDIM_FACTG(:,:,:))/2.) & - *PSGRSVS(:,:,:,JL) ) - ENDDO -ENDIF -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE CH_AQUEOUS_SEDIM1MOM diff --git a/src/PHYEX/ext/ch_aqueous_tmicice.f90 b/src/PHYEX/ext/ch_aqueous_tmicice.f90 deleted file mode 100644 index 51255f6fd..000000000 --- a/src/PHYEX/ext/ch_aqueous_tmicice.f90 +++ /dev/null @@ -1,1304 +0,0 @@ -!MNH_LIC Copyright 2008-2019 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! #################################### - MODULE MODI_CH_AQUEOUS_TMICICE -! #################################### -! -INTERFACE - SUBROUTINE CH_AQUEOUS_TMICICE( PTSTEP, PRHODREF, PRHODJ, PTHT, PPABST, & - PRTMIN_AQ, OUSECHIC, OCH_RET_ICE, HNAMES, & - HICNAMES, KEQ, KEQAQ, PRVT, PRCT, PRRT, PRIT,& - PRST, PRGT, PCIT, PRCS, PRRS, PRIS, PRSS, & - PRGS, PGSVT, PGRSVS, PCSVT, PCRSVS, PRSVT, & - PRRSVS, PSGSVT, PSGRSVS ) -! -REAL, INTENT(IN) :: PTSTEP ! Time step -REAL, INTENT(IN) :: PRTMIN_AQ ! LWC threshold liq. chem. -INTEGER, INTENT(IN) :: KEQ ! Number of chem. spec. -INTEGER, INTENT(IN) :: KEQAQ ! Number of liq. chem. spec. -LOGICAL, INTENT(IN) :: OUSECHIC ! flag for ice chem. -LOGICAL, INTENT(IN) :: OCH_RET_ICE ! flag for retention in ice -! -CHARACTER(LEN=32), DIMENSION(:), INTENT(IN) :: HNAMES ! name of chem. species -CHARACTER(LEN=32), DIMENSION(:), INTENT(IN) :: HICNAMES ! name of ice chem. species -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Vapor m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! cloud water m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rainwater m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Pristine m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine conc. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCS ! cloud water m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRS ! Rainwater m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIS ! Pristine m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRSS ! Snow m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS ! graupel m.r. source -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PGSVT ! gas species at t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PGRSVS ! gas species source -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PCSVT ! cloud water aq. species at t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PCRSVS ! cloud water aq. species source -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRSVT ! Rainwater aq. species at t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRSVS ! Rainwater aq. species source -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSGSVT ! ice species at t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSGRSVS ! ice species source -! -END SUBROUTINE CH_AQUEOUS_TMICICE -END INTERFACE -END MODULE MODI_CH_AQUEOUS_TMICICE -! -! ################################################################################ - SUBROUTINE CH_AQUEOUS_TMICICE( PTSTEP, PRHODREF, PRHODJ, PTHT, PPABST, & - PRTMIN_AQ, OUSECHIC, OCH_RET_ICE, HNAMES, & - HICNAMES, KEQ, KEQAQ, PRVT, PRCT, PRRT, PRIT,& - PRST, PRGT, PCIT, PRCS, PRRS, PRIS, PRSS, & - PRGS, PGSVT, PGRSVS, PCSVT, PCRSVS, PRSVT, & - PRRSVS, PSGSVT, PSGRSVS ) -! ################################################################################ -! -!!**** * - compute the explicit microphysical sources -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the microphysical sources -!! corresponding to collision/coalescence processes (autoconversion + accretion) -!! and to the freezing, rimin and melting processes for snow and graupel -!! for the ICE3(4) cloud microphysics parameterization (see rain_ice) -!! -!! -!!** METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! None -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_PARAMETERS -!! JPHEXT : Horizontal external points number -!! JPVEXT : Vertical external points number -!! -!! REFERENCE -!! --------- -!! Book1 of the documentation ( routine CH_AQUEOUS_TMICICE ) -!! -!! AUTHOR -!! ------ -!! C. Mari J.P. Pinty M. Leriche * Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 26/03/08 -!! M. Leriche 19/07/2010 add riming, freezing and melting for ice phase(ICE3) -!! M. Leriche 17/09/2010 add OUSECHIC flag -!! Juan 24/09/2012: for BUG Pgi rewrite PACK function on mode_pack_pgi -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! M.Leriche 2015 correction bug -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 -! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS, ONLY : JPHEXT, &! number of horizontal External points - JPVEXT ! number of vertical External points -USE MODD_CST, ONLY : XP00, XRD, XRV, XCPD, XTT, XLMTT, XLVTT, XCPV, & - XCL, XCI, XESTT, XMV, XMD -USE MODD_RAIN_ICE_DESCR_n, ONLY : XLBR, XLBEXR, XCEXVT, XLBDAS_MAX, XLBS, XLBEXS, & - XLBG, XLBEXG, XCXS, XCXG, XDG, XBS -USE MODD_RAIN_ICE_PARAM_n, ONLY : XTIMAUTC, XCRIAUTC, XFCACCR, XEXCACCR, & - XRIMINTP1, XRIMINTP2, XCRIMSS, XCRIMSG,& - XEXCRIMSS, XEXCRIMSG, NGAMINC, XGAMINC_RIM1, & - XFRACCSS, XLBRACCS1, XLBRACCS2, XLBRACCS3, & - XACCINTP1S, XACCINTP2S, XACCINTP1R, XACCINTP2R, & - NACCLBDAS, NACCLBDAR, XKER_RACCSS, XKER_RACCS, & - XEXRCFRI, XRCFRI, X0DEPG, XEX0DEPG, X1DEPG, & - XEX1DEPG, XSCFAC, XFCDRYG, XFIDRYG, XCOLEXIG, & - XCOLEXSG, XFSDRYG, NDRYLBDAG, XDRYINTP1G, & - XDRYINTP2G, NDRYLBDAS, XDRYINTP1S, XDRYINTP2S, & - XKER_SDRYG, XLBSDRYG1, XLBSDRYG2, XLBSDRYG3, & - XFRDRYG, NDRYLBDAR, XDRYINTP1R, XDRYINTP2R, & - XKER_RDRYG, XLBRDRYG1, XLBRDRYG2, XLBRDRYG3, & - XCOLIG, XCOLEXIG, XCOLSG, XCOLEXSG -USE MODD_CH_ICE ! value of retention coefficient -USE MODD_CH_ICE_n ! index for ice phase chemistry with IC3/4 -! -#ifdef MNH_PGI -USE MODE_PACK_PGI -#endif -use mode_tools, only: Countjv -use mode_tools_ll, only: GET_INDICE_ll -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -! -REAL, INTENT(IN) :: PTSTEP ! Time step -REAL, INTENT(IN) :: PRTMIN_AQ ! LWC threshold liq. chem. -INTEGER, INTENT(IN) :: KEQ ! Number of chem. spec. -INTEGER, INTENT(IN) :: KEQAQ ! Number of liq. chem. spec. -LOGICAL, INTENT(IN) :: OUSECHIC ! flag for ice chem. -LOGICAL, INTENT(IN) :: OCH_RET_ICE ! flag for retention in ice -! -CHARACTER(LEN=32), DIMENSION(:), INTENT(IN) :: HNAMES ! name of chem. species -CHARACTER(LEN=32), DIMENSION(:), INTENT(IN) :: HICNAMES ! name of ice chem. species -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Vapor m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! cloud water m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rainwater m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Pristine m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine conc. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCS ! cloud water m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRS ! Rainwater m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIS ! Pristine m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRSS ! Snow m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS ! graupel m.r. source -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PGSVT ! gas species at t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PGRSVS ! gas species source -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PCSVT ! cloud water aq. species at t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PCRSVS ! cloud water aq. species source -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRSVT ! Rainwater aq. species at t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRSVS ! Rainwater aq. species source -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSGSVT ! ice species at t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSGRSVS ! ice species source -! -!* 0.2 Declarations of local variables : -! -INTEGER :: JLC, JLR, JLI, JLG, JLW ! Loop index for cloud water, rainwater and ice species -INTEGER :: JJ ! Loop index -INTEGER :: IIB ! Define the domain where is -INTEGER :: IIE ! the microphysical sources have to be computed -INTEGER :: IJB -INTEGER :: IJE -INTEGER :: IKB -INTEGER :: IKE -! -INTEGER :: IMICRO ! case number of r_x>0 locations -LOGICAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) & - :: GMICRO ! where to compute mic. processes -REAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) & - :: ZT ! Temperature -REAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) & - :: ZRCS ! Cloud water m.r. source phys.tendency -REAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) & - :: ZRRS ! Rain water m.r. source phys. tendency -REAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) & - :: ZRIS ! Pristine m.r. source phys. tendency -REAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) & - :: ZRSS ! Snow m.r. source phys. tendency -REAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) & - :: ZRGS ! Graupel m.r. source phys. tendency -REAL, DIMENSION(SIZE(PGRSVS,1),SIZE(PGRSVS,2),SIZE(PGRSVS,3),SIZE(PGRSVS,4)) & - :: ZZGRSVS ! Gas species source -REAL, DIMENSION(SIZE(PCRSVS,1),SIZE(PCRSVS,2),SIZE(PCRSVS,3),SIZE(PCRSVS,4)) & - :: ZZCRSVS ! Cloud water aq. species source -REAL, DIMENSION(SIZE(PRRSVS,1),SIZE(PRRSVS,2),SIZE(PRRSVS,3),SIZE(PRRSVS,4)) & - :: ZZRRSVS ! Rain water aq. species source -REAL, DIMENSION(SIZE(PSGRSVS,1),SIZE(PSGRSVS,2),SIZE(PSGRSVS,3),SIZE(PSGRSVS,4)) & - :: ZZSGRSVS ! Ice (snow+graupel) species source -REAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) & - :: ZCW ! work array -REAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) & - :: ZRW ! work array -REAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) & - :: ZSGW ! work array -REAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) & - :: ZGW ! work array -REAL, DIMENSION(:), ALLOCATABLE :: ZZT ! Temperature -REAL, DIMENSION(:), ALLOCATABLE :: ZPRES ! Pressure -REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Vapor m.r. at t -REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t -REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t -REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine m.r. at t -REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow m.r. at t -REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel m.r. at t -REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine conc. at t -REAL, DIMENSION(:), ALLOCATABLE :: ZZRCS ! Cloud water m.r. source -REAL, DIMENSION(:), ALLOCATABLE :: ZZRRS ! Rain water m.r. source -REAL, DIMENSION(:), ALLOCATABLE :: ZZRIS ! Pristine m.r. source -REAL, DIMENSION(:), ALLOCATABLE :: ZZRSS ! snow m.r. source -REAL, DIMENSION(:), ALLOCATABLE :: ZZRGS ! graupel m.r. source -REAL, DIMENSION(:,:), ALLOCATABLE :: ZCSVT ! Cloud water aq. species at t -REAL, DIMENSION(:,:), ALLOCATABLE :: ZRSVT ! Rain water aq. species at t -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSGSVT ! Ice (snow + graupel) species at t -REAL, DIMENSION(:,:), ALLOCATABLE :: ZGRSVS ! Gas species source -REAL, DIMENSION(:,:), ALLOCATABLE :: ZCRSVS ! Cloud water aq. species source -REAL, DIMENSION(:,:), ALLOCATABLE :: ZRRSVS ! Rain water aq. species source -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSGRSVS! Ice (snow+graupel) species source -REAL, DIMENSION(:), ALLOCATABLE :: ZCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(:), ALLOCATABLE :: ZKA ! Thermal conductivity of the air -REAL, DIMENSION(:), ALLOCATABLE :: ZDV ! Diffusivity of water vapor in the air -! -REAL, DIMENSION(:), ALLOCATABLE :: ZRHODREF, & ! RHO Dry REFerence - ZZW, & ! Work array - ZLBDAR, & ! Slope parameter of the raindrop distribution - ZLBDAS, & ! Slope parameter of the snow distribution - ZLBDAG, & ! Slope parameter of the graupel distribution - ZRDRYG, & ! Dry growth rate of the graupel - ZRWETG ! Wet growth rate of the graupel -! -INTEGER :: IGRIM, IGACC ! Case number of riming, accretion -INTEGER :: IGDRY -!, IGWET ! dry growth and wet growth locations for graupels -LOGICAL, DIMENSION(:), ALLOCATABLE :: GRIM ! Test where to compute riming -LOGICAL, DIMENSION(:), ALLOCATABLE :: GACC ! Test where to compute accretion -LOGICAL, DIMENSION(:), ALLOCATABLE :: GDRY ! Test where to compute dry growth -!LOGICAL, DIMENSION(:), ALLOCATABLE :: GWET ! Test where to compute wet growt -INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1,IVEC2 ! Vectors of indices for - ! interpolations -REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1,ZVEC2,ZVEC3 ! Work vectors for - ! interpolations -REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4 ! Work arrays -! -INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace the COUNT -INTEGER :: JL ! and PACK intrinsics -! -! -! compute the temperature -! -ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:) / XP00 ) ** (XRD/XCPD) -! -!------------------------------------------------------------------------------- -! -!* 1. COMPUTE THE LOOP BOUNDS -! ----------------------- -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB=1+JPVEXT -IKE=SIZE(PRCT,3) - JPVEXT -! -!------------------------------------------------------------------------------- -! -!!* 2. TRANSFORMATION INTO PHYSICAL TENDENCIES -! --------------------------------------- -! -ZRCS(:,:,:) = PRCS(:,:,:) / PRHODJ(:,:,:) -ZRRS(:,:,:) = PRRS(:,:,:) / PRHODJ(:,:,:) -ZRSS(:,:,:) = PRSS(:,:,:) / PRHODJ(:,:,:) -ZRIS(:,:,:) = PRIS(:,:,:) / PRHODJ(:,:,:) -ZRGS(:,:,:) = PRGS(:,:,:) / PRHODJ(:,:,:) -! -DO JLC= 1, SIZE(PCRSVS,4) - ZZCRSVS(:,:,:,JLC) = PCRSVS(:,:,:,JLC) / PRHODJ(:,:,:) -ENDDO -DO JLR= 1, SIZE(PRRSVS,4) - ZZRRSVS(:,:,:,JLR) = PRRSVS(:,:,:,JLR) / PRHODJ(:,:,:) -ENDDO -IF (OUSECHIC) THEN - DO JLG= 1, SIZE(PGRSVS,4) - ZZGRSVS(:,:,:,JLG) = PGRSVS(:,:,:,JLG) / PRHODJ(:,:,:) - ENDDO - DO JLI= 1, SIZE(PSGRSVS,4) - ZZSGRSVS(:,:,:,JLI) = PSGRSVS(:,:,:,JLI) / PRHODJ(:,:,:) - ENDDO -ELSE - IF (.NOT.(OCH_RET_ICE)) THEN - DO JLG= 1, SIZE(PGRSVS,4) - ZZGRSVS(:,:,:,JLG) = PGRSVS(:,:,:,JLG) / PRHODJ(:,:,:) - ENDDO - ENDIF -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 3. OPTIMIZATION: looking for locations where m.r. hydro. > min value -! ----------------------------------------------------------------- -! -GMICRO(:,:,:) = .FALSE. -GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & - (PRCT(IIB:IIE,IJB:IJE,IKB:IKE)>PRTMIN_AQ*1.e3/PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) .OR. & - (PRRT(IIB:IIE,IJB:IJE,IKB:IKE)>PRTMIN_AQ*1.e3/PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) .OR. & - (PRST(IIB:IIE,IJB:IJE,IKB:IKE)>PRTMIN_AQ*1.e3/PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) .OR. & - (PRGT(IIB:IIE,IJB:IJE,IKB:IKE)>PRTMIN_AQ*1.e3/PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) -! -IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) -IF( IMICRO >= 1 ) THEN - ALLOCATE(ZZT(IMICRO)) - ALLOCATE(ZPRES(IMICRO)) - ALLOCATE(ZRVT(IMICRO)) - ALLOCATE(ZRCT(IMICRO)) - ALLOCATE(ZRRT(IMICRO)) - ALLOCATE(ZRIT(IMICRO)) - ALLOCATE(ZRST(IMICRO)) - ALLOCATE(ZRGT(IMICRO)) - ALLOCATE(ZCIT(IMICRO)) - ALLOCATE(ZCSVT(IMICRO,SIZE(PCSVT,4))) - ALLOCATE(ZRSVT(IMICRO,SIZE(PRSVT,4))) - ALLOCATE(ZZRCS(IMICRO)) - ALLOCATE(ZZRRS(IMICRO)) - ALLOCATE(ZZRIS(IMICRO)) - ALLOCATE(ZZRSS(IMICRO)) - ALLOCATE(ZZRGS(IMICRO)) - ALLOCATE(ZCRSVS(IMICRO,SIZE(PCRSVS,4))) - ALLOCATE(ZRRSVS(IMICRO,SIZE(PRRSVS,4))) - ALLOCATE(ZRHODREF(IMICRO)) - ALLOCATE(ZZW(IMICRO)) - ALLOCATE(ZZW2(IMICRO,SIZE(PCSVT,4))) - ALLOCATE(ZZW4(IMICRO,SIZE(PCSVT,4))) - ALLOCATE(ZZW1(IMICRO,6)) - ALLOCATE(ZLBDAR(IMICRO)) - ALLOCATE(ZLBDAS(IMICRO)) - ALLOCATE(ZLBDAG(IMICRO)) - ALLOCATE(ZRDRYG(IMICRO)) - ALLOCATE(ZRWETG(IMICRO)) - ALLOCATE(ZKA(IMICRO)) - ALLOCATE(ZDV(IMICRO)) - ALLOCATE(ZCJ(IMICRO)) - DO JL=1,IMICRO - ZCSVT(JL,:) = PCSVT(I1(JL),I2(JL),I3(JL),:) - ZCRSVS(JL,:) = ZZCRSVS(I1(JL),I2(JL),I3(JL),:) - ZRSVT(JL,:) = PRSVT(I1(JL),I2(JL),I3(JL),:) - ZRRSVS(JL,:) = ZZRRSVS(I1(JL),I2(JL),I3(JL),:) -! - ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) - ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) - ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) - ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) - ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) - ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) - ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) -! - ZZRCS(JL) = ZRCS(I1(JL),I2(JL),I3(JL)) - ZZRRS(JL) = ZRRS(I1(JL),I2(JL),I3(JL)) - ZZRIS(JL) = ZRIS(I1(JL),I2(JL),I3(JL)) - ZZRSS(JL) = ZRSS(I1(JL),I2(JL),I3(JL)) - ZZRGS(JL) = ZRGS(I1(JL),I2(JL),I3(JL)) -! - ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) - ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) - ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) - ENDDO - IF (OUSECHIC) THEN - ALLOCATE(ZSGSVT(IMICRO,SIZE(PSGSVT,4))) - ALLOCATE(ZGRSVS(IMICRO,SIZE(PGRSVS,4))) - ALLOCATE(ZSGRSVS(IMICRO,SIZE(PSGRSVS,4))) - ALLOCATE(ZZW3(IMICRO,SIZE(PSGSVT,4))) - DO JL=1,IMICRO - ZGRSVS(JL,:) = ZZGRSVS(I1(JL),I2(JL),I3(JL),:) - ZSGSVT(JL,:) = PSGSVT(I1(JL),I2(JL),I3(JL),:) - ZSGRSVS(JL,:) = ZZSGRSVS(I1(JL),I2(JL),I3(JL),:) - ENDDO - ELSE - IF (.NOT.(OCH_RET_ICE)) THEN - ALLOCATE(ZGRSVS(IMICRO,SIZE(PGRSVS,4))) - DO JL=1,IMICRO - ZGRSVS(JL,:) = ZZGRSVS(I1(JL),I2(JL),I3(JL),:) - ENDDO - ENDIF - ENDIF -! -! -!------------------------------------------------------------------------------- -! -!* 4. COMPUTES THE SLOW WARM PROCESS SOURCES -! -------------------------------------- -! -!* 4.1 compute the slope parameter Lbda_r -! - WHERE( ZRRT(:)>0.0 ) - ZLBDAR(:) = XLBR*( ZRHODREF(:)*MAX( ZRRT(:),PRTMIN_AQ*1.e3/ZRHODREF(:)) )**XLBEXR - END WHERE -! -!* 4.2 compute the autoconversion of r_c for r_r production: RCAUTR -! - ZZW(:) = 0.0 - ZZW2(:,:) = 0.0 -! - DO JL=1,IMICRO - IF ( (ZRCT(JL)>0.0) .AND. (ZZRCS(JL)>0.0) ) THEN - ZZW(JL) = MIN( ZZRCS(JL),XTIMAUTC*MAX( ZRCT(JL)-XCRIAUTC/ZRHODREF(JL),0.0)) -! - ZZW2(JL,:) = ZZW(JL) * ZCSVT(JL,:)/ZRCT(JL) - ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZCSVT(JL,:)/PTSTEP)),0.0) - ZCRSVS(JL,:) = ZCRSVS(JL,:) - ZZW2(JL,:) - ZRRSVS(JL,:) = ZRRSVS(JL,:) + ZZW2(JL,:) - END IF - END DO -! -!* 4.3 compute the accretion of r_c for r_r production: RCACCR -! - ZZW(:) = 0.0 - ZZW2(:,:) = 0.0 -! - DO JL = 1,IMICRO - IF( (ZRCT(JL)>0.0) .AND. (ZRRT(JL)>0.0) .AND. (ZZRCS(JL)>0.0) ) THEN - ZZW(JL) = MIN( ZZRCS(JL),XFCACCR * ZRCT(JL) & - * ZLBDAR(JL)**XEXCACCR & - * ZRHODREF(JL)**(-XCEXVT) ) -! - ZZW2(JL,:) = ZZW(JL) * ZCSVT(JL,:)/ZRCT(JL) - ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZCSVT(JL,:)/PTSTEP)),0.0) - ZCRSVS(JL,:) = ZCRSVS(JL,:) - ZZW2(JL,:) - ZRRSVS(JL,:) = ZRRSVS(JL,:) + ZZW2(JL,:) - END IF - END DO -! -! -!* 4.4 compute the evaporation of r_r: RREVAV -! -! calculated by the kinetic mass transfer equation (BASIC.f90) -! -! -!------------------------------------------------------------------------------- -! -!* 5. COMPUTES THE SLOW COLD PROCESS SOURCES -! -------------------------------------- -! -!* 5.1 compute the spontaneous freezing source: RRHONG -! - ZZW(:) = 0.0 - ZZW2(:,:) = 0.0 -! - DO JL = 1,IMICRO - IF( (ZZT(JL)<XTT-35.0) .AND. (ZRRT(JL)>0.) .AND. (ZZRRS(JL)>0.) ) THEN - ZZW(JL) = MIN( ZZRRS(JL),ZRRT(JL)/PTSTEP ) - ZZW2(JL,:) = ZZW(JL) * ZRSVT(JL,:)/ZRRT(JL) - ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZRSVT(JL,:)/PTSTEP)),0.0) - ZRRSVS(JL,:) = ZRRSVS(JL,:) - ZZW2(JL,:) - IF (OUSECHIC) THEN - DO JLI = 1, SIZE(PSGRSVS,4) - IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' & - .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' & - .OR. NINDEXGI(JLI).EQ.0) THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ZZW2(JL,NINDEXWI(JLI)) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETHP) * ZZW2(JL,NINDEXWI(JLI)) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. & - TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETSU) * ZZW2(JL,NINDEXWI(JLI)) - ELSE - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETDF) * ZZW2(JL,NINDEXWI(JLI)) - ENDIF - ENDDO - ELSE - IF (.NOT.(OCH_RET_ICE)) THEN - DO JLW = 1, SIZE(PRRSVS,4) - IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN - ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW) - ENDIF - ENDDO - ENDIF - ENDIF - ENDIF - ENDDO -! -! -!------------------------------------------------------------------------------- -! -!* 6. COMPUTES THE FAST COLD PROCESS SOURCES -! -------------------------------------- -! -!* 6.1 compute the slope parameter Lbda_s and Lbda_g -! - WHERE ( ZRST(:)>0.0 ) - ZLBDAS(:) = MIN( XLBDAS_MAX, & - XLBS*( ZRHODREF(:)*MAX( ZRST(:),PRTMIN_AQ*1.e3/ZRHODREF(:)) )**XLBEXS ) - END WHERE -! - WHERE ( ZRGT(:)>0.0 ) - ZLBDAG(:) = XLBG*( ZRHODREF(:)*MAX( ZRGT(:),PRTMIN_AQ*1.e3/ZRHODREF(:)))**XLBEXG - END WHERE -! -!* 6.2 cloud droplet riming of the aggregates -! - ZZW1(:,:) = 0.0 - ZZW(:) = 0.0 - - ALLOCATE(GRIM(IMICRO)) - GRIM(:) = (ZRCT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. & - (ZRST(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. & - (ZZRCS(:)>0.0) .AND. (ZZT(:)<XTT) - IGRIM = COUNT( GRIM(:) ) -! - IF( IGRIM>0 ) THEN -! -! 6.2.0 allocations -! - ALLOCATE(ZVEC1(IGRIM)) - ALLOCATE(ZVEC2(IGRIM)) - ALLOCATE(IVEC1(IGRIM)) - ALLOCATE(IVEC2(IGRIM)) -! -! 6.2.1 select the ZLBDAS -! - ZVEC1(:) = PACK( ZLBDAS(:),MASK=GRIM(:) ) -! -! 6.2.2 find the next lower indice for the ZLBDAS in the geometrical -! set of Lbda_s used to tabulate some moments of the incomplete -! gamma function -! - ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( REAL(NGAMINC)-0.00001, & - XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + XRIMINTP2 ) ) - IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) - ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) ) -! -! 6.2.3 perform the linear interpolation of the normalized -! "2+XDS"-moment of the incomplete gamma function -! - ZVEC1(1:IGRIM) = XGAMINC_RIM1( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - XGAMINC_RIM1( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) - ZZW(:) = UNPACK( VECTOR=ZVEC1(:),MASK=GRIM,FIELD=0.0 ) -! -! 6.2.4 riming of the small sized aggregates -! - ZZW2(:,:) = 0.0 - DO JL = 1,IMICRO - IF ( GRIM(JL) ) THEN - ZZW1(JL,1) = MIN( ZZRCS(JL), XCRIMSS * ZZW(JL) * ZRCT(JL) * ZRST(JL) & ! RCRIMSS - * ZLBDAS(JL)**(XBS+XEXCRIMSS) * ZRHODREF(JL)**(-XCEXVT+1) ) - ZZW2(JL,:) = ZZW1(JL,1) * ZCSVT(JL,:)/ZRCT(JL) - ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZCSVT(JL,:)/PTSTEP)),0.0) - ZCRSVS(JL,:) = ZCRSVS(JL,:) - ZZW2(JL,:) - IF (OUSECHIC) THEN - DO JLI = 1, SIZE(PSGRSVS,4) - IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' & - .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' & - .OR. NINDEXGI(JLI).EQ.0) THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ZZW2(JL,NINDEXWI(JLI)) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETHP) * ZZW2(JL,NINDEXWI(JLI)) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. & - TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETSU) * ZZW2(JL,NINDEXWI(JLI)) - ELSE - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETDF) * ZZW2(JL,NINDEXWI(JLI)) - ENDIF - ENDDO - ELSE - IF (.NOT.(OCH_RET_ICE)) THEN - DO JLW = 1, SIZE(PCRSVS,4) - IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN - ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW) - ENDIF - ENDDO - ENDIF - ENDIF - ENDIF - ENDDO -! -! 6.2.5 riming-conversion of the large sized aggregates into graupel -! - ZZW2(:,:) = 0.0 - DO JL = 1,IMICRO - IF ( GRIM(JL) .AND. (ZZRSS(JL)>0.0) ) THEN - ZZW1(JL,2) = MIN( ZZRCS(JL), XCRIMSG * ZRCT(JL) * ZRST(JL) * ZLBDAS(JL)**(XBS+XEXCRIMSG) & ! RCRIMSG - * ZRHODREF(JL)**(-XCEXVT+1) - ZZW1(JL,1) ) - ZZW2(JL,:) = ZZW1(JL,2) * ZCSVT(JL,:)/ZRCT(JL) - ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZCSVT(JL,:)/PTSTEP)),0.0) - ZCRSVS(JL,:) = ZCRSVS(JL,:) - ZZW2(JL,:) - IF (OUSECHIC) THEN - DO JLI = 1, SIZE(PSGRSVS,4) - IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' & - .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' & - .OR. NINDEXGI(JLI).EQ.0) THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ZZW2(JL,NINDEXWI(JLI)) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETHP) * ZZW2(JL,NINDEXWI(JLI)) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. & - TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETSU) * ZZW2(JL,NINDEXWI(JLI)) - ELSE - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETDF) * ZZW2(JL,NINDEXWI(JLI)) - ENDIF - ENDDO - ELSE - IF (.NOT.(OCH_RET_ICE)) THEN - DO JLW = 1, SIZE(PCRSVS,4) - IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN - ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW) - ENDIF - ENDDO - ENDIF - ENDIF - ENDIF - ENDDO - - DEALLOCATE(IVEC2) - DEALLOCATE(IVEC1) - DEALLOCATE(ZVEC2) - DEALLOCATE(ZVEC1) - END IF - DEALLOCATE(GRIM) -! -!* 6.3 rain accretion onto the aggregates -! - ZZW(:) = 0.0 - ZZW1(:,2:3) = 0.0 - ALLOCATE(GACC(IMICRO)) - GACC(:) = (ZRRT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. & - (ZRST(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. & - (ZZRRS(:)>0.0) .AND. (ZZT(:)<XTT) - IGACC = COUNT( GACC(:) ) -! - IF( IGACC>0 ) THEN -! -! 6.3.0 allocations -! - ALLOCATE(ZVEC1(IGACC)) - ALLOCATE(ZVEC2(IGACC)) - ALLOCATE(ZVEC3(IGACC)) - ALLOCATE(IVEC1(IGACC)) - ALLOCATE(IVEC2(IGACC)) -! -! 6.3.1 select the (ZLBDAS,ZLBDAR) couplet -! - ZVEC1(:) = PACK( ZLBDAS(:),MASK=GACC(:) ) - ZVEC2(:) = PACK( ZLBDAR(:),MASK=GACC(:) ) -! -! 6.3.2 find the next lower indice for the ZLBDAS and for the ZLBDAR -! in the geometrical set of (Lbda_s,Lbda_r) couplet use to -! tabulate the RACCSS-kernel -! - ZVEC1(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAS)-0.00001, & - XACCINTP1S * LOG( ZVEC1(1:IGACC) ) + XACCINTP2S ) ) - IVEC1(1:IGACC) = INT( ZVEC1(1:IGACC) ) - ZVEC1(1:IGACC) = ZVEC1(1:IGACC) - REAL( IVEC1(1:IGACC) ) -! - ZVEC2(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAR)-0.00001, & - XACCINTP1R * LOG( ZVEC2(1:IGACC) ) + XACCINTP2R ) ) - IVEC2(1:IGACC) = INT( ZVEC2(1:IGACC) ) - ZVEC2(1:IGACC) = ZVEC2(1:IGACC) - REAL( IVEC2(1:IGACC) ) -! -! 6.3.3 perform the bilinear interpolation of the normalized -! RACCSS-kernel -! - DO JJ = 1,IGACC - ZVEC3(JJ) = ( XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GACC,FIELD=0.0 ) -! -! 6.3.4 raindrop accretion on the small sized aggregates -! - ZZW2(:,:) = 0.0 - DO JL = 1,IMICRO - IF ( GACC(JL) ) THEN - ZZW1(JL,2) = & !! coef of RRACCS - XFRACCSS*( ZRST(JL)*ZLBDAS(JL)**XBS )*( ZRHODREF(JL)**(-XCEXVT) ) & - *( XLBRACCS1/((ZLBDAS(JL)**2) ) + & - XLBRACCS2/( ZLBDAS(JL) * ZLBDAR(JL) ) + & - XLBRACCS3/( (ZLBDAR(JL)**2)) )/ZLBDAR(JL)**4 - ZZW1(JL,4) = MIN( ZZRRS(JL),ZZW1(JL,2)*ZZW(JL) ) ! RRACCSS - ZZW2(JL,:) = ZZW1(JL,4) * ZRSVT(JL,:)/ZRRT(JL) - ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZRSVT(JL,:)/PTSTEP)),0.0) - ZRRSVS(JL,:) = ZRRSVS(JL,:) - ZZW2(JL,:) - IF (OUSECHIC) THEN - DO JLI = 1, SIZE(PSGRSVS,4) - IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' & - .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' & - .OR. NINDEXGI(JLI).EQ.0) THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ZZW2(JL,NINDEXWI(JLI)) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETHP) * ZZW2(JL,NINDEXWI(JLI)) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. & - TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETSU) * ZZW2(JL,NINDEXWI(JLI)) - ELSE - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETDF) * ZZW2(JL,NINDEXWI(JLI)) - ENDIF - ENDDO - ELSE - IF (.NOT.(OCH_RET_ICE)) THEN - DO JLW = 1, SIZE(PRRSVS,4) - IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN - ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW) - ENDIF - ENDDO - ENDIF - ENDIF - ENDIF - ENDDO -! -! 6.3.4b perform the bilinear interpolation of the normalized -! RACCS-kernel -! - DO JJ = 1,IGACC - ZVEC3(JJ) = ( XKER_RACCS(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & - - XKER_RACCS(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & - * ZVEC2(JJ) & - - ( XKER_RACCS(IVEC2(JJ) ,IVEC1(JJ)+1)* ZVEC1(JJ) & - - XKER_RACCS(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & - * (ZVEC2(JJ) - 1.0) - END DO - ZZW1(:,2) = ZZW1(:,2)*UNPACK( VECTOR=ZVEC3(:),MASK=GACC(:),FIELD=0.0 ) -! -! 6.3.5 raindrop accretion-conversion of the large sized aggregates -! into graupeln -! - ZZW2(:,:) = 0.0 - WHERE ( GACC(:) .AND. (ZZRSS(:)>0.0) ) - ZZW1(:,2) = MAX( MIN( ZZRRS(:),ZZW1(:,2)-ZZW1(:,4) ),0.0 ) ! RRACCSG - END WHERE - DO JL = 1,IMICRO - IF ( GACC(JL) .AND. (ZZRSS(JL)>0.0) .AND. ZZW1(JL,2)>0.0 ) THEN - ZZW2(JL,:) = ZZW1(JL,2) * ZRSVT(JL,:)/ZRRT(JL) - ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZRSVT(JL,:)/PTSTEP)),0.0) - ZRRSVS(JL,:) = ZRRSVS(JL,:) - ZZW2(JL,:) - IF (OUSECHIC) THEN - DO JLI = 1, SIZE(PSGRSVS,4) - IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' & - .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' & - .OR. NINDEXGI(JLI).EQ.0) THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ZZW2(JL,NINDEXWI(JLI)) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETHP) * ZZW2(JL,NINDEXWI(JLI)) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. & - TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETSU) * ZZW2(JL,NINDEXWI(JLI)) - ELSE - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETDF) * ZZW2(JL,NINDEXWI(JLI)) - ENDIF - ENDDO - ELSE - IF (.NOT.(OCH_RET_ICE)) THEN - DO JLW = 1, SIZE(PRRSVS,4) - IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN - ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW) - ENDIF - ENDDO - ENDIF - ENDIF - ENDIF - ENDDO -! - DEALLOCATE(IVEC2) - DEALLOCATE(IVEC1) - DEALLOCATE(ZVEC3) - DEALLOCATE(ZVEC2) - DEALLOCATE(ZVEC1) - END IF - DEALLOCATE(GACC) -! -!* 6.4 rain contact freezing -! - ZZW1(:,4) = 0.0 - ZZW2(:,:) = 0.0 - DO JL = 1,IMICRO - IF ( (ZRIT(JL)>PRTMIN_AQ*1.e3/ZRHODREF(JL)) .AND. & - (ZRRT(JL)>PRTMIN_AQ*1.e3/ZRHODREF(JL)) .AND. & - (ZZRIS(JL)>0.0) .AND. (ZZRRS(JL)>0.0) ) THEN - ZZW1(JL,4) = MIN( ZZRRS(JL), XRCFRI * ZCIT(JL) & ! RRCFRIG - * ZLBDAR(JL)**XEXRCFRI & - * ZRHODREF(JL)**(-XCEXVT-1.) ) - ZZW2(JL,:) = ZZW1(JL,4) * ZRSVT(JL,:)/ZRRT(JL) - ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZRSVT(JL,:)/PTSTEP)),0.0) - ZRRSVS(JL,:) = ZRRSVS(JL,:) - ZZW2(JL,:) - IF (OUSECHIC) THEN - DO JLI = 1, SIZE(PSGRSVS,4) - IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' & - .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' & - .OR. NINDEXGI(JLI).EQ.0) THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ZZW2(JL,NINDEXWI(JLI)) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETHP) * ZZW2(JL,NINDEXWI(JLI)) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. & - TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETSU) * ZZW2(JL,NINDEXWI(JLI)) - ELSE - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETDF) * ZZW2(JL,NINDEXWI(JLI)) - ENDIF - ENDDO - ELSE - IF (.NOT.(OCH_RET_ICE)) THEN - DO JLW = 1, SIZE(PRRSVS,4) - IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN - ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW) - ENDIF - ENDDO - ENDIF - ENDIF - ENDIF - ENDDO -! -!* 6.5 compute the Dry growth case of graupel -! - ZZW(:) = 0.0 - ZZW1(:,:) = 0.0 - WHERE( (ZRGT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. & - ((ZRCT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:) .AND. ZZRCS(:)>0.0)) ) - ZZW(:) = ZLBDAG(:)**(XCXG-XDG-2.0) * ZRHODREF(:)**(-XCEXVT) - ZZW1(:,1) = MIN( ZZRCS(:),XFCDRYG * ZRCT(:) * ZZW(:) ) ! RCDRYG - END WHERE - WHERE( (ZRGT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. & - ((ZRIT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:) .AND. ZZRIS(:)>0.0)) ) - ZZW(:) = ZLBDAG(:)**(XCXG-XDG-2.0) * ZRHODREF(:)**(-XCEXVT) - ZZW1(:,2) = MIN( ZZRIS(:),XFIDRYG * EXP( XCOLEXIG*(ZZT(:)-XTT) ) & - * ZRIT(:) * ZZW(:) ) ! RIDRYG - END WHERE -! -! 6.5.1 accretion of aggregates on the graupeln -! - ALLOCATE(GDRY(IMICRO)) - GDRY(:) = (ZRST(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. & - (ZRGT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. (ZZRSS(:)>0.0) - IGDRY = COUNT( GDRY(:) ) -! - IF( IGDRY>0 ) THEN -! -! 6.5.2 allocations -! - ALLOCATE(ZVEC1(IGDRY)) - ALLOCATE(ZVEC2(IGDRY)) - ALLOCATE(ZVEC3(IGDRY)) - ALLOCATE(IVEC1(IGDRY)) - ALLOCATE(IVEC2(IGDRY)) -! -! 6.5.3 select the (ZLBDAG,ZLBDAS) couplet -! - ZVEC1(:) = PACK( ZLBDAG(:),MASK=GDRY(:) ) - ZVEC2(:) = PACK( ZLBDAS(:),MASK=GDRY(:) ) -! -! 6.5.4 find the next lower indice for the ZLBDAG and for the ZLBDAS -! in the geometrical set of (Lbda_g,Lbda_s) couplet use to -! tabulate the SDRYG-kernel -! - ZVEC1(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAG)-0.00001, & - XDRYINTP1G * LOG( ZVEC1(1:IGDRY) ) + XDRYINTP2G ) ) - IVEC1(1:IGDRY) = INT( ZVEC1(1:IGDRY) ) - ZVEC1(1:IGDRY) = ZVEC1(1:IGDRY) - REAL( IVEC1(1:IGDRY) ) -! - ZVEC2(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAS)-0.00001, & - XDRYINTP1S * LOG( ZVEC2(1:IGDRY) ) + XDRYINTP2S ) ) - IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) ) - ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - REAL( IVEC2(1:IGDRY) ) -! -! 6.5.5 perform the bilinear interpolation of the normalized -! SDRYG-kernel -! - DO JJ = 1,IGDRY - ZVEC3(JJ) = ( XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GDRY,FIELD=0.0 ) -! - WHERE( GDRY(:) ) - ZZW1(:,3) = MIN( ZZRSS(:),XFSDRYG*ZZW(:) & ! RSDRYG - * EXP( XCOLEXSG*(ZZT(:)-XTT) ) & - *ZRST(:)*( ZLBDAG(:)**XCXG ) & - *( ZRHODREF(:)**(-XCEXVT) ) & - *( XLBSDRYG1/( ZLBDAG(:)**2 ) + & - XLBSDRYG2/( ZLBDAG(:) * ZLBDAS(:) ) + & - XLBSDRYG3/( ZLBDAS(:)**2) ) ) - END WHERE - DEALLOCATE(IVEC2) - DEALLOCATE(IVEC1) - DEALLOCATE(ZVEC3) - DEALLOCATE(ZVEC2) - DEALLOCATE(ZVEC1) - END IF -! -! 6.5.6 accretion of raindrops on the graupeln -! - GDRY(:) = (ZRRT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. & - (ZRGT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. (ZZRRS(:)>0.0) - IGDRY = COUNT( GDRY(:) ) -! - IF( IGDRY>0 ) THEN -! -! 6.5.7 allocations -! - ALLOCATE(ZVEC1(IGDRY)) - ALLOCATE(ZVEC2(IGDRY)) - ALLOCATE(ZVEC3(IGDRY)) - ALLOCATE(IVEC1(IGDRY)) - ALLOCATE(IVEC2(IGDRY)) -! -! 6.5.8 select the (ZLBDAG,ZLBDAR) couplet -! - ZVEC1(:) = PACK( ZLBDAG(:),MASK=GDRY(:) ) - ZVEC2(:) = PACK( ZLBDAR(:),MASK=GDRY(:) ) -! -! 6.5.9 find the next lower indice for the ZLBDAG and for the ZLBDAR -! in the geometrical set of (Lbda_g,Lbda_r) couplet use to -! tabulate the RDRYG-kernel -! - ZVEC1(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAG)-0.00001, & - XDRYINTP1G * LOG( ZVEC1(1:IGDRY) ) + XDRYINTP2G ) ) - IVEC1(1:IGDRY) = INT( ZVEC1(1:IGDRY) ) - ZVEC1(1:IGDRY) = ZVEC1(1:IGDRY) - REAL( IVEC1(1:IGDRY) ) -! - ZVEC2(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAR)-0.00001, & - XDRYINTP1R * LOG( ZVEC2(1:IGDRY) ) + XDRYINTP2R ) ) - IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) ) - ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - REAL( IVEC2(1:IGDRY) ) -! -! 6.5.10 perform the bilinear interpolation of the normalized -! RDRYG-kernel -! - DO JJ = 1,IGDRY - ZVEC3(JJ) = ( XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GDRY,FIELD=0.0 ) -! - WHERE( GDRY(:) ) - ZZW1(:,4) = MIN( ZZRRS(:), XFRDRYG*ZZW(:) & ! RRDRYG - *( ZLBDAR(:)**(-4) )*( ZLBDAG(:)**XCXG ) & - *( ZRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBRDRYG1/( ZLBDAG(:)**2 ) + & - XLBRDRYG2/( ZLBDAG(:) * ZLBDAR(:) ) + & - XLBRDRYG3/( ZLBDAR(:)**2) ) ) - END WHERE - DEALLOCATE(IVEC2) - DEALLOCATE(IVEC1) - DEALLOCATE(ZVEC3) - DEALLOCATE(ZVEC2) - DEALLOCATE(ZVEC1) - END IF -! - ZRDRYG(:) = ZZW1(:,1) + ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,4) - DEALLOCATE(GDRY) -! -!* 6.6 compute the Wet growth case of the graupel -! - ZZW(:) = 0.0 - ZRWETG(:) = 0.0 -! - ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a - ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v - ZCJ(:) = XSCFAC * ZRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZZT(:)-XTT) ) - !c^prime_j (in the ventilation factor) - WHERE( ZRGT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:) ) - ZZW1(:,5) = MIN( ZZRIS(:), & - ZZW1(:,2) / (XCOLIG*EXP(XCOLEXIG*(ZZT(:)-XTT)) ) ) ! RIWETG - ZZW1(:,6) = MIN( ZZRSS(:), & - ZZW1(:,3) / (XCOLSG*EXP(XCOLEXSG*(ZZT(:)-XTT)) ) ) ! RSWETG -! - ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure - ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & - ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & - *(XESTT-ZZW(:))/(XRV*ZZT(:)) ) -! compute RWETG -! - ZRWETG(:)=MAX( 0.0, & - ( ZZW(:) * ( X0DEPG* ZLBDAG(:)**XEX0DEPG + & - X1DEPG*ZCJ(:)*ZLBDAG(:)**XEX1DEPG ) + & - ( ZZW1(:,5)+ZZW1(:,6) ) * & - ( ZRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-ZZT(:))) ) ) / & - ( ZRHODREF(:)*(XLMTT-XCL*(XTT-ZZT(:))) ) ) - END WHERE -! -!* 6.7 Select Wet or Dry case for the growth of the graupel -! - ZZW(:) = 0.0 - ZZW2(:,:) = 0.0 - ZZW4(:,:) = 0.0 - DO JL = 1,IMICRO - IF ( (ZRGT(JL)>PRTMIN_AQ*1.e3/ZRHODREF(JL)) .AND. & ! wet case - ZZT(JL)<XTT .AND. ZRDRYG(JL)>=ZRWETG(JL) .AND. & - ZRWETG(JL)>0.0 .AND. ZRCT(JL)>0.0 .AND. ZRRT(JL)>0.0) THEN - ZZW(JL) = ZRWETG(JL) - ZZW2(JL,:) = ZZW(JL) * ZRSVT(JL,:)/ZRRT(JL) - ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZRSVT(JL,:)/PTSTEP)),0.0) - ZRRSVS(JL,:) = ZRRSVS(JL,:) - ZZW2(JL,:) ! rain -> graupel - IF (OUSECHIC) THEN - ZZW3(:,:) = 0.0 - DO JLI = 1, SIZE(PSGRSVS,4) - IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' & - .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' & - .OR. NINDEXGI(JLI).EQ.0) THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ZZW2(JL,NINDEXWI(JLI)) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETHP) * ZZW2(JL,NINDEXWI(JLI)) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. & - TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETSU) * ZZW2(JL,NINDEXWI(JLI)) - ELSE - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ZZW2(JL,NINDEXWI(JLI)) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + & - (1. - XRETDF) * ZZW2(JL,NINDEXWI(JLI)) - ENDIF - ENDDO - IF (ZRST(JL)>0.0) THEN - ZZW3(JL,:) = ZZW1(JL,6) * ZSGSVT(JL,:)/ZRST(JL) - ZZW3(JL,:) = MAX(MIN(ZZW3(JL,:),(ZSGSVT(JL,:)/PTSTEP)),0.0) - ZSGRSVS(JL,:) = ZSGRSVS(JL,:) - ZZW3(JL,:) !snow->rain - DO JLI = 1, SIZE(PSGRSVS,4) - ZRRSVS(JL,NINDEXWI(JLI)) = ZRRSVS(JL,NINDEXWI(JLI)) + ZZW3(JL,JLI) - ENDDO - ENDIF - ELSE - IF (.NOT.(OCH_RET_ICE)) THEN - DO JLW = 1, SIZE(PRRSVS,4) - IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN - ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW) - ENDIF - ENDDO - ENDIF - ENDIF - ZZW4(JL,:) = ZZW1(JL,1) * ZCSVT(JL,:)/ZRCT(JL) - ZZW4(JL,:) = MAX(MIN(ZZW4(JL,:),(ZCSVT(JL,:)/PTSTEP)),0.0) - ZCRSVS(JL,:) = ZCRSVS(JL,:) - ZZW4(JL,:) !cloud->rain - ZRRSVS(JL,:) = ZRRSVS(JL,:) + ZZW4(JL,:) - ELSE IF ( (ZRGT(JL)>PRTMIN_AQ*1.e3/ZRHODREF(JL)) .AND. & ! dry case - ZZT(JL)<XTT .AND. ZRDRYG(JL)<ZRWETG(JL) .AND. & - ZRDRYG(JL)>0.0 .AND. ZRCT(JL)>0.0 .AND. ZRRT(JL)>0.0) THEN - ZZW2(JL,:) = ZZW1(JL,1) * ZCSVT(JL,:)/ZRCT(JL) - ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZCSVT(JL,:)/PTSTEP)),0.0) - ZZW4(JL,:) = ZZW1(JL,4) * ZRSVT(JL,:)/ZRRT(JL) - ZZW4(JL,:) = MAX(MIN(ZZW4(JL,:),(ZRSVT(JL,:)/PTSTEP)),0.0) - ZCRSVS(JL,:) = ZCRSVS(JL,:) - ZZW2(JL,:) - ZRRSVS(JL,:) = ZRRSVS(JL,:) - ZZW4(JL,:) - IF (OUSECHIC) THEN - DO JLI = 1, SIZE(PSGRSVS,4) - IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' & - .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' & - .OR. NINDEXGI(JLI).EQ.0) THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ( & - ZZW2(JL,NINDEXWI(JLI)) + ZZW4(JL,NINDEXWI(JLI)) ) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'& - .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ( & - ZZW2(JL,NINDEXWI(JLI)) + ZZW4(JL,NINDEXWI(JLI)) ) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + (1. - XRETHP) * ( & - ZZW2(JL,NINDEXWI(JLI)) + ZZW4(JL,NINDEXWI(JLI)) ) - ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' & - .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. & - TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ( & - ZZW2(JL,NINDEXWI(JLI)) + ZZW4(JL,NINDEXWI(JLI)) ) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + (1. - XRETSU) * ( & - ZZW2(JL,NINDEXWI(JLI)) + ZZW4(JL,NINDEXWI(JLI)) ) - ELSE - ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ( & - ZZW2(JL,NINDEXWI(JLI)) + ZZW4(JL,NINDEXWI(JLI)) ) - ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + (1. - XRETDF) * ( & - ZZW2(JL,NINDEXWI(JLI)) + ZZW4(JL,NINDEXWI(JLI)) ) - ENDIF - ENDDO - ELSE - IF (.NOT.(OCH_RET_ICE)) THEN - DO JLW = 1, SIZE(PRRSVS,4) - IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN - ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW) & - + ZZW4(JL,JLW) - ENDIF - ENDDO - ENDIF - ENDIF - ENDIF - ENDDO -! -!* 6.8 Melting of the graupel -! - IF (OUSECHIC) THEN - ZZW(:) = 0.0 - ZZW3(:,:) = 0.0 - DO JL = 1,IMICRO - IF ( (ZRGT(JL)>PRTMIN_AQ*1.e3/ZRHODREF(JL)) .AND. & - (ZZRGS(JL)>0.0) .AND. (ZZT(JL)>XTT) ) THEN - ZZW(JL) = ZRVT(JL)*ZPRES(JL)/((XMV/XMD)+ZRVT(JL)) ! Vapor pressure - ZZW(JL) = ZKA(JL)*(XTT-ZZT(JL)) + & - ( ZDV(JL)*(XLVTT + ( XCPV - XCL ) * ( ZZT(JL) - XTT )) & - *(XESTT-ZZW(JL))/(XRV*ZZT(JL)) ) -! compute RGMLTR - ZZW(JL) = MIN( ZZRGS(JL), MAX( 0.0,( -ZZW(JL) * & - ( X0DEPG* ZLBDAG(JL)**XEX0DEPG + & - X1DEPG*ZCJ(JL)*ZLBDAG(JL)**XEX1DEPG ) - & - ( ZZW1(JL,1)+ZZW1(JL,4) ) * & - ( ZRHODREF(JL)*XCL*(XTT-ZZT(JL))) ) / & - ( ZRHODREF(JL)*XLMTT ) ) ) - ZZW3(JL,:) = ZZW(JL) * ZSGSVT(JL,:)/ZRGT(JL) - ZZW3(JL,:) = MAX(MIN(ZZW3(JL,:),(ZSGSVT(JL,:)/PTSTEP)),0.0) - ZSGRSVS(JL,:) = ZSGRSVS(JL,:) - ZZW3(JL,:) !graupel->rain - DO JLI = 1, SIZE(PSGRSVS,4) - ZRRSVS(JL,NINDEXWI(JLI)) = ZRRSVS(JL,NINDEXWI(JLI)) + ZZW3(JL,JLI) - ENDDO - ENDIF - ENDDO - ENDIF -! -! -!------------------------------------------------------------------------------- -! -!* 7. UNPACK RESULTS AND DEALLOCATE ARRAYS -! ------------------------------------ - - - DO JLC= 1, SIZE(PCRSVS,4) - ZCW(:,:,:) = ZZCRSVS(:,:,:,JLC) - ZZCRSVS(:,:,:,JLC) = UNPACK(ZCRSVS(:,JLC), MASK=GMICRO(:,:,:), FIELD=ZCW(:,:,:)) - PCRSVS(:,:,:,JLC) = ZZCRSVS(:,:,:,JLC) * PRHODJ(:,:,:) - END DO - DO JLR= 1, SIZE(PRRSVS,4) - ZRW(:,:,:) = ZZRRSVS(:,:,:,JLR) - ZZRRSVS(:,:,:,JLR) = UNPACK(ZRRSVS(:,JLR), MASK=GMICRO(:,:,:), FIELD=ZRW(:,:,:)) - PRRSVS(:,:,:,JLR) = ZZRRSVS(:,:,:,JLR) * PRHODJ(:,:,:) - END DO - IF (OUSECHIC) THEN - DO JLI= 1, SIZE(PSGRSVS,4) - ZSGW(:,:,:) = ZZSGRSVS(:,:,:,JLI) - ZZSGRSVS(:,:,:,JLI) = UNPACK(ZSGRSVS(:,JLI), MASK=GMICRO(:,:,:), FIELD=ZSGW(:,:,:)) - PSGRSVS(:,:,:,JLI) = ZZSGRSVS(:,:,:,JLI) * PRHODJ(:,:,:) - END DO - DO JLG= 1, SIZE(PGRSVS,4) - ZGW(:,:,:) = ZZGRSVS(:,:,:,JLG) - ZZGRSVS(:,:,:,JLG) = UNPACK(ZGRSVS(:,JLG), MASK=GMICRO(:,:,:), FIELD=ZGW(:,:,:)) - PGRSVS(:,:,:,JLG) = ZZGRSVS(:,:,:,JLG) * PRHODJ(:,:,:) - END DO - DEALLOCATE(ZGRSVS) - DEALLOCATE(ZSGRSVS) - DEALLOCATE(ZSGSVT) - DEALLOCATE(ZZW3) - ELSE - IF (.NOT.(OCH_RET_ICE)) THEN - DO JLG= 1, SIZE(PGRSVS,4) - ZGW(:,:,:) = ZZGRSVS(:,:,:,JLG) - ZZGRSVS(:,:,:,JLG) = UNPACK(ZGRSVS(:,JLG), MASK=GMICRO(:,:,:), FIELD=ZGW(:,:,:)) - PGRSVS(:,:,:,JLG) = ZZGRSVS(:,:,:,JLG) * PRHODJ(:,:,:) - END DO - DEALLOCATE(ZGRSVS) - ENDIF - ENDIF - - DEALLOCATE(ZRHODREF) - DEALLOCATE(ZZT) - DEALLOCATE(ZPRES) - DEALLOCATE(ZKA) - DEALLOCATE(ZDV) - DEALLOCATE(ZCJ) - DEALLOCATE(ZZW) - DEALLOCATE(ZZW1) - DEALLOCATE(ZZW2) - DEALLOCATE(ZZW4) - DEALLOCATE(ZZRCS) - DEALLOCATE(ZZRRS) - DEALLOCATE(ZZRIS) - DEALLOCATE(ZZRSS) - DEALLOCATE(ZZRGS) - DEALLOCATE(ZCRSVS) - DEALLOCATE(ZRRSVS) - DEALLOCATE(ZRVT) - DEALLOCATE(ZRCT) - DEALLOCATE(ZRRT) - DEALLOCATE(ZRIT) - DEALLOCATE(ZRST) - DEALLOCATE(ZRGT) - DEALLOCATE(ZCIT) - DEALLOCATE(ZCSVT) - DEALLOCATE(ZRSVT) - DEALLOCATE(ZLBDAR) - DEALLOCATE(ZLBDAS) - DEALLOCATE(ZLBDAG) - DEALLOCATE(ZRDRYG) -! -END IF -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE CH_AQUEOUS_TMICICE diff --git a/src/PHYEX/ext/ch_meteo_trans_kess.f90 b/src/PHYEX/ext/ch_meteo_trans_kess.f90 deleted file mode 100644 index debd6ae61..000000000 --- a/src/PHYEX/ext/ch_meteo_trans_kess.f90 +++ /dev/null @@ -1,351 +0,0 @@ -!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!! ############################### - MODULE MODI_CH_METEO_TRANS_KESS -!! ############################### -!! -! -INTERFACE -!! -SUBROUTINE CH_METEO_TRANS_KESS(KL, PRHODJ, PRHODREF, PRTSM, PTHT, PABST, & - KVECNPT, KVECMASK, TPM, KDAY, KMONTH, & - KYEAR, PLAT, PLON, PLAT0, PLON0, OUSERV, & - OUSERC, OUSERR, KLUOUT, HCLOUD, PTSTEP ) -! -USE MODD_CH_M9_n, ONLY: METEOTRANSTYPE -! -IMPLICIT NONE -REAL, INTENT(IN), OPTIONAL :: PTSTEP !timestep -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Cloud parameterization -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! air density -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRTSM ! moist variables at t or t-dt or water m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT, PABST ! theta and pressure at t -INTEGER, DIMENSION(:,:), INTENT(IN) :: KVECMASK -! -TYPE(METEOTRANSTYPE), DIMENSION(:), INTENT(INOUT) :: TPM - ! meteo variable for CCS -INTEGER, INTENT(IN) :: KYEAR ! Current Year -INTEGER, INTENT(IN) :: KMONTH ! Current Month -INTEGER, INTENT(IN) :: KDAY ! Current Day -INTEGER, INTENT(IN) :: KLUOUT ! channel for output listing -INTEGER, INTENT(IN) :: KL, KVECNPT -REAL, DIMENSION(:,:), INTENT(IN) :: PLAT, PLON -REAL, INTENT(IN) :: PLAT0, PLON0 -LOGICAL, INTENT(IN) :: OUSERV, OUSERC, OUSERR -END SUBROUTINE CH_METEO_TRANS_KESS -!! -END INTERFACE -!! -END MODULE MODI_CH_METEO_TRANS_KESS -!! -!! #################################################################### -SUBROUTINE CH_METEO_TRANS_KESS(KL, PRHODJ, PRHODREF, PRTSM, PTHT, PABST, & - KVECNPT, KVECMASK, TPM, KDAY, KMONTH, & - KYEAR, PLAT, PLON, PLAT0, PLON0, OUSERV, & - OUSERC, OUSERR, KLUOUT, HCLOUD, PTSTEP ) -!! #################################################################### -!! -!!*** *CH_METEO_TRANS_KESS* -!! -!! PURPOSE -!! ------- -! Transfer of meteorological data, such as temperature, pressure -! and water vapor mixing ratio for one point into the variable TPM(JM+1) -! here LWC, LWR and mean radius computed from Kessler or ICEx schemes -!! -!! METHOD -!! ------ -!! For the given grid-point KI,KJ,KK, the meteorological parameters -!! will be transfered for use by CH_SET_RATES and CH_SET_PHOTO_RATES. -!! Presently, the variables altitude, air density, temperature, -!! water vapor mixing ratio, cloud water, longitude, latitude and date -!! will be transfered. In the chemical definition file (.chf) -!! these variables have to be transfered into variables like O2, H2O etc. -!! Also, consistency is checked between the number of -!! variables expected by the CCS (as defined in the .chf file) and -!! the number of variables to be transfered here. If you change -!! the meaning of XMETEOVARS in your .chf file, make sure to modify -!! this subroutine accordingly. -!! If the model is run in 1D mode, the model level instead of altitude -!! is passed. In 2D and 3D, altitude is passed with a negative sign -!! so that the radiation scheme TUV can make the difference between -!! model levels and altitude. -!! -!! AUTHOR -!! ------ -!! K. Suhre *Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 24/05/95 -!! 04/08/96 (K. Suhre) restructured -!! 21/02/97 (K. Suhre) add XLAT0 and XLON0 for LCARTESIAN=T case -!! 27/08/98 (P. Tulet) add temperature at t for kinetic coefficient -!! 09/03/99 (V. Crassier & K. Suhre) vectorization -!! 09/03/99 (K. Suhre) modification for TUV -!! 09/03/99 (C. Mari & J. Escobar) Code optimization -!! 01/12/03 (D. Gazen) change Chemical scheme interface -!! 01/12/03 (D. Gazen) change Chemical scheme interface -!! 01/12/04 (P. Tulet) update ch_meteo_transn.f90 for Arome -!! 01/12/07 (M. Leriche) include rain -!! 14/05/08 (M. Leriche) include raindrops and cloud droplets mean radius -!! 05/06/08 (M. Leriche) calculate LWC and LWR in coherence with time spliting scheme -!! 05/11/08 (M. Leriche) split in two routines for 1-moment and 2-moment cloud schemes -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -!! -!! EXTERNAL -!! -------- -!! GAMMA : gamma function -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -USE MODD_CH_M9_n, ONLY: NMETEOVARS, & ! number of meteorological variables - METEOTRANSTYPE !type for meteo . transfer -!! -USE MODD_CST, ONLY: XP00, & ! Surface pressure - XRD, & ! R gas constant - XCPD, & !specific heat for dry air - XPI, & !pie - XRHOLW !density of water -!! -USE MODD_CONF, ONLY: LCARTESIAN ! Logical for cartesian geometry -!! -USE MODD_RAIN_ICE_DESCR_n, ONLY: XNUC, XALPHAC, & !Cloud droplets distrib. param. - XRTMIN, & ! min values of the water m. r. - XLBC, XLBEXC, & !shape param. of the cloud droplets - XLBR, XLBEXR, & !shape param. of the raindrops - XCONC_LAND -!! -use mode_msg - -USE MODI_GAMMA -! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -REAL, INTENT(IN), OPTIONAL :: PTSTEP ! Double timestep -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Cloud parameterization -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! air density -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRTSM ! moist variables at t or t-dt or water m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT, PABST ! theta and pressure at t -INTEGER, DIMENSION(:,:), INTENT(IN) :: KVECMASK -! -TYPE(METEOTRANSTYPE), DIMENSION(:), INTENT(INOUT) :: TPM - ! meteo variable for CCS -INTEGER, INTENT(IN) :: KYEAR ! Current Year -INTEGER, INTENT(IN) :: KMONTH ! Current Month -INTEGER, INTENT(IN) :: KDAY ! Current Day -INTEGER, INTENT(IN) :: KLUOUT ! channel for output listing -INTEGER, INTENT(IN) :: KL, KVECNPT -REAL, DIMENSION(:,:), INTENT(IN) :: PLAT, PLON -REAL, INTENT(IN) :: PLAT0, PLON0 -LOGICAL, INTENT(IN) :: OUSERV, OUSERC, OUSERR -! -!* 0.2 declarations of local variables -! -REAL,DIMENSION(SIZE(PRTSM,1),SIZE(PRTSM,2),SIZE(PRTSM,3),3) :: ZRTSM -REAL,DIMENSION(SIZE(PRTSM,1),SIZE(PRTSM,2)) :: ZLAT, ZLON -REAL,DIMENSION(SIZE(PRTSM,1),SIZE(PRTSM,2),SIZE(PRTSM,3)) :: ZRAYC, ZWLBDC, & - ZWLBDC3, ZCONC -REAL,DIMENSION(SIZE(PRTSM,1),SIZE(PRTSM,2),SIZE(PRTSM,3)) :: ZRAYR, ZWLBDR, ZWLBDR3 -LOGICAL, SAVE :: GSFIRSTCALL = .TRUE. -INTEGER :: JI,JJ,JK,JM -INTEGER :: IDTI,IDTJ,IDTK -! -! -!------------------------------------------------------------------------------- -! -!* 1. INITIALIZE METEO VARIABLE TRANSFER -! ---------------------------------- -! -firstcall : IF (GSFIRSTCALL) THEN -! - GSFIRSTCALL = .FALSE. -! -!* 1.1 check if number of variables NMETEOVARS -! corresponds to what the CCS expects -! - IF (NMETEOVARS /= 13) THEN - WRITE(KLUOUT,*) "CH_METEO_TRANS ERROR: number of meteovars to transfer" - WRITE(KLUOUT,*) "does not correspond to the number expected by the CCS:" - WRITE(KLUOUT,*) " meteovars to transfer: ", 13 - WRITE(KLUOUT,*) " NMETEOVARS expected: ", NMETEOVARS - WRITE(KLUOUT,*) "Check the definition of NMETEOVARS in your .chf file." - WRITE(KLUOUT,*) "The program will be stopped now!" - call Print_msg( NVERB_FATAL, 'GEN', 'CH_METEO_TRANS_KESS', & - 'number of meteovars to transfer does not correspond to the expected number.' ) - END IF -! -!* 1.2 initialize names of meteo vars -! - TPM(:)%CMETEOVAR(1) = "Model level" - TPM(:)%CMETEOVAR(2) = "Air density (kg/m3)" - TPM(:)%CMETEOVAR(3) = "Temperature (K)" - TPM(:)%CMETEOVAR(4) = "Water vapor (kg/kg)" - TPM(:)%CMETEOVAR(5) = "Cloud water (kg/kg)" - TPM(:)%CMETEOVAR(6) = "Latitude (rad)" - TPM(:)%CMETEOVAR(7) = "Longitude (rad)" - TPM(:)%CMETEOVAR(8) = "Current date (year)" - TPM(:)%CMETEOVAR(9) = "Current date (month)" - TPM(:)%CMETEOVAR(10)= "Current date (day)" - TPM(:)%CMETEOVAR(11)= "Rain water (kg/kg)" - TPM(:)%CMETEOVAR(12)= "Mean cloud droplets radius (m)" - TPM(:)%CMETEOVAR(13)= "Mean raindrops radius (m)" -! -ENDIF firstcall -! -! "Water vapor (kg/kg)" -! -IF (OUSERV) THEN -! if split option, use tendency - IF (PRESENT(PTSTEP)) THEN - ZRTSM(:,:,:,1) = (PRTSM(:,:,:, 1)/ PRHODJ(:,:,:))*PTSTEP - ELSE - ZRTSM(:,:,:,1) = PRTSM(:,:,:, 1) - ENDIF -ELSE - ZRTSM(:,:,:,1) = 0.0 -ENDIF -! -! "Cloud water (kg/kg)" and "Mean cloud droplets radius (m)" -! -IF (OUSERC) THEN - IF (PRESENT(PTSTEP)) THEN - ZRTSM(:,:,:,2) = (PRTSM(:,:,:, 2)/ PRHODJ(:,:,:))*PTSTEP - ELSE - ZRTSM(:,:,:,2) = PRTSM(:,:,:, 2) - ENDIF - ZRAYC(:,:,:) = 10.e-6 ! avoid division by zero - SELECT CASE (HCLOUD) - CASE ('KESS') - WHERE (ZRTSM(:,:,:, 2)>1.e-20) !default value for Kessler - ZRAYC(:,:,:) = 10.e-6 ! assume a cloud droplet radius of 10 µm - ENDWHERE - CASE ('ICE3','ICE4') - WHERE (ZRTSM(:,:,:, 2)>XRTMIN(2)) - ZCONC(:,:,:) = XCONC_LAND - ZWLBDC3(:,:,:) = XLBC(1) * ZCONC(:,:,:) / (PRHODREF(:,:,:) * ZRTSM(:,:,:, 2)) - ZWLBDC(:,:,:) = ZWLBDC3(:,:,:)**XLBEXC - ZRAYC(:,:,:) = 0.5*GAMMA(XNUC+1./XALPHAC)/(GAMMA(XNUC)*ZWLBDC(:,:,:)) -! ZRAYC(:,:,:) = 10.e-6 ! assume a cloud droplet radius of 10 µm - ENDWHERE - END SELECT -ELSE - ZRTSM(:,:,:,2) = 0.0 - ZRAYC(:,:,:) = 10.e-6 ! avoid division by zero -ENDIF -! -! "Rain water (kg/kg)" and "Mean raindrops radius (m)" -! -IF (OUSERR) THEN - IF (PRESENT(PTSTEP)) THEN - ZRTSM(:,:,:,3) = (PRTSM(:,:,:, 3)/ PRHODJ(:,:,:))*PTSTEP - ELSE - ZRTSM(:,:,:,3) = PRTSM(:,:,:, 3) - ENDIF - ZRAYR(:,:,:) = 500.e-6 ! avoid division by zero - SELECT CASE (HCLOUD) - CASE ('KESS') - WHERE (ZRTSM(:,:,:, 3)>1.e-20) !default value for Kessler - ZRAYR(:,:,:) = 0.5*((XPI*XRHOLW*1.E7)/ & - (PRHODREF(:,:,:)*ZRTSM(:,:,:,3)))**(-1./4.) - ENDWHERE - CASE ('ICE3','ICE4') - WHERE (ZRTSM(:,:,:, 3)>XRTMIN(3)) - ZRAYR(:,:,:) = 0.5*(1./(XLBR*(PRHODREF(:,:,:)*ZRTSM(:,:,:,3))**XLBEXR)) - ENDWHERE - END SELECT -ELSE - ZRTSM(:,:,:,3) = 0.0 - ZRAYR(:,:,:) = 500.e-6 ! avoid division by zero -ENDIF - -IF(LCARTESIAN) THEN -! "Latitude (rad)" - ZLAT(:,:) = PLAT0 -! "Longitude (rad)" - ZLON(:,:) = PLON0 -ELSE -! "Latitude (rad)" - ZLAT(:,:) = PLAT(:,:) -! "Longitude (rad)" - ZLON(:,:) = PLON(:,:) -END IF -!! -!* 2. TRANSFER METEO VARIABLES -! ------------------------ -! -IDTI=KVECMASK(2,KL)-KVECMASK(1,KL)+1 -IDTJ=KVECMASK(4,KL)-KVECMASK(3,KL)+1 -IDTK=KVECMASK(6,KL)-KVECMASK(5,KL)+1 -!Vectorization: -!ocl novrec -!cdir nodep -DO JM=0,KVECNPT-1 - JI=JM-IDTI*(JM/IDTI)+KVECMASK(1,KL) - JJ=JM/IDTI-IDTJ*(JM/(IDTI*IDTJ))+KVECMASK(3,KL) - JK=JM/(IDTI*IDTJ)-IDTK*(JM/(IDTI*IDTJ*IDTK))+KVECMASK(5,KL) -! -!"Model Altitude" -! - TPM(JM+1)%XMETEOVAR(1) = JK-1 ! assuming first model level is level 2 -! TPM(JM+1)%XMETEOVAR(1) = JK ! assuming first model level is level 1 -! -! "Air density (kg/m3)" -! - TPM(JM+1)%XMETEOVAR(2) = PRHODREF(JI, JJ, JK) -! -! "Temperature (K)" -! - TPM(JM+1)%XMETEOVAR(3) = PTHT(JI,JJ,JK)*((PABST(JI,JJ,JK)/XP00)**(XRD/XCPD)) -! -! "Water vapor (kg/kg)" -! - TPM(JM+1)%XMETEOVAR(4) = ZRTSM(JI, JJ, JK, 1) -! -! "Cloud water (kg/kg)" -! - TPM(JM+1)%XMETEOVAR(5) = ZRTSM(JI, JJ, JK, 2) -! -! "Latitude (rad)" -! - TPM(JM+1)%XMETEOVAR(6) = ZLAT(JI, JJ) -! -! "Longitude (rad)" -! - TPM(JM+1)%XMETEOVAR(7) = ZLON(JI, JJ) -! -! "Current date" -! - TPM(JM+1)%XMETEOVAR(8) = REAL(KYEAR) - TPM(JM+1)%XMETEOVAR(9) = REAL(KMONTH) - TPM(JM+1)%XMETEOVAR(10)= REAL(KDAY) -! -! "Rain water (kg/kg)" -! - TPM(JM+1)%XMETEOVAR(11) = ZRTSM(JI, JJ, JK, 3) -! -! "Mean cloud droplets radius (m)" -! - TPM(JM+1)%XMETEOVAR(12) = ZRAYC(JI, JJ, JK) -! -! "Mean raindrops radius (m)" -! - TPM(JM+1)%XMETEOVAR(13) = ZRAYR(JI, JJ, JK) -! -ENDDO -! -END SUBROUTINE CH_METEO_TRANS_KESS diff --git a/src/PHYEX/ext/cphase_profile.f90 b/src/PHYEX/ext/cphase_profile.f90 deleted file mode 100644 index f403e5447..000000000 --- a/src/PHYEX/ext/cphase_profile.f90 +++ /dev/null @@ -1,140 +0,0 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!######################### -MODULE MODI_CPHASE_PROFILE -!######################### -! -INTERFACE -! - SUBROUTINE CPHASE_PROFILE (PZHAT,PCPHASE,PCPHASE_PBL,PCPHASE_PROFILE,PTKEM) -! -REAL, DIMENSION(:) , INTENT(IN) :: PZHAT ! height level without orography -REAL , INTENT(IN) :: PCPHASE ! prescribed phase velocity -REAL , INTENT(IN) :: PCPHASE_PBL ! prescribed phase velocity -REAL, DIMENSION(:,:) , INTENT(OUT) :: PCPHASE_PROFILE ! profile of Cphase speed -REAL, DIMENSION(:,:),OPTIONAL , INTENT(IN) :: PTKEM ! TKE at t-dt -! -END SUBROUTINE CPHASE_PROFILE -! -END INTERFACE -! -END MODULE MODI_CPHASE_PROFILE -! -! ########################################################################## - SUBROUTINE CPHASE_PROFILE (PZHAT,PCPHASE,PCPHASE_PBL,PCPHASE_PROFILE,PTKEM) -! ########################################################################## -! -!!**** *CPHASE_PROFILE* - defines a non-constant vertical profile for Cphase -!! velocity -!! -!! PURPOSE -!! ------- -! -!!** METHOD -!! ------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson & C. Lac * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 08/2010 -!! Escobar 9/11/2010 : array bound problem if NO Turb => PTKEM optional -!! C.Lac 06/2013 : correction and introduction of PCPHASE_PBL -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_TURB_n, ONLY: XTKEMIN -USE MODD_PARAMETERS -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -! -REAL, DIMENSION(:) , INTENT(IN) :: PZHAT ! height level without orography -REAL , INTENT(IN) :: PCPHASE ! prescribed phase velocity -REAL , INTENT(IN) :: PCPHASE_PBL ! prescribed phase velocity -REAL, DIMENSION(:,:) , INTENT(OUT) :: PCPHASE_PROFILE ! profile of Cphase speed -REAL, DIMENSION(:,:),OPTIONAL , INTENT(IN) :: PTKEM ! TKE at t-dt -! -!* 0.2 declarations of local variables -! -INTEGER :: IKB ! indice K Beginning in z direction -INTEGER :: IKE ! indice K End in z direction -! -REAL, DIMENSION(SIZE(PCPHASE_PROFILE,1)) :: ZTKE, ZTKEMIN -INTEGER :: JL,JK,JKTKE -! -!------------------------------------------------------------------------------- -! -!* 1. PROLOGUE -! -------- -! -!* 1.1 Compute dimensions of arrays and other indices -! -IKB = 1 + JPVEXT -IKE = SIZE(PCPHASE_PROFILE,2) - JPVEXT -! -! -!* 1.2 Initializations -! -! -PCPHASE_PROFILE = 0.0 -ZTKEMIN = PZHAT(IKE) -ZTKE = PZHAT(IKE-1) -!------------------------------------------------------------------------------- -!------------------------------------------------------------------------------- -! - IF (PRESENT(PTKEM)) THEN -! - DO JL = 1,SIZE(PCPHASE_PROFILE,1) - JKTKE=IKE-1 - DO JK = IKB, IKE-1 - IF (PTKEM(JL,JK) < 5.*XTKEMIN ) THEN - ZTKE (JL) = PZHAT (JK) - JKTKE = JK - EXIT - END IF - END DO - DO JK = JKTKE+1,IKE - IF (PTKEM(JL,JK) == XTKEMIN ) THEN - ZTKEMIN (JL) = PZHAT (JK) - EXIT - END IF - END DO - END DO -! - ELSE - ZTKE (:) = 1000. - ZTKEMIN (:) = 2000. - END IF -! - DO JL = 1,SIZE(PCPHASE_PROFILE,1) - DO JK = IKB, IKE - IF (PZHAT(JK) > ZTKEMIN (JL) ) THEN - PCPHASE_PROFILE(JL,JK) = PCPHASE - ELSE IF (PZHAT(JK) < ZTKE (JL) ) THEN - PCPHASE_PROFILE(JL,JK) = PCPHASE_PBL - ELSE - PCPHASE_PROFILE(JL,JK) = 1./(ZTKEMIN (JL) - ZTKE (JL)) * & - ((PZHAT(JK) - ZTKE(JL)) * PCPHASE + (ZTKEMIN (JL) - PZHAT(JK)) * PCPHASE_PBL ) - END IF - END DO - END DO -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE CPHASE_PROFILE diff --git a/src/PHYEX/ext/deallocate_model1.f90 b/src/PHYEX/ext/deallocate_model1.f90 deleted file mode 100644 index 8b8f57214..000000000 --- a/src/PHYEX/ext/deallocate_model1.f90 +++ /dev/null @@ -1,705 +0,0 @@ -!MNH_LIC Copyright 1997-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!############################ -MODULE MODI_DEALLOCATE_MODEL1 -!############################ -! -INTERFACE -! -SUBROUTINE DEALLOCATE_MODEL1 (KCALL) -! -INTEGER, INTENT(IN) :: KCALL -! -END SUBROUTINE DEALLOCATE_MODEL1 -! -END INTERFACE -! -END MODULE MODI_DEALLOCATE_MODEL1 -! -! -! #################################### - SUBROUTINE DEALLOCATE_MODEL1 (KCALL) -! #################################### -! -!!**** *DEALLOCATE_MODEL1* - deallocate all model1 fields -!! -!! PURPOSE -!! ------- -! deallocate all model #1 fields in order to spare memory in spawning -! -!!** METHOD -!! ------ -!! -!! KCALL = 1 --> deallocates all SOURCES, LES, FORCING and SOLVER variables -!! -!! KCALL = 2 --> deallocates all METRIC, RADIATION and CORIOLIS variables -!! -!! KCALL = 3 --> deallocates all other variables of model1 -!! -!! KCALL = 4 --> deallocates all variables common to ALL models -!! -!! 1 + 2 --> all variables used in spawning -!! 1 + 2 + 3 + 4 --> in diag after a file has been treated -!! -!! EXTERNAL -!! -------- -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! V. Masson * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 08/12/97 -!! -!! 20/05/98 use the LB fields -!! 15/03/99 new PGD fields -!! 08/03/01 D.Gazen add chemical emission field -!! 01/2004 V. Masson surface externalization -!! 06/2012 M.Tomasini add 2D nesting ADVFRC -!! 10/2016 M.Mazoyer New KHKO output fields -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! C. Lac 02/2019: add rain fraction as an output field -! P. Wautelet 07/06/2019: bugfix: deallocate XLSRVM only if allocated -! S. Riette 04/2020: XHL* fields -! A. Costes 12:2021: Blaze Fire model variables -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -USE MODD_REF -! -USE MODD_METRICS_n -USE MODD_FIELD_n -USE MODD_FIRE_n -USE MODD_DUMMY_GR_FIELD_n -USE MODD_LSFIELD_n -USE MODD_GRID_n -USE MODD_REF_n -USE MODD_CURVCOR_n -USE MODD_DYN_n -USE MODD_DEEP_CONVECTION_n -USE MODD_RADIATIONS_n -USE MODD_FRC -USE MODD_PRECIP_n -USE MODD_ELEC_n -USE MODD_PASPOL_n -USE MODD_RAIN_ICE_PARAM_n -USE MODD_RAIN_ICE_DESCR_n -USE MODD_PARAM_n , ONLY : CCLOUD -USE MODE_MODELN_HANDLER -! -! Modif 2D -USE MODD_LATZ_EDFLX ! For ADVFRC and EDDY FLUXES -USE MODD_DEF_EDDY_FLUX_n ! For EDDY FLUXES -USE MODD_DEF_EDDYUV_FLUX_n ! For EDDY FLUXES -! -USE MODD_2D_FRC -USE MODD_ADVFRC_n ! For ADVFRC and EDDY FLUXES -USE MODD_RELFRC_n -USE MODD_ADV_n -USE MODD_PAST_FIELD_n -USE MODD_TURB_n -USE MODD_PARAM_C2R2, ONLY :LSUPSAT -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KCALL ! number of times this routine has been called -INTEGER :: IMI ! Current Model index -! -!* 0.2 declarations of local variables -! -!------------------------------------------------------------------------------- -! -! Save current Model index and switch to model 1 variables -IMI = GET_CURRENT_MODEL_INDEX() -CALL GOTO_MODEL(1) -!* 1. Module MODD_FIELD$n -! -IF ( KCALL==3 ) THEN - IF (CUVW_ADV_SCHEME(1:3)=='CEN'.AND. CTEMP_SCHEME=='LEFR') THEN - DEALLOCATE(XUM) - DEALLOCATE(XVM) - DEALLOCATE(XWM) - DEALLOCATE(XDUM) - DEALLOCATE(XDVM) - DEALLOCATE(XDWM) - END IF - DEALLOCATE(XUT) - DEALLOCATE(XVT) - DEALLOCATE(XWT) - DEALLOCATE(XTHT) - IF (L2D_ADV_FRC) THEN - IF (ASSOCIATED(XDTHFRC)) DEALLOCATE(XDTHFRC) - IF (ASSOCIATED(XDRVFRC)) DEALLOCATE(XDRVFRC) - IF (ASSOCIATED(TDTADVFRC)) DEALLOCATE(TDTADVFRC) - END IF - IF (L2D_REL_FRC) THEN - IF (ASSOCIATED(XTHREL)) DEALLOCATE(XTHREL) - IF (ASSOCIATED(XRVREL)) DEALLOCATE(XRVREL) - IF (ASSOCIATED(TDTRELFRC)) DEALLOCATE(TDTRELFRC) - END IF - ! DEALLOCATE EDDY FLUXES - IF (LTH_FLX) THEN - DEALLOCATE(XVTH_FLUX_M) - DEALLOCATE(XWTH_FLUX_M) - END IF - IF (LUV_FLX) THEN - DEALLOCATE(XVU_FLUX_M) - END IF -END IF -IF ( KCALL==1 ) THEN - DEALLOCATE(XRUS) - DEALLOCATE(XRVS) - DEALLOCATE(XRWS) - DEALLOCATE(XRTHS) - DEALLOCATE(XRUS_PRES, XRVS_PRES, XRWS_PRES ) - DEALLOCATE(XRTHS_CLD ) -END IF -! -IF ( KCALL==3 ) THEN - IF (ASSOCIATED(XTKET)) DEALLOCATE(XTKET) -END IF -IF ( ASSOCIATED(XRTKES) .AND. KCALL==1 ) THEN - DEALLOCATE(XRTKES) -END IF -! -IF ( KCALL==3 ) THEN - DEALLOCATE(XPABST) -! - DEALLOCATE(XRT) -END IF -! -IF ( KCALL==1 ) THEN - DEALLOCATE(XRRS) - DEALLOCATE(XRRS_CLD) -END IF -! -IF ( ASSOCIATED(XSRCT) .AND. KCALL==3 ) THEN - DEALLOCATE(XSRCT) - DEALLOCATE(XSIGS) -END IF -! -IF ( ASSOCIATED(XHLC_HRC) .AND. KCALL==3 ) THEN - DEALLOCATE(XHLC_HRC) - DEALLOCATE(XHLC_HCF) - DEALLOCATE(XHLI_HRI) - DEALLOCATE(XHLI_HCF) -END IF -! -IF ( ASSOCIATED(XCLDFR) .AND. KCALL==2 ) THEN - DEALLOCATE(XCLDFR) -END IF -! -IF ( ASSOCIATED(XICEFR) .AND. KCALL==2 ) THEN - DEALLOCATE(XICEFR) -END IF -! -IF ( ASSOCIATED(XRAINFR) .AND. KCALL==2 ) THEN - DEALLOCATE(XRAINFR) -END IF -! -IF ( KCALL == 3 ) THEN - DEALLOCATE(XSVT) -END IF -IF ( KCALL == 1 ) THEN - DEALLOCATE(XRSVS) - DEALLOCATE(XRSVS_CLD) -END IF -! -IF ((CCLOUD == 'KHKO') .AND. LSUPSAT) THEN - DEALLOCATE(XSUPSAT) - DEALLOCATE(XNACT) - DEALLOCATE(XNPRO) - DEALLOCATE(XSSPRO) -END IF -! -IF (ASSOCIATED(XDUMMY_GR_FIELDS) .AND. KCALL==3 ) THEN - DEALLOCATE(XDUMMY_GR_FIELDS) -END IF - -IF (ASSOCIATED(XLSPHI)) THEN - DEALLOCATE(XLSPHI) -END IF - -IF (ASSOCIATED(XBMAP)) THEN - DEALLOCATE(XBMAP) -END IF - -IF (ASSOCIATED(XFMRFA)) THEN - DEALLOCATE(XFMRFA) -END IF - -IF (ASSOCIATED(XFMWF0)) THEN - DEALLOCATE(XFMWF0) -END IF - -IF (ASSOCIATED(XFMR0)) THEN - DEALLOCATE(XFMR0) -END IF - -IF (ASSOCIATED(XFMR00)) THEN - DEALLOCATE(XFMR00) -END IF - -IF (ASSOCIATED(XFMIGNITION)) THEN - DEALLOCATE(XFMIGNITION) -END IF - -IF (ASSOCIATED(XFMFUELTYPE)) THEN - DEALLOCATE(XFMFUELTYPE) -END IF - -IF (ASSOCIATED(XFIRETAU)) THEN - DEALLOCATE(XFIRETAU) -END IF - -IF (ASSOCIATED(XFLUXPARAMH)) THEN - DEALLOCATE(XFLUXPARAMH) -END IF - -IF (ASSOCIATED(XFLUXPARAMW)) THEN - DEALLOCATE(XFLUXPARAMW) -END IF - -IF (ASSOCIATED(XFIRERW)) THEN - DEALLOCATE(XFIRERW) -END IF - -IF (ASSOCIATED(XFMASE)) THEN - DEALLOCATE(XFMASE) -END IF - -IF (ASSOCIATED(XFMAWC)) THEN - DEALLOCATE(XFMAWC) -END IF - -IF (ASSOCIATED(XFMWALKIG)) THEN - DEALLOCATE(XFMWALKIG) -END IF - -IF (ASSOCIATED(XFMFLUXHDH)) THEN - DEALLOCATE(XFMFLUXHDH) -END IF - -IF (ASSOCIATED(XFMFLUXHDW)) THEN - DEALLOCATE(XFMFLUXHDW) -END IF - -IF (ASSOCIATED(XFMHWS)) THEN - DEALLOCATE(XFMHWS) -END IF - -IF (ASSOCIATED(XFMWINDU)) THEN - DEALLOCATE(XFMWINDU) -END IF - -IF (ASSOCIATED(XFMWINDV)) THEN - DEALLOCATE(XFMWINDV) -END IF - -IF (ASSOCIATED(XFMWINDW)) THEN - DEALLOCATE(XFMWINDW) -END IF - -IF (ASSOCIATED(XFMGRADOROX)) THEN - DEALLOCATE(XFMGRADOROX) -END IF - -IF (ASSOCIATED(XFMGRADOROY)) THEN - DEALLOCATE(XFMGRADOROY) -END IF - -IF (ASSOCIATED(XGRADLSPHIX)) THEN - DEALLOCATE(XGRADLSPHIX) -END IF - -IF (ASSOCIATED(XGRADLSPHIY)) THEN - DEALLOCATE(XGRADLSPHIY) -END IF - -IF (ASSOCIATED(XFIREWIND)) THEN - DEALLOCATE(XFIREWIND) -END IF - -IF (ASSOCIATED(XLSPHI2D)) THEN - DEALLOCATE(XLSPHI2D) -END IF - -IF (ASSOCIATED(XGRADLSPHIX2D)) THEN - DEALLOCATE(XGRADLSPHIX2D) -END IF - -IF (ASSOCIATED(XGRADLSPHIY2D)) THEN - DEALLOCATE(XGRADLSPHIY2D) -END IF - -IF (ASSOCIATED(XGRADMASKX)) THEN - DEALLOCATE(XGRADMASKX) -END IF - -IF (ASSOCIATED(XGRADMASKY)) THEN - DEALLOCATE(XGRADMASKY) -END IF - -IF (ASSOCIATED(XSURFRATIO2D)) THEN - DEALLOCATE(XSURFRATIO2D) -END IF - -IF (ASSOCIATED(XLSDIFFUX2D)) THEN - DEALLOCATE(XLSDIFFUX2D) -END IF - -IF (ASSOCIATED(XLSDIFFUY2D)) THEN - DEALLOCATE(XLSDIFFUY2D) -END IF - -IF (ASSOCIATED(XFIRERW2D)) THEN - DEALLOCATE(XFIRERW2D) -END IF -! -!* 3. Module MODD_GRID$n -! -IF ( ASSOCIATED(XLON) .AND. KCALL == 3 ) THEN - DEALLOCATE(XLON) - DEALLOCATE(XLAT) - DEALLOCATE(XMAP) -END IF -! -IF ( KCALL == 3 ) THEN - !Philippe W.: do not deallocate XXHAT, XYHAT and XZHAT because they are needed later on - !As they are 1D, their memory footprint is negligible - ! DEALLOCATE(XXHAT) - DEALLOCATE(XDXHAT) - ! DEALLOCATE(XYHAT) - DEALLOCATE(XDYHAT) - DEALLOCATE(XZS) - DEALLOCATE(XZSMT) - DEALLOCATE(XZZ) - ! DEALLOCATE(XZHAT) -END IF -! -IF ( KCALL == 2 ) THEN - DEALLOCATE(XDIRCOSZW) - DEALLOCATE(XDIRCOSXW) - DEALLOCATE(XDIRCOSYW) - DEALLOCATE(XCOSSLOPE) - DEALLOCATE(XSINSLOPE) -END IF - -IF ( KCALL == 2 ) THEN - DEALLOCATE(XDXX) - DEALLOCATE(XDYY) - DEALLOCATE(XDZX) - DEALLOCATE(XDZY) - DEALLOCATE(XDZZ) -END IF -! -!* 4. Modules MODD_REF and MODD_REF$n -! -IF ( KCALL == 4 ) THEN - DEALLOCATE(XRHODREFZ) - DEALLOCATE(XTHVREFZ) -END IF -! -IF ( KCALL == 3 ) THEN - DEALLOCATE(XRHODREF) - DEALLOCATE(XTHVREF) - DEALLOCATE(XEXNREF) - DEALLOCATE(XRHODJ) - IF ( ASSOCIATED(XRVREF) ) THEN - DEALLOCATE(XRVREF) - END IF -END IF -! -!* 5. Module MODD_CURVCOR$n -! -IF ( ASSOCIATED(XCORIOX) .AND. KCALL == 2 ) THEN - DEALLOCATE(XCORIOX) - DEALLOCATE(XCORIOY) -END IF -IF ( KCALL == 2 ) THEN - DEALLOCATE(XCORIOZ) -END IF -IF ( ASSOCIATED(XCURVX) .AND. KCALL == 2) THEN - DEALLOCATE(XCURVX) - DEALLOCATE(XCURVY) -END IF -! -!* 6. Module MODD_DYN$n -! -IF ( KCALL == 1 ) THEN - DEALLOCATE(XBFY) - DEALLOCATE(XAF,XCF) - DEALLOCATE(XTRIGSX) - DEALLOCATE(XTRIGSY) - DEALLOCATE(XRHOM) - DEALLOCATE(XALK) - DEALLOCATE(XALKW) - DEALLOCATE(XALKBAS) - DEALLOCATE(XALKWBAS) - IF ( ASSOCIATED(XKURELAX) ) THEN - DEALLOCATE(XKURELAX) - DEALLOCATE(XKVRELAX) - DEALLOCATE(XKWRELAX) - DEALLOCATE(LMASK_RELAX) - END IF -END IF -! -!* 7. Larger Scale variables (Module MODD_LSFIELD$n) -! -IF ( KCALL == 3 ) THEN - DEALLOCATE(XLSUM) - DEALLOCATE(XLSVM) - DEALLOCATE(XLSWM) - DEALLOCATE(XLSTHM) - IF(ASSOCIATED(XLSRVM)) DEALLOCATE(XLSRVM) - IF (ASSOCIATED(XLBXUM)) THEN - DEALLOCATE(XLBXUM) - DEALLOCATE(XLBYUM) - DEALLOCATE(XLBXVM) - DEALLOCATE(XLBYVM) - DEALLOCATE(XLBXWM) - DEALLOCATE(XLBYWM) - DEALLOCATE(XLBXTHM) - DEALLOCATE(XLBYTHM) - END IF - IF (ASSOCIATED(XLBXTKEM)) THEN - DEALLOCATE(XLBXTKEM) - DEALLOCATE(XLBYTKEM) - END IF - IF (ASSOCIATED(XLBXRM)) THEN - DEALLOCATE(XLBXRM) - DEALLOCATE(XLBYRM) - END IF - IF (ASSOCIATED(XLBXSVM)) THEN - DEALLOCATE(XLBXSVM) - DEALLOCATE(XLBYSVM) - END IF -END IF -! - ! steady LS fields only for model 1 or independent models -! -IF( ASSOCIATED(XLSUS) .AND. KCALL == 3 ) THEN - DEALLOCATE(XLSUS) - DEALLOCATE(XLSVS) - DEALLOCATE(XLSWS) - DEALLOCATE(XLSTHS) - IF(ASSOCIATED(XLSRVS)) DEALLOCATE(XLSRVS) -! - IF ( ASSOCIATED(XLBXUS) ) THEN - DEALLOCATE(XLBXUS) - DEALLOCATE(XLBYUS) - DEALLOCATE(XLBXVS) - DEALLOCATE(XLBYVS) - DEALLOCATE(XLBXWS) - DEALLOCATE(XLBYWS) - DEALLOCATE(XLBXTHS) - DEALLOCATE(XLBYTHS) - END IF - IF ( ASSOCIATED(XLBXTKES) ) THEN - DEALLOCATE(XLBXTKES) - DEALLOCATE(XLBYTKES) - END IF -! - IF ( ASSOCIATED(XLBXRS) ) THEN - DEALLOCATE(XLBXRS) - DEALLOCATE(XLBYRS) - END IF -! - IF ( ASSOCIATED(XLBXSVS) ) THEN - DEALLOCATE(XLBXSVS) - DEALLOCATE(XLBYSVS) - END IF -! - IF ( ASSOCIATED(XCOEFLIN_LBXM) ) THEN - DEALLOCATE(XCOEFLIN_LBXM) - DEALLOCATE(NKLIN_LBXM) - END IF - - IF ( ASSOCIATED(XCOEFLIN_LBYM) ) THEN - DEALLOCATE(XCOEFLIN_LBYM) - DEALLOCATE(NKLIN_LBYM) - END IF - - IF ( ASSOCIATED(XCOEFLIN_LBXU) ) THEN - DEALLOCATE(XCOEFLIN_LBXU) - DEALLOCATE(NKLIN_LBXU) - DEALLOCATE(XCOEFLIN_LBYU) - DEALLOCATE(NKLIN_LBYU) - DEALLOCATE(XCOEFLIN_LBXV) - DEALLOCATE(NKLIN_LBXV) - DEALLOCATE(XCOEFLIN_LBYV) - DEALLOCATE(NKLIN_LBYV) - DEALLOCATE(XCOEFLIN_LBXW) - DEALLOCATE(NKLIN_LBXW) - DEALLOCATE(XCOEFLIN_LBYW) - DEALLOCATE(NKLIN_LBYW) - END IF -END IF -! -!* 8. L.E.S. variables -! - -! -!* 9. Module MODD_RADIATIONS$n -! -! -IF ( ASSOCIATED(XSLOPANG) .AND. KCALL == 2 ) THEN - DEALLOCATE(XSLOPANG) - DEALLOCATE(XSLOPAZI) - DEALLOCATE(XDTHRAD) - DEALLOCATE(XFLALWD) - DEALLOCATE(XDIRFLASWD) - DEALLOCATE(XSCAFLASWD) - DEALLOCATE(XDIRSRFSWD) - DEALLOCATE(XSWU) - DEALLOCATE(XSWD) - DEALLOCATE(XLWU) - DEALLOCATE(XLWD) - DEALLOCATE(XDTHRADSW) - DEALLOCATE(XDTHRADLW) - DEALLOCATE(XRADEFF) - DEALLOCATE(NCLEARCOL_TM1) -END IF -IF (ASSOCIATED(XSTATM)) DEALLOCATE(XSTATM) -! -!* 10. Module MODD_DEEP_CONVECTION$n -! -IF ( ASSOCIATED(XDTHCONV) .AND. KCALL == 2 ) THEN - DEALLOCATE(NCOUNTCONV) - DEALLOCATE(XDTHCONV) - DEALLOCATE(XDRVCONV) - DEALLOCATE(XDRCCONV) - DEALLOCATE(XDRICONV) -END IF -! -IF ( ASSOCIATED(XPRCONV) .AND. KCALL == 2 ) THEN - DEALLOCATE(XPRCONV) - DEALLOCATE(XPACCONV) -END IF -IF ( ASSOCIATED(XPRSCONV) .AND. KCALL == 2 ) THEN - DEALLOCATE(XPRSCONV) -END IF -! -IF ( ASSOCIATED(XDSVCONV) .AND. KCALL == 2 ) THEN - DEALLOCATE(XDSVCONV) -END IF -! -!* 11. Forcing variables (Module MODD_FRC) -! -IF ( ALLOCATED(XUFRC) .AND. KCALL == 4 ) THEN - DEALLOCATE(TDTFRC) - DEALLOCATE(XUFRC) - DEALLOCATE(XVFRC) - DEALLOCATE(XWFRC) - DEALLOCATE(XTHFRC) - DEALLOCATE(XRVFRC) - DEALLOCATE(XTENDTHFRC) - DEALLOCATE(XTENDRVFRC) - DEALLOCATE(XGXTHFRC) - DEALLOCATE(XGYTHFRC) - DEALLOCATE(XPGROUNDFRC) -END IF -! -!* 12. Module MODD_ICE_CONC$n -! -IF ( ASSOCIATED(XCIT) .AND. KCALL == 2 ) THEN - DEALLOCATE(XCIT) -END IF -! -!* 13. Module MODD_PRECIP$n -! -IF ( ASSOCIATED(XINPRC) .AND. KCALL == 3 ) THEN - DEALLOCATE(XINPRC) - DEALLOCATE(XACPRC) -END IF -! -IF ( ASSOCIATED(XINPRR) .AND. KCALL == 3 ) THEN - DEALLOCATE(XINPRR) - DEALLOCATE(XACPRR) -END IF -! -IF ( ASSOCIATED(XINPRR3D) .AND. KCALL == 3 ) THEN - DEALLOCATE(XINPRR3D) - DEALLOCATE(XEVAP3D) -END IF -! -IF ( ASSOCIATED(XINPRS) .AND. KCALL == 3 ) THEN - DEALLOCATE(XINPRS) - DEALLOCATE(XACPRS) - DEALLOCATE(XINPRG) - DEALLOCATE(XACPRG) -END IF -! -IF ( ASSOCIATED(XINPRH) .AND. KCALL == 3 ) THEN - DEALLOCATE(XINPRH) - DEALLOCATE(XACPRH) -END IF -! -!* 13b. Module MODD_ELEC$n -! -IF ( ASSOCIATED(XNI_SDRYG) .AND. KCALL == 3 ) THEN - DEALLOCATE(XNI_SDRYG) - DEALLOCATE(XNI_IDRYG) - DEALLOCATE(XNI_IAGGS) - DEALLOCATE(XEW) - DEALLOCATE(XIND_RATE) -END IF -! -IF ( ASSOCIATED(XEFIELDU) .AND. KCALL == 3 ) THEN - DEALLOCATE(XEFIELDU) - DEALLOCATE(XEFIELDV) - DEALLOCATE(XEFIELDW) - DEALLOCATE(XESOURCEFW) - DEALLOCATE(XIONSOURCEFW) - DEALLOCATE(XCION_POS_FW) - DEALLOCATE(XCION_NEG_FW) - DEALLOCATE(XMOBIL_POS) - DEALLOCATE(XMOBIL_NEG) -END IF -! -IF ( ASSOCIATED(XRHOM_E) .AND. KCALL == 3 ) THEN - DEALLOCATE (XRHOM_E) - DEALLOCATE (XAF_E) - DEALLOCATE (XCF_E) - DEALLOCATE (XBFY_E) -END IF -! -!* 14. Modules RAIN_ICE_DESCR and MODD_RAIN_ICE_PARAM -! -IF ( ASSOCIATED(XRTMIN) .AND. KCALL == 4 ) THEN - CALL RAIN_ICE_DESCR_DEALLOCATE() - CALL RAIN_ICE_PARAM_DEALLOCATE() -END IF -! -!* 15. Module PASPOLn -! -IF ( ASSOCIATED(XATC) .AND. KCALL == 3 ) THEN - DEALLOCATE(XATC) -END IF -! -!* 16. Module TURBn -! -IF ( KCALL==3 ) THEN - IF (ASSOCIATED(XDYP)) DEALLOCATE(XDYP) - IF (ASSOCIATED(XTHP)) DEALLOCATE(XTHP) - IF (ASSOCIATED(XTR)) DEALLOCATE(XTR) - IF (ASSOCIATED(XDISS)) DEALLOCATE(XDISS) - IF (ASSOCIATED(XLEM)) DEALLOCATE(XLEM) - IF (ASSOCIATED(XCEI)) DEALLOCATE(XCEI) -END IF -!------------------------------------------------------------------------------- -! -CALL GOTO_MODEL(IMI) -! -END SUBROUTINE DEALLOCATE_MODEL1 diff --git a/src/PHYEX/ext/default_desfmn.f90 b/src/PHYEX/ext/default_desfmn.f90 deleted file mode 100644 index 33466cf0a..000000000 --- a/src/PHYEX/ext/default_desfmn.f90 +++ /dev/null @@ -1,1327 +0,0 @@ -!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ########################### - MODULE MODI_DEFAULT_DESFM_n -! ########################### -! -INTERFACE -! -SUBROUTINE DEFAULT_DESFM_n(KMI) -INTEGER, INTENT(IN) :: KMI ! Model index -END SUBROUTINE DEFAULT_DESFM_n -! -END INTERFACE -! -END MODULE MODI_DEFAULT_DESFM_n -! -! -! -! ############################### - SUBROUTINE DEFAULT_DESFM_n(KMI) -! ############################### -! -!!**** *DEFAULT_DESFM_n * - set default values for descriptive variables of -!! model KMI -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to set default values for the variables -! in descriptor files by filling the corresponding variables which -! are stored in modules. -! -! -!!** METHOD -!! ------ -!! Each variable in modules, which can be initialized by reading its -!! value in the descriptor file is set to a default value. -!! When this routine is used during INIT, the modules of the first model -!! are used to temporarily store the variables associated with a nested -!! model. -!! When this routine is used during SPAWNING, the modules of a second -!! model must be initialized. -!! Default values for variables common to all models are set only -!! at the first call of DEFAULT_DESFM_n (i.e. when KMI=1) -!! -!! -!! EXTERNAL -!! -------- -!! NONE -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_PARAMETERS : JPHEXT,JPVEXT -!! -!! Module MODD_CONF : CCONF,L2D,L1D,LFLAT,NMODEL,NVERB -!! -!! Module MODD_DYN : XSEGLEN,XASSELIN,LCORIO,LNUMDIFF -!! XALKTOP,XALZBOT -!! -!! Module MODD_BAKOUT -!! -!! Module MODD_NESTING : NDAD(m),NDTRATIO(m),XWAY(m) -!! -!! Module MODD_CONF_n : LUSERV,LUSERC,LUSERR,LUSERI,LUSERS -!! LUSERG,LUSERH,CSEG,CEXP -!! -!! Module MODD_LUNIT_n : CINIFILE,CCPLFILE -!! -!! -!! Module MODD_DYN_n : XTSTEP,CPRESOPT,NITR,XRELAX,LHO_RELAX -!! LVE_RELAX,XRIMKMAX,NRIMX,NRIMY -!! -!! Module MODD_ADV_n : CUVW_ADV_SCHEME,CMET_ADV_SCHEME,CSV_ADV_SCHEME,NLITER -!! -!! Module MODD_PARAM_n : CTURB,CRAD,CDCONV,CSCONV -!! -!! Module MODD_LBC_n : CLBCX, CLBCY,NLBLX,NLBLY,XCPHASE,XCPHASE_PBL,XPOND -!! -!! Module MODD_TURB_n : XIMPL,CTURBLEN,CTURBDIM,LTURB_FLX,LTURB_DIAG,LSUBG_COND -!! LTGT_FLX -!! -!! -!! Module MODD_PARAM_RAD_n: -!! XDTRAD,XDTRAD_CLONLY,LCLEAR_SKY,NRAD_COLNBR, NRAD_DIAG -!! -!! Module MODD_BUDGET : CBUTYPE,NBUMOD,XBULEN,NBUKL, NBUKH,LBU_KCP,XBUWRI -!! NBUIL, NBUIH,NBUJL, NBUJH,LBU_ICP,LBU_JCP,NBUMASK -!! -!! Module MODD_BLANK_n: -!! -!! XDUMMYi, NDUMMYi, LDUMMYi, CDUMMYi -!! -!! Module MODD_FRC : -!! -!! LGEOST_UV_FRC,LGEOST_TH_FRC,LTEND_THRV_FRC -!! LVERT_MOTION_FRC,LRELAX_THRV_FRC,LRELAX_UV_FRC,LRELAX_UVMEAN_FRC, -!! XRELAX_TIME_FRC -!! XRELAX_HEIGHT_FRC,CRELAX_HEIGHT_TYPE,LTRANS,XUTRANS,XVTRANS, -!! LPGROUND_FRC -!! -!! Module MODD_PARAM_ICE : -!! -!! LWARM,CPRISTINE_ICE -!! -!! Module MODD_PARAM_KAFR_n : -!! -!! XDTCONV,LREFRESH_ALL,LDOWN,NICE,LCHTRANS -!! -!! Module MODD_PARAM_MFSHALL_n : -!! -!! CMF_UPDRAFT,LMIXUV,CMF_CLOUD,XIMPL_MF,LMF_FLX -!! -!! -!! -!! -!! REFERENCE -!! --------- -!! Book2 of the documentation (routine DEFAULT_DESFM_n) -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 02/06/94 -!! Modifications 17/10/94 (Stein) For LCORIO -!! Modifications 06/12/94 (Stein) remove LBOUSS+add LABSLAYER, LNUMDIFF -!! ,LSTEADYLS -!! Modifications 06/12/94 (Stein) remove LABSLAYER, add LHO_RELAX, -!! LVE_RELAX, NRIMX, NRIMY, XRIMKMAX -!! Modifications 09/01/95 (Lafore) add LSTEADY_DMASS -!! Modifications 09/01/95 (Stein) add the turbulence scheme namelist -!! Modifications 09/01/95 (Stein) add the 1D switch -!! Modifications 10/03/95 (Mallet) add the coupling files -!! 29/06/95 ( Stein, Nicolau, Hereil) add the budgets -!! Modifications 25/09/95 ( Stein )add the LES tools -!! Modifications 25/10/95 ( Stein )add the radiations -!! Modifications 23/10/95 (Vila, lafore) new scalar advection scheme -!! Modifications 24/02/96 (Stein) change the default value for CCPLFILE -!! Modifications 12/02/96 (Lafore) transformation to DEFAULT_DESFM_n for -!! spawning -!! Modifications 25/04/96 (Suhre) add the blank module -!! Modifications 29/07/96 (Pinty&Suhre) add module MODD_FRC -!! Modifications 11/04/96 (Pinty) add the rain-ice scheme and modify -!! the split arrays in MODD_PARAM_RAD_n -!! Modifications 11/01/97 (Pinty) add the deep convection scheme -!! Modifications 24/11/96 (Masson) add LREFRESH_ALL in deep convection -!! Modifications 12/02/96 (Lafore) transformation to DEFAULT_DESFM_n for spawning -!! Modifications 22/07/96 (Lafore) gridnesting implementation -!! Modifications 29/07/96 (Lafore) add the module MODD_FMOUT (renamed MODD_BAKOUT) -!! Modifications 23/06/97 (Stein) add the equation system name -!! Modifications 10/07/97 (Masson) add MODD_PARAM_GROUNDn : CROUGH -!! Modifications 28/07/97 (Masson) remove LREFRESH_ALL and LSTEADY_DMASS -!! Modifications 08/10/97 (Stein) switch (_n=1) to initialize the -!! parameters common to all models -!! Modifications 24/01/98 (Bechtold) add LREFRESH_ALL, LCHTRANS, -!! LTEND_THRV_FR and LSST_FRC -!! Modifications 18/07/99 (Stein) add LRAD_DIAG -!! Modification 15/03/99 (Masson) use of XUNDEF -!! Modification 11/12/00 (Tomasini) Add CSEA_FLUX to MODD_PARAMn -!! Modification 22/01/01 (Gazen) delete NSV and add LHORELAX_SVC2R2 -!! LHORELAX_SVCHEM,LHORELAX_SVLG -!! Modification 15/03/02 (Solmon) radiation scheme: remove NSPOT and add -!! default for aerosol and cloud rad. prop. control -!! Modification 22/05/02 (Jabouille) put chimical default here -!! Modification 01/2004 (Masson) removes surface (externalization) -!! 09/04 (M. Tomasini) New namelist to modify the -!! Cloud mixing length -!! 07/05 (P.Tulet) New namelists for dust and aerosol -!! Modification 01/2007 (Malardel, Pergaud) Add MODD_PARAM_MFSHALL_n -!! Modification 10/2009 (Aumond) Add user multimasks for LES -!! Modification 10/2009 (Aumond) Add MEAN_FIELD -!! Modification 12/04/07 (Leriche) add LUSECHAQ for aqueous chemistry -!! Modification 30/05/07 (Leriche) add LCH_PH and XCH_PHINIT for pH -!! Modification 25/04/08 (Leriche) add XRTMIN_AQ LWC threshold for aq. chemistry -!! 16/07/10 add LHORELAX_SVIC -!! 16/09/10 add LUSECHIC -!! 13/01/11 add LCH_RET_ICE -!! 01/07/11 (F.Couvreux) Add CONDSAMP -!! 01/07/11 (B.Aouizerats) Add CAOP -!! 07/2013 (C.Lac) add WENO, LCHECK -!! 07/2013 (Bosseur & Filippi) adds Forefire -!! 08/2015 (Redelsperger & Pianezze) add XPOND coefficient for LBC -!! Modification 24/03/16 (Leriche) remove LCH_SURFACE_FLUX -!! put NCH_VEC_LENGTH = 50 instead of 1000 -!! -!! 04/2016 (C.LAC) negative contribution to the budget split between advection, turbulence and microphysics for KHKO/C2R2 -!! Modification 01/2016 (JP Pinty) Add LIMA -!! Modification 24/03/16 (Leriche) remove LCH_SURFACE_FLUX -!! put NCH_VEC_LENGTH = 50 instead of 1000 -!! 10/2016 (C.Lac) VSIGQSAT change from 0 to 0.02 for coherence with AROME -!! 10/2016 (C.Lac) Add droplet deposition -!! 10/2016 (R.Honnert and S.Riette) : Improvement of EDKF and adaptation to the grey zone -!! 10/2016 (F Brosse) add prod/loss terms computation for chemistry -!! 07/2017 (V. Masson) adds time step for output files writing. -!! 09/2017 Q.Rodier add LTEND_UV_FRC -!! 02/2018 Q.Libois ECRAD -! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! 01/2018 (S. Riette) new budgets and variables for ICE3/ICE4 -!! 01/2018 (J.Colin) add VISC and DRAG -!! 07/2017 (V. Vionnet) add blowing snow variables -!! 01/2019 (R. Honnert) add reduction of the mass-flux surface closure with the resolution -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes -!! 05/2019 F.Brient add tracer emission from the top of the boundary-layer -!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree -! P. Wautelet 17/04/2020: move budgets switch values into modd_budget -! P. Wautelet 30/06/2020: add NNETURSV, NNEADVSV and NNECONSV variables -! F. Auguste, T. Nagel 02/2021: add IBM defaults parameters -! T. Nagel 02/2021: add turbulence recycling defaults parameters -! P-A Joulin 21/05/2021: add Wind turbines -! S. Riette 21/05/2021: add options to PDF subgrid scheme -! D. Ricard 05/2021: add the contribution of Leonard terms in the turbulence scheme -! JL Redelsperger 06/2021: add parameters allowing to active idealized oceanic convection -! B. Vie 06/2021: add prognostic supersaturation for LIMA -! Q. Rodier 06/2021: modify default value to LGZ=F (grey-zone corr.), LSEDI and OSEDC=T (LIMA sedimentation) -! F. Couvreux 06/2021: add LRELAX_UVMEAN_FRC -! Q. Rodier 07/2021: modify XPOND=1 -! R. Schoetter 12/2021 multi-level coupling between MesoNH and SURFEX -! A. Costes 12/2021: Blaze fire model -! C. Barthe 03/2022: add CIBU and RDSF options in LIMA -! Delbeke/Vie 03/2022: KHKO option in LIMA -! P. Wautelet 27/04/2022: add namelist for profilers -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -USE MODD_PARAMETERS -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_CONF ! For INIT only DEFAULT_DESFM1 -USE MODD_CONFZ -USE MODD_DYN -USE MODD_NESTING -USE MODD_BAKOUT -USE MODD_SERIES -USE MODD_CONF_n ! modules used to set the default values is only -USE MODD_LUNIT_n ! the one corresponding to model 1. These memory -USE MODD_DIM_n ! addresses will then be filled by the values read in -USE MODD_DYN_n ! the DESFM corresponding to model n which may have -USE MODD_ADV_n ! missing values. This is why we affect default values. -USE MODD_PARAM_n ! For SPAWNING DEFAULT_DESFM2 is also used -USE MODD_LBC_n -USE MODD_OUT_n -USE MODD_TURB_n, ONLY: TURBN_INIT -USE MODD_NEB_n, ONLY: NEBN_INIT -USE MODD_BUDGET -USE MODD_LES -USE MODD_PARAM_RAD_n -#ifdef MNH_ECRAD -USE MODD_PARAM_ECRAD_n -#if ( VER_ECRAD == 140 ) -USE MODD_RADIATIONS_n , ONLY : NSWB_MNH, NLWB_MNH -#endif -#endif -USE MODD_BLANK_n -USE MODD_FRC -USE MODD_PARAM_ICE_n, ONLY: PARAM_ICEN_INIT -USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_INIT -USE MODD_PARAM_C2R2 -USE MODD_PARAM_KAFR_n -USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN_INIT -USE MODD_CH_MNHC_n -USE MODD_SERIES_n -USE MODD_NUDGING_n -USE MODD_CH_AEROSOL -USE MODD_DUST -USE MODD_SALT -USE MODD_PASPOL -USE MODD_CONDSAMP -USE MODD_MEAN_FIELD -USE MODD_DRAGTREE_n -USE MODD_DRAGBLDG_n -USE MODD_COUPLING_LEVELS_n -USE MODD_EOL_MAIN -USE MODD_EOL_ADNR -USE MODD_EOL_ALM -USE MODD_EOL_SHARED_IO -USE MODD_ALLPROFILER_n -USE MODD_ALLSTATION_n -! -USE MODD_LATZ_EDFLX -USE MODD_2D_FRC -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n -USE MODD_DRAG_n -USE MODD_VISCOSITY -USE MODD_RECYCL_PARAM_n -USE MODD_IBM_PARAM_n -USE MODD_IBM_LSF -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE -#endif -USE MODD_FIRE_n -USE MODD_IO, ONLY: TFILEDATA -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KMI ! Model index -! -!* 0.2 declaration of local variables -! -INTEGER :: JM ! loop index -TYPE(TFILEDATA) TFILENAM ! Empty file to satisfy interface of PHYEX_init routines which may calls POSNAM (but do not) -! -!------------------------------------------------------------------------------- -! -!* 1. SET DEFAULT VALUES FOR MODD_LUNIT_n : -! ---------------------------------- -! -! CINIFILE='INIFILE' -CINIFILEPGD='' !Necessary to keep this line to prevent problems with spawning -CCPLFILE(:)=' ' -! -!------------------------------------------------------------------------------- -! -!* 2. SET DEFAULT VALUES FOR MODD_CONF AND MODD_CONF_n : -! ------------------------------------------------ -! -IF (KMI == 1) THEN - CCONF ='START' - LTHINSHELL = .FALSE. - L2D = .FALSE. - L1D = .FALSE. - LFLAT = .FALSE. - NMODEL = 1 - CEQNSYS = 'DUR' - NVERB = 5 - CEXP = 'EXP01' - CSEG = 'SEG01' - LFORCING = .FALSE. - L2D_ADV_FRC= .FALSE. - L2D_REL_FRC= .FALSE. - XRELAX_HEIGHT_BOT = 0. - XRELAX_HEIGHT_TOP = 30000. - XRELAX_TIME = 864000. - LPACK = .TRUE. - NHALO = 1 -#ifdef MNH_SX5 - CSPLIT ='YSPLITTING' ! NEC vectoriel architecture , low number of PROC -#else - CSPLIT ='BSPLITTING' ! Scalaire architecture , high number of PROC -#endif - NZ_PROC = 0 !JUAN Z_SPLITTING :: number of proc in Z splitting - NZ_SPLITTING = 10 !JUAN Z_SPLITTING :: for debug NZ=1=flat_inv; NZ=10=flat_invz; NZ=1+2 the two - LLG = .FALSE. - LINIT_LG = .FALSE. - CINIT_LG = 'FMOUT' - LNOMIXLG = .FALSE. - LCHECK = .FALSE. -END IF -! -CCLOUD = 'NONE' -LUSERV = .TRUE. -LUSERC = .FALSE. -LUSERR = .FALSE. -LUSERI = .FALSE. -LUSERS = .FALSE. -LUSERG = .FALSE. -LUSERH = .FALSE. -LOCEAN = .FALSE. -!NSV = 0 -!NSV_USER = 0 -LUSECI = .FALSE. -! -!------------------------------------------------------------------------------- -! -!* 3. SET DEFAULT VALUES FOR MODD_DYN AND MODD_DYN_n : -! ----------------------------------------------- -! -IF (KMI == 1) THEN - XSEGLEN = 43200. - XASSELIN = 0.2 - XASSELIN_SV = 0.02 - LCORIO = .TRUE. - LNUMDIFU = .TRUE. - LNUMDIFTH = .FALSE. - LNUMDIFSV = .FALSE. - XALZBOT = 4000. - XALKTOP = 0.01 - XALKGRD = 0.01 - XALZBAS = 0.01 -END IF -! -XTSTEP = 60. -CPRESOPT = 'CRESI' -NITR = 4 -LITRADJ = .TRUE. -LRES = .FALSE. -XRES = 1.E-07 -XRELAX = 1. -LVE_RELAX = .FALSE. -LVE_RELAX_GRD = .FALSE. -XRIMKMAX = 0.01 / XTSTEP -XT4DIFU = 1800. -XT4DIFTH = 1800. -XT4DIFSV = 1800. -! -IF (KMI == 1) THEN ! for model 1 we have a Large scale information - NRIMX = JPRIMMAX ! for U,V,W,TH,Rv used for the hor. relaxation - NRIMY = JPRIMMAX -ELSE - NRIMX = 0 ! for inner models we use only surfacic fields to - NRIMY = 0 ! give the lbc and no hor. relaxation is used -END IF -! -LHORELAX_UVWTH = .FALSE. -LHORELAX_RV = .FALSE. -LHORELAX_RC = .FALSE. ! for all these fields, no large scale is usally available -LHORELAX_RR = .FALSE. ! for model 1 and for inner models, we only use surfacic -LHORELAX_RS = .FALSE. ! fiels ( no hor. relax. ) -LHORELAX_RI = .FALSE. -LHORELAX_RG = .FALSE. -LHORELAX_RH = .FALSE. -LHORELAX_TKE = .FALSE. -LHORELAX_SV(:) = .FALSE. -LHORELAX_SVC2R2 = .FALSE. -LHORELAX_SVC1R3 = .FALSE. -LHORELAX_SVELEC = .FALSE. -LHORELAX_SVLG = .FALSE. -LHORELAX_SVCHEM = .FALSE. -LHORELAX_SVCHIC = .FALSE. -LHORELAX_SVDST = .FALSE. -LHORELAX_SVSLT = .FALSE. -LHORELAX_SVPP = .FALSE. -LHORELAX_SVCS = .FALSE. -LHORELAX_SVAER = .FALSE. -! -LHORELAX_SVLIMA = .FALSE. -! -#ifdef MNH_FOREFIRE -LHORELAX_SVFF = .FALSE. -#endif -LHORELAX_SVSNW = .FALSE. -LHORELAX_SVFIRE = .FALSE. -! -! -!------------------------------------------------------------------------------- -! -!* 4. SET DEFAULT VALUES FOR MODD_NESTING : -! ----------------------------------- -! -IF (KMI == 1) THEN - NDAD(1)=1 - DO JM=2,JPMODELMAX - NDAD(JM) = JM - 1 - END DO - NDTRATIO(:) = 1 - XWAY(:) = 2. ! two-way interactive gridnesting - XWAY(1) = 0. ! except for model 1 -END IF -! -!------------------------------------------------------------------------------- -! -!* 5. SET DEFAULT VALUES FOR MODD_ADV_n : -! ---------------------------------- -! -CUVW_ADV_SCHEME = 'CEN4TH' -CMET_ADV_SCHEME = 'PPM_01' -CSV_ADV_SCHEME = 'PPM_01' -CTEMP_SCHEME = 'RKC4' -NWENO_ORDER = 3 -NSPLIT = 1 -LSPLIT_CFL = .TRUE. -LSPLIT_WENO = .TRUE. -XSPLIT_CFL = 0.8 -LCFL_WRIT = .FALSE. -! -!------------------------------------------------------------------------------- -! -!* 6. SET DEFAULT VALUES FOR MODD_PARAM_n : -! ----------------------------------- -! -CTURB = 'NONE' -CRAD = 'NONE' -CDCONV = 'NONE' -CSCONV = 'NONE' -CELEC = 'NONE' -CACTCCN = 'NONE' -! -!------------------------------------------------------------------------------- -! -!* 7. SET DEFAULT VALUES FOR MODD_LBC_n : -! --------------------------------- -! -CLBCX(1) ='CYCL' -CLBCX(2) ='CYCL' -CLBCY(1) ='CYCL' -CLBCY(2) ='CYCL' -NLBLX(:) = 1 -NLBLY(:) = 1 -XCPHASE = 20. -XCPHASE_PBL = 0. -XCARPKMAX = XUNDEF -XPOND = 1.0 -! -!------------------------------------------------------------------------------- -! -!* 8. SET DEFAULT VALUES FOR MODD_NUDGING_n : -! --------------------------------- -! -LNUDGING = .FALSE. -XTNUDGING = 21600. -! -!------------------------------------------------------------------------------- -! -!* 9. SET DEFAULT VALUES FOR MODD_BAKOUT and MODD_OUT_n : -! ------------------------------------------------ -! -! -! -!------------------------------------------------------------------------------- -! -!* 10. SET DEFAULT VALUES FOR MODD_TURB_n : -! ---------------------------------- -! -CALL TURBN_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, & - &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0) -!------------------------------------------------------------------------------- -! -!* 10a. SET DEFAULT VALUES FOR MODD_NEB_n : -! ---------------------------------- -! -CALL NEBN_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, & - &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0) -!------------------------------------------------------------------------------- -! -!* 10b. SET DEFAULT VALUES FOR MODD_DRAGTREE : -! ---------------------------------- -! -LDRAGTREE = .FALSE. -LDEPOTREE = .FALSE. -XVDEPOTREE = 0.02 ! 2 cm/s -!------------------------------------------------------------------------------ -! -!* 10b. SET DEFAULT VALUES FOR MODD_DRAGBLDG_n : -! ---------------------------------- -! -LDRAGBLDG = .FALSE. -LFLUXBLDG = .FALSE. -LDRAGURBVEG = .FALSE. -! -!* 10c. SET DEFAULT VALUES FOR MODD_COUPLING_LEVELS_n : -! ---------------------------------- -! -NLEV_COUPLE = 1 -!------------------------------------------------------------------------------ -! -!* 10c. SET DEFAULT VALUES FOR MODD_DRAGB -! ---------------------------------- -! -LDRAGBLDG = .FALSE. -! -!* 10d. SET DEFAULT VALUES FOR MODD_EOL* : -! ---------------------------------- -! -! 10d.i) MODD_EOL_MAIN -! -LMAIN_EOL = .FALSE. -CMETH_EOL = 'ADNR' -CSMEAR = '3LIN' -NMODEL_EOL = 1 -! -! 10d.ii) MODD_EOL_SHARED_IO -! -CFARM_CSVDATA = 'data_farm.csv' -CTURBINE_CSVDATA = 'data_turbine.csv' -CBLADE_CSVDATA = 'data_blade.csv' -CAIRFOIL_CSVDATA = 'data_airfoil.csv' -! -CINTERP = 'CLS' -! -! 10d.iii) MODD_EOL_ALM -! -NNB_BLAELT = 42 -LTIMESPLIT = .FALSE. -LTIPLOSSG = .TRUE. -LTECOUTPTS = .FALSE. -! -!------------------------------------------------------------------------------ -!* 10.e SET DEFAULT VALUES FOR MODD_ALLPROFILER_n : -! ---------------------------------- -! -NNUMB_PROF = 0 -XSTEP_PROF = 60.0 -XX_PROF(:) = XUNDEF -XY_PROF(:) = XUNDEF -XZ_PROF(:) = XUNDEF -XLAT_PROF(:) = XUNDEF -XLON_PROF(:) = XUNDEF -CNAME_PROF(:) = '' -CFILE_PROF = 'NO_INPUT_CSV' -LDIAG_SURFRAD_PROF = .TRUE. -!------------------------------------------------------------------------------ -!* 10.f SET DEFAULT VALUES FOR MODD_ALLSTATION_n : -! ---------------------------------- -! -NNUMB_STAT = 0 -XSTEP_STAT = 60.0 -XX_STAT(:) = XUNDEF -XY_STAT(:) = XUNDEF -XZ_STAT(:) = XUNDEF -XLAT_STAT(:) = XUNDEF -XLON_STAT(:) = XUNDEF -CNAME_STAT(:) = '' -CFILE_STAT = 'NO_INPUT_CSV' -LDIAG_SURFRAD_STAT = .TRUE. -! -!------------------------------------------------------------------------------- -! -!* 11. SET DEFAULT VALUES FOR MODD_BUDGET : -! ------------------------------------ -! -! 11.1 General budget variables -! -IF (KMI == 1) THEN - CBUTYPE = 'NONE' - NBUMOD = 1 - XBULEN = XSEGLEN - XBUWRI = XSEGLEN - NBUKL = 1 - NBUKH = 0 - LBU_KCP = .TRUE. -! -! 11.2 Variables for the cartesian box -! - NBUIL = 1 - NBUIH = 0 - NBUJL = 1 - NBUJH = 0 - LBU_ICP = .TRUE. - LBU_JCP = .TRUE. -! -! 11.3 Variables for the mask -! - NBUMASK = 1 -END IF -! -!------------------------------------------------------------------------------- -! -!* 12. SET DEFAULT VALUES FOR MODD_LES : -! --------------------------------- -! -IF (KMI == 1) THEN - LLES_MEAN = .FALSE. - LLES_RESOLVED = .FALSE. - LLES_SUBGRID = .FALSE. - LLES_UPDRAFT = .FALSE. - LLES_DOWNDRAFT = .FALSE. - LLES_SPECTRA = .FALSE. -! - NLES_LEVELS = NUNDEF - XLES_ALTITUDES = XUNDEF - NSPECTRA_LEVELS = NUNDEF - XSPECTRA_ALTITUDES = XUNDEF - NLES_TEMP_SERIE_I = NUNDEF - NLES_TEMP_SERIE_J = NUNDEF - NLES_TEMP_SERIE_Z = NUNDEF - CLES_NORM_TYPE = 'NONE' - CBL_HEIGHT_DEF = 'KE' - XLES_TEMP_SAMPLING = XUNDEF - XLES_TEMP_MEAN_START = XUNDEF - XLES_TEMP_MEAN_END = XUNDEF - XLES_TEMP_MEAN_STEP = 3600. - LLES_CART_MASK = .FALSE. - NLES_IINF = NUNDEF - NLES_ISUP = NUNDEF - NLES_JINF = NUNDEF - NLES_JSUP = NUNDEF - LLES_NEB_MASK = .FALSE. - LLES_CORE_MASK = .FALSE. - LLES_MY_MASK = .FALSE. - NLES_MASKS_USER = NUNDEF - LLES_CS_MASK = .FALSE. - - LLES_PDF = .FALSE. - NPDF = 1 - XTH_PDF_MIN = 270. - XTH_PDF_MAX = 350. - XW_PDF_MIN = -10. - XW_PDF_MAX = 10. - XTHV_PDF_MIN = 270. - XTHV_PDF_MAX = 350. - XRV_PDF_MIN = 0. - XRV_PDF_MAX = 20. - XRC_PDF_MIN = 0. - XRC_PDF_MAX = 1. - XRR_PDF_MIN = 0. - XRR_PDF_MAX = 1. - XRI_PDF_MIN = 0. - XRI_PDF_MAX = 1. - XRS_PDF_MIN = 0. - XRS_PDF_MAX = 1. - XRG_PDF_MIN = 0. - XRG_PDF_MAX = 1. - XRT_PDF_MIN = 0. - XRT_PDF_MAX = 20. - XTHL_PDF_MIN = 270. - XTHL_PDF_MAX = 350. -END IF -! -!------------------------------------------------------------------------------- -! -!* 13. SET DEFAULT VALUES FOR MODD_PARAM_RAD_n : -! --------------------------------------- -! -XDTRAD = XTSTEP -XDTRAD_CLONLY = XTSTEP -LCLEAR_SKY =.FALSE. -NRAD_COLNBR = 1000 -NRAD_DIAG = 0 -CLW ='RRTM' -CAER='SURF' -CAOP='CLIM' -CEFRADL='MART' -CEFRADI='LIOU' -COPWSW = 'FOUQ' -COPISW = 'EBCU' -COPWLW = 'SMSH' -COPILW = 'EBCU' -XFUDG = 1. -LAERO_FT=.FALSE. -LFIX_DAT=.FALSE. -! -#ifdef MNH_ECRAD -!* 13bis. SET DEFAULT VALUES FOR MODD_PARAM_ECRAD_n : -! --------------------------------------- -! -#if ( VER_ECRAD == 101 ) -NSWSOLVER = 0 ! 0: 'McICA 1: 'SPARTACUS' 2: 'SPARTACUS' + 3D effect -NLWSOLVER = 0 ! 0: 'McICA 1: 'SPARTACUS' 2: 'SPARTACUS' + 3D effect -#endif -#if ( VER_ECRAD == 140 ) -LSPEC_ALB = .FALSE. -LSPEC_EMISS = .FALSE. - - -!ALLOCATE(USER_ALB_DIFF(NSWB_MNH)) -!ALLOCATE(USER_ALB_DIR(NSWB_MNH)) -!ALLOCATE(USER_EMISS(NLWB_MNH)) -!PRINT*,USER_ALB_DIFF -!USER_ALB_DIFF = (/0,0,0,0,0,0,0,0,0,0,0,0,0,0/) -!USER_ALB_DIR = (/0,0,0,0,0,0,0,0,0,0,0,0,0,0/) -!USER_EMISS = (/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0/) -SURF_TYPE="SNOW" - -NLWSOLVER = 1 ! 0: 'McICA 1: 'SPARTACUS' 2: 'SPARTACUS' + 3D effect -NSWSOLVER = 1 ! 0: 'McICA 1: 'SPARTACUS' 2: 'SPARTACUS' + 3D effect -#endif -! LEFF3D = .TRUE. -! LSIDEM = .TRUE. -NREG = 3 ! Number of cloudy regions (3=TripleClouds) -! LLWCSCA = .TRUE. ! LW cloud scattering -! LLWASCA = .TRUE. ! LW aerosols scattering -NLWSCATTERING = 2 -NAERMACC = 0 -! CGAS = 'RRTMG-IFS' ! Gas optics model -NOVLP = 1 ! overlap assumption ; 0= 'Max-Ran' ; 1= 'Exp-Ran'; 2 = 'Exp-Exp' -NLIQOPT = 3 ! 1: 'Monochromatic', 2: 'HuStamnes', 3: 'SOCRATES', 4: 'Slingo' -NICEOPT = 3 ! 1: 'Monochromatic', 2: 'Fu-PSRAD', 3: 'Fu-IFS', 4: 'Baran', 5: 'Baran2016', 6: 'Baran2017' -! LSW_ML_E = .FALSE. -! LLW_ML_E = .FALSE. -! LPSRAD = .FALSE. -! -NRADLP = 1 ! 0: ERA-15, 1: Zhang and Rossow, 2: Martin (1994) et Woods (2000) -NRADIP = 1 ! 0: 40 mum, 1: Liou and Ou (1994), 2: Liou and Ou (1994) improved, 3: Sun and Rikus (1999) -XCLOUD_FRAC_STD = 1.0_JPRB ! change to 0.75 for more realistic distribution -#endif -!------------------------------------------------------------------------------- -! -!* 14. SET DEFAULT VALUES FOR MODD_BLANK_n : -! ----------------------------------- -! -XDUMMY1 = 0. -XDUMMY2 = 0. -XDUMMY3 = 0. -XDUMMY4 = 0. -XDUMMY5 = 0. -XDUMMY6 = 0. -XDUMMY7 = 0. -XDUMMY8 = 0. -! -NDUMMY1 = 0 -NDUMMY2 = 0 -NDUMMY3 = 0 -NDUMMY4 = 0 -NDUMMY5 = 0 -NDUMMY6 = 0 -NDUMMY7 = 0 -NDUMMY8 = 0 -! -LDUMMY1 = .TRUE. -LDUMMY2 = .TRUE. -LDUMMY3 = .TRUE. -LDUMMY4 = .TRUE. -LDUMMY5 = .TRUE. -LDUMMY6 = .TRUE. -LDUMMY7 = .TRUE. -LDUMMY8 = .TRUE. -! -CDUMMY1 = ' ' -CDUMMY2 = ' ' -CDUMMY3 = ' ' -CDUMMY4 = ' ' -CDUMMY5 = ' ' -CDUMMY6 = ' ' -CDUMMY7 = ' ' -CDUMMY8 = ' ' -! -!------------------------------------------------------------------------------ -! -!* 15. SET DEFAULT VALUES FOR MODD_FRC : -! --------------------------------- -! -IF (KMI == 1) THEN - LGEOST_UV_FRC = .FALSE. - LGEOST_TH_FRC = .FALSE. - LTEND_THRV_FRC = .FALSE. - LTEND_UV_FRC = .FALSE. - LVERT_MOTION_FRC = .FALSE. - LRELAX_THRV_FRC = .FALSE. - LRELAX_UV_FRC = .FALSE. - LRELAX_UVMEAN_FRC = .FALSE. - XRELAX_TIME_FRC = 10800. - XRELAX_HEIGHT_FRC = 0. - CRELAX_HEIGHT_TYPE = "FIXE" - LTRANS = .FALSE. - XUTRANS = 0.0 - XVTRANS = 0.0 - LPGROUND_FRC = .FALSE. - LDEEPOC = .FALSE. - XCENTX_OC = 16000. - XCENTY_OC = 16000. - XRADX_OC = 8000. - XRADY_OC = 8000. -END IF -! -!------------------------------------------------------------------------------- -! -! -!* 16. SET DEFAULT VALUES FOR MODD_PARAM_ICE : -! --------------------------------------- -! -CALL PARAM_ICEN_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, & - &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0) -! -!------------------------------------------------------------------------------- -! -! -!* 17. SET DEFAULT VALUES FOR MODD_PARAM_KAFR_n : -! -------------------------------------------- -! -XDTCONV = MAX( 300.0,XTSTEP ) -NICE = 1 -LREFRESH_ALL = .TRUE. -LCHTRANS = .FALSE. -LDOWN = .TRUE. -LSETTADJ = .FALSE. -XTADJD = 3600. -XTADJS = 10800. -LDIAGCONV = .FALSE. -NENSM = 0 -! -!------------------------------------------------------------------------------- -! -! -!* 18. SET DEFAULT VALUES FOR MODD_PARAM_MFSHALL_n : -! -------------------------------------------- -! -CALL PARAM_MFSHALLN_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, & - &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0) -! -!------------------------------------------------------------------------------- -! -!* 19. SET DEFAULT VALUES FOR MODD_PARAM_C2R2 : -! ---------------------------------------- -! -IF (KMI == 1) THEN - XNUC = 1.0 - XALPHAC = 3.0 - XNUR = 2.0 - XALPHAR = 1.0 -! - LRAIN = .TRUE. - LSEDC = .TRUE. - LACTIT = .FALSE. - LSUPSAT = .FALSE. - LDEPOC = .FALSE. - XVDEPOC = 0.02 ! 2 cm/s - LACTTKE = .TRUE. -! - HPARAM_CCN = 'XXX' - HINI_CCN = 'XXX' - HTYPE_CCN = 'X' -! - XCHEN = 0.0 - XKHEN = 0.0 - XMUHEN = 0.0 - XBETAHEN = 0.0 -! - XCONC_CCN = 0.0 - XAERDIFF = 0.0 - XAERHEIGHT = 2000 - XR_MEAN_CCN = 0.0 - XLOGSIG_CCN = 0.0 - XFSOLUB_CCN = 1.0 - XACTEMP_CCN = 280. -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 19.BIS SET DEFAULT VALUES FOR MODD_PARAM_LIMA : -! ---------------------------------------- -! -IF (KMI == 1) THEN - CALL PARAM_LIMA_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, & - &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0) -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 20. SET DEFAULT VALUES FOR MODD_CH_MNHC_n -! ------------------------------------- -! -LUSECHEM = .FALSE. -LUSECHAQ = .FALSE. -LUSECHIC = .FALSE. -LCH_INIT_FIELD = .FALSE. -LCH_CONV_SCAV = .FALSE. -LCH_CONV_LINOX = .FALSE. -LCH_PH = .FALSE. -LCH_RET_ICE = .FALSE. -XCH_PHINIT = 5.2 -XRTMIN_AQ = 5.e-8 -CCHEM_INPUT_FILE = 'MNHC.input' -CCH_TDISCRETIZATION = 'SPLIT' -NCH_SUBSTEPS = 1 -LCH_TUV_ONLINE = .FALSE. -CCH_TUV_LOOKUP = 'PHOTO.TUV39' -CCH_TUV_CLOUDS = 'NONE' -XCH_TUV_ALBNEW = -1. -XCH_TUV_DOBNEW = -1. -XCH_TUV_TUPDATE = 600. -CCH_VEC_METHOD = 'MAX' -NCH_VEC_LENGTH = 50 -XCH_TS1D_TSTEP = 600. -CCH_TS1D_COMMENT = 'no comment' -CCH_TS1D_FILENAME = 'IO1D' -CSPEC_PRODLOSS = '' -CSPEC_BUDGET = '' -! -!------------------------------------------------------------------------------- -! -!* 21. SET DEFAULT VALUES FOR MODD_SERIES AND MODD_SERIE_n -! --------------------------------------------------- -! -IF (KMI == 1) THEN - LSERIES = .FALSE. - LMASKLANDSEA = .FALSE. - LWMINMAX = .FALSE. - LSURF = .FALSE. -ENDIF -! -NIBOXL = 1 !+ JPHEXT -NIBOXH = 1 !+ 2*JPHEXT -NJBOXL = 1 !+ JPHEXT -NJBOXH = 1 !+ 2*JPHEXT -NKCLS = 1 !+ JPVEXT -NKLOW = 1 !+ JPVEXT -NKMID = 1 !+ JPVEXT -NKUP = 1 !+ JPVEXT -NKCLA = 1 !+ JPVEXT -NBJSLICE = 1 -NJSLICEL(:) = 1 !+ JPHEXT -NJSLICEH(:) = 1 !+ 2*JPHEXT -NFREQSERIES = INT(XSEGLEN /(100.*XTSTEP) ) -NFREQSERIES = MAX(NFREQSERIES,1) -! -!------------------------------------------------------------------------------- -! -!* 22. SET DEFAULT VALUES FOR MODD_MEAN_FIELD -! -------------------------------------- -! -IF (KMI == 1) THEN - LMEAN_FIELD = .FALSE. - LCOV_FIELD = .FALSE. -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 22. SET DEFAULT VALUES FOR MODD_AEROSOL -! ----------------------------------- -IF (KMI == 1) THEN ! other values are defined in modd_ch_aerosol -! -! aerosol lognormal parameterization - -LVARSIGI = .FALSE. ! switch to active pronostic dispersion for I mode -LVARSIGJ = .FALSE. ! switch to active pronostic dispersion for J mode -LHETEROSO4 = .FALSE. ! switch to active sulfates heteronegeous - ! production -LSEDIMAERO = .FALSE. ! switch to active aerosol sedimentation -LAERINIT = .FALSE. ! switch to initialize aerosol in arome -CMINERAL = "EQSAM" ! mineral equilibrium scheme -CORGANIC = "MPMPO" ! mineral equilibrium scheme -CNUCLEATION = "NONE" ! sulfates nucleation scheme -LDEPOS_AER(:) = .FALSE. - -ENDIF - -!* 23. SET DEFAULT VALUES FOR MODD_DUST and MODD_SALT -! ---------------------------------------------- -! -IF (KMI == 1) THEN ! other values initialized in modd_dust - LDUST = .FALSE. - NMODE_DST = 3 - LVARSIG = .FALSE. - LSEDIMDUST = .FALSE. - LDEPOS_DST(:) = .FALSE. - - LSALT = .FALSE. - LVARSIG_SLT= .FALSE. - LSEDIMSALT = .FALSE. - LDEPOS_SLT(:) = .FALSE. -ENDIF -! -!------------------------------------------------------------------------------- -! -! -!* 24. SET DEFAULT VALUES FOR MODD_PASPOL -! ---------------------------------- -! -! other values initialized in modd_paspol -! -IF (KMI == 1) THEN - LPASPOL = .FALSE. - NRELEASE = 0 - CPPINIT(:) ='1PT' - XPPLAT(:) = 0. - XPPLON (:) = 0. - XPPMASS(:) = 0. - XPPBOT(:) = 0. - XPPTOP(:) = 0. - CPPT1(:) = "20010921090000" - CPPT2(:) = "20010921090000" - CPPT3(:) = "20010921091500" - CPPT4(:) = "20010921091500" -ENDIF -! -!------------------------------------------------------------------------------- -! -! -!* 25. SET DEFAULT VALUES FOR MODD_CONDSAMP -! ---------------------------------- -! -! other values initialized in modd_condsamp -! -IF (KMI == 1) THEN - LCONDSAMP = .FALSE. - NCONDSAMP = 3 - XRADIO(:) = 900. - XSCAL(:) = 1. - XHEIGHT_BASE = 100. - XDEPTH_BASE = 100. - XHEIGHT_TOP = 100. - XDEPTH_TOP = 100. - NFINDTOP = 0 - XTHVP = 0.25 - LTPLUS = .TRUE. -ENDIF -!------------------------------------------------------------------------------- -! -! -!* 26. SET DEFAULT VALUES FOR MODD_LATZ_EDFLX -! ---------------------------------- -! -IF (KMI == 1) THEN - LUV_FLX=.FALSE. - XUV_FLX1=3.E+14 - XUV_FLX2=0. - LTH_FLX=.FALSE. - XTH_FLX=0.75 -ENDIF -#ifdef MNH_FOREFIRE -!------------------------------------------------------------------------------- -! -!* 27. SET DEFAULT VALUES FOR MODD_FOREFIRE -! ---------------------------------- -! -! other values initialized in modd_forefire -! -IF (KMI == 1) THEN - LFOREFIRE = .FALSE. - LFFCHEM = .FALSE. - COUPLINGRES = 100. - NFFSCALARS = 0 -ENDIF -#endif -!------------------------------------------------------------------------------- -! -!* 28. SET DEFAULT VALUES FOR MODD_BLOWSNOW AND MODD_BLOWSNOW_n -! ---------------------------------------- -! -IF (KMI == 1) THEN - LBLOWSNOW = .FALSE. - XALPHA_SNOW = 3. - XRSNOW = 4. - CSNOWSEDIM = 'TABC' -END IF -LSNOWSUBL = .FALSE. -! -! -!------------------------------------------------------------------------------- -! -!* 29. SET DEFAULT VALUES FOR MODD_VISC -! ---------------------------------- -! -! other values initialized in modd_VISC -! -IF (KMI == 1) THEN - LVISC = .FALSE. - LVISC_UVW = .FALSE. - LVISC_TH = .FALSE. - LVISC_SV = .FALSE. - LVISC_R = .FALSE. - XMU_V = 0. - XPRANDTL = 0. -ENDIF -! -!------------------------------------------------------------------------------- -! -! -!* 30. SET DEFAULT VALUES FOR MODD_DRAG -! ---------------------------------- -! -! other values initialized in modd_DRAG -! -IF (KMI == 1) THEN - LDRAG = .FALSE. - LMOUNT = .FALSE. - NSTART = 1 - XHSTART = 0. -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 31. SET DEFAULT VALUES FOR MODD_IBM_PARAMn -! -------------------------------------- -! - LIBM = .FALSE. - LIBM_TROUBLE = .FALSE. - CIBM_ADV = 'NOTHIN' - XIBM_EPSI = 1.E-9 - XIBM_IEPS = 1.E+9 - NIBM_ITR = 8 - XIBM_RUG = 0.01 ! (m^1.s^-0) - XIBM_VISC = 1.56e-5 ! (m^2.s^-1) - XIBM_CNU = 0.06 ! (m^0.s^-0) - - NIBM_LAYER_P = 2 - NIBM_LAYER_Q = 2 - NIBM_LAYER_R = 2 - NIBM_LAYER_S = 2 - NIBM_LAYER_T = 2 - NIBM_LAYER_E = 2 - NIBM_LAYER_V = 2 - - XIBM_RADIUS_P = 2. - XIBM_RADIUS_Q = 2. - XIBM_RADIUS_R = 2. - XIBM_RADIUS_S = 2. - XIBM_RADIUS_T = 2. - XIBM_RADIUS_E = 2. - XIBM_RADIUS_V = 2. - - XIBM_POWERS_P = 1. - XIBM_POWERS_Q = 1. - XIBM_POWERS_R = 1. - XIBM_POWERS_S = 1. - XIBM_POWERS_T = 1. - XIBM_POWERS_E = 1. - XIBM_POWERS_V = 1. - - CIBM_MODE_INTE3_P = 'LAI' - CIBM_MODE_INTE3_Q = 'LAI' - CIBM_MODE_INTE3_R = 'LAI' - CIBM_MODE_INTE3_S = 'LAI' - CIBM_MODE_INTE3_T = 'LAI' - CIBM_MODE_INTE3_E = 'LAI' - CIBM_MODE_INTE3_V = 'LAI' - - CIBM_MODE_INTE1_P = 'CL2' - CIBM_MODE_INTE1_Q = 'CL2' - CIBM_MODE_INTE1_R = 'CL2' - CIBM_MODE_INTE1_S = 'CL2' - CIBM_MODE_INTE1_T = 'CL2' - CIBM_MODE_INTE1_E = 'CL2' - CIBM_MODE_INTE1NV = 'CL2' - CIBM_MODE_INTE1TV = 'CL2' - CIBM_MODE_INTE1CV = 'CL2' - - CIBM_MODE_BOUND_P = 'SYM' - CIBM_MODE_BOUND_Q = 'SYM' - CIBM_MODE_BOUND_R = 'SYM' - CIBM_MODE_BOUND_S = 'SYM' - CIBM_MODE_BOUND_T = 'SYM' - CIBM_MODE_BOUND_E = 'SYM' - CIBM_MODE_BOUNT_V = 'ASY' - CIBM_MODE_BOUNN_V = 'ASY' - CIBM_MODE_BOUNC_V = 'ASY' - - XIBM_FORC_BOUND_P = 0. - XIBM_FORC_BOUND_Q = 0. - XIBM_FORC_BOUND_R = 0. - XIBM_FORC_BOUND_S = 0. - XIBM_FORC_BOUND_T = 0. - XIBM_FORC_BOUND_E = 0. - XIBM_FORC_BOUNN_V = 0. - XIBM_FORC_BOUNT_V = 0. - XIBM_FORC_BOUNC_V = 0. - - CIBM_TYPE_BOUND_P = 'NEU' - CIBM_TYPE_BOUND_Q = 'NEU' - CIBM_TYPE_BOUND_R = 'NEU' - CIBM_TYPE_BOUND_S = 'NEU' - CIBM_TYPE_BOUND_T = 'NEU' - CIBM_TYPE_BOUND_E = 'NEU' - CIBM_TYPE_BOUNT_V = 'DIR' - CIBM_TYPE_BOUNN_V = 'DIR' - CIBM_TYPE_BOUNC_V = 'DIR' - - CIBM_FORC_BOUND_P = 'CST' - CIBM_FORC_BOUND_Q = 'CST' - CIBM_FORC_BOUND_R = 'CST' - CIBM_FORC_BOUND_S = 'CST' - CIBM_FORC_BOUND_T = 'CST' - CIBM_FORC_BOUND_E = 'CST' - CIBM_FORC_BOUNN_V = 'CST' - CIBM_FORC_BOUNT_V = 'CST' - CIBM_FORC_BOUNC_V = 'CST' - CIBM_FORC_BOUNR_V = 'CST' - -! -!------------------------------------------------------------------------------- -! -!* 32. SET DEFAULT VALUES FOR MODD_RECYCL_PARAMn -! -------------------------------------- -! - LRECYCL = .FALSE. - LRECYCLN = .FALSE. - LRECYCLW = .FALSE. - LRECYCLE = .FALSE. - LRECYCLS = .FALSE. - XDRECYCLN = 0. - XARECYCLN = 0. - XDRECYCLW = 0. - XARECYCLW = 0. - XDRECYCLS = 0. - XARECYCLS = 0. - XDRECYCLE = 0. - XARECYCLE = 0. - NTMOY = 0 - NTMOYCOUNT = 0 - NNUMBELT = 28 - XRCOEFF = 0.2 - XTBVTOP = 500. - XTBVBOT = 300. -! -!------------------------------------------------------------------------------- -! -!* 33. SET DEFAULT VALUES FOR MODD_FIRE_n -! ---------------------------------- -! -! Blaze fire model namelist -! -LBLAZE = .FALSE. ! Flag for Fire model use, default FALSE -! -CPROPAG_MODEL = 'SANTONI2011' ! Fire propagation model (default SANTONI2011) -! -CHEAT_FLUX_MODEL = 'EXS' ! Sensible heat flux injection model (default EXS) -CLATENT_FLUX_MODEL = 'EXP' ! latent heat flux injection model (default EXP) -XFERR = 0.8 ! Energy released in flamming stage (only for EXP) -! -CFIRE_CPL_MODE = '2WAYCPL' ! Coupling mode (default 2way coupled) -CBMAPFILE = CINIFILE ! File name of BMAP for FIR2ATM mode -LINTERPWIND = .TRUE. ! Horizontal interpolation of wind -LSGBAWEIGHT = .FALSE. ! Flag for use of weighted average method for SubGrid Burning Area computation -! -NFIRE_WENO_ORDER = 3 ! Weno order (1,3,5) -NFIRE_RK_ORDER = 3 ! Runge Kutta order (1,2,3,4) -! -NREFINX = 1 ! Refinement ratio X -NREFINY = 1 ! Refinement ratio Y -! -XCFLMAXFIRE = 0.8 ! Max CFL on fire mesh -XLSDIFFUSION = 0.1 ! Numerical diffusion of LevelSet -XROSDIFFUSION = 0.05 ! Numerical diffusion of ROS -! -XFLUXZEXT = 3. ! Flux distribution on vertical caracteristic length -XFLUXZMAX = 4. * XFLUXZEXT ! Flux distribution on vertical max injetion height -! -XFLXCOEFTMP = 1. ! Flux multiplicator. For testing -! -LWINDFILTER = .FALSE. ! Fire wind filtering flag -CWINDFILTER = 'EWAM' ! Wind filter method (EWAM or WLIM) -XEWAMTAU = 20. ! Time averaging constant for EWAM method (s) -XWLIMUTH = 8. ! Thresehold wind value for WLIM method (m/s) -XWLIMUTMAX = 9. ! Maximum wind value for WLIM method (m/s) (needs to be >= XWLIMUTH ) -! -NNBSMOKETRACER = 1 ! Nb of smoke tracers -! -NWINDSLOPECPLMODE = 0 ! Flag for use of wind/slope in ROS (0 = wind + slope, 1 = wind only, 2 = slope only (U0=0)) -! -! -! -!! DO NOT CHANGE BELOW PARAMETERS -XFIREMESHSIZE(:) = 0. ! Fire mesh size (dxf,dyf) -LRESTA_ASE = .FALSE. ! Flag for using ASE in RESTA file -LRESTA_AWC = .FALSE. ! Flag for using AWC in RESTA file -LRESTA_EWAM = .FALSE. ! Flag for using EWAM in RESTA file -LRESTA_WLIM = .FALSE. ! Flag for using WLIM in RESTA file - -!------------------------------------------------------------------------------- -END SUBROUTINE DEFAULT_DESFM_n diff --git a/src/PHYEX/ext/diagnos_les_mf.f90 b/src/PHYEX/ext/diagnos_les_mf.f90 deleted file mode 100644 index 665d1ea76..000000000 --- a/src/PHYEX/ext/diagnos_les_mf.f90 +++ /dev/null @@ -1,244 +0,0 @@ -!MNH_LIC Copyright 2009-2020 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ########################### - MODULE MODI_DIAGNOS_LES_MF -! ########################### -! -INTERFACE -! -! ################################################################# - SUBROUTINE DIAGNOS_LES_MF(KIU,KJU,KKU,PTIME_LES, & - PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & - PU_UP, PV_UP, PTHV_UP, PW_UP, & - PFRAC_UP,PEMF,PDETR,PENTR, & - PWTHMF,PWTHVMF,PWRTMF, & - PWUMF,PWVMF, & - KKLCL,KKETL,KKCTL) -! ################################################################# -! -!* 1.1 Declaration of Arguments -! -use modd_precision, only: MNHTIME -! -INTEGER, INTENT(IN) :: KIU, KJU, KKU ! 3D grid size -REAL(kind=MNHTIME), DIMENSION(2), INTENT(OUT) :: PTIME_LES -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHL_UP,PRT_UP,PRV_UP,& - PRC_UP,PRI_UP ! updraft properties -REAL, DIMENSION(:,:,:), INTENT(IN) :: PU_UP, PV_UP -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHV_UP,PW_UP,& - PFRAC_UP,PEMF,PDETR,PENTR -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWTHMF,PWTHVMF,PWRTMF, & - PWUMF,PWVMF -INTEGER, DIMENSION(:), INTENT(IN) :: KKLCL,KKETL,KKCTL - - -END SUBROUTINE DIAGNOS_LES_MF - -END INTERFACE -! -END MODULE MODI_DIAGNOS_LES_MF -! -! ################################################################# - SUBROUTINE DIAGNOS_LES_MF(KIU,KJU,KKU,PTIME_LES, & - PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & - PU_UP, PV_UP, PTHV_UP, PW_UP, & - PFRAC_UP,PEMF,PDETR,PENTR, & - PWTHMF,PWTHVMF,PWRTMF, & - PWUMF,PWVMF, & - KKLCL,KKETL,KKCTL) -! ################################################################# -!! -!!**** *DIAGNOS_LES_MF* - Edit in File the updraft properties as -!! LES diagnostics -!! -!! PURPOSE -!! ------- -!!**** The purpose of this routine is to write updraft variable as -!! LES diagnostics -! -!!** METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! J.pergaud -! -! Modifications: -! V. Masson 09/2010: Optimization -! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_LES -use modd_precision, only: MNHTIME -! -USE MODE_MNH_TIMING -! -USE MODI_LES_VER_INT -USE MODI_LES_MEAN_ll -USE MODI_SHUMAN -! -IMPLICIT NONE - -!* 0.1 Declaration of Arguments -! -! -INTEGER, INTENT(IN) :: KIU, KJU, KKU ! 3D grid size -REAL(kind=MNHTIME), DIMENSION(2), INTENT(OUT) :: PTIME_LES -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHL_UP,PRT_UP,PRV_UP,& - PRC_UP,PRI_UP ! updraft properties -REAL, DIMENSION(:,:,:), INTENT(IN) :: PU_UP, PV_UP -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHV_UP,PW_UP,& - PFRAC_UP,PEMF,PDETR,PENTR -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWTHMF,PWTHVMF,PWRTMF, & - PWUMF,PWVMF -INTEGER, DIMENSION(:), INTENT(IN) :: KKLCL,KKETL,KKCTL - -! -! -! 0.2 Declaration of local variables -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHLMFFLX_LES,ZRTMFFLX_LES, & - ZTHVMFFLX_LES,ZUMFFLX_LES, & - ZVMFFLX_LES -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHLUP_MF_LES,ZRTUP_MF_LES, & - ZRCUP_MF_LES,ZEMF_MF_LES, & - ZDETR_MF_LES, ZENTR_MF_LES, & - ZWUP_MF_LES,ZFRACUP_MF_LES, & - ZTHVUP_MF_LES,ZRVUP_MF_LES, & - ZRIUP_MF_LES -REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME1, ZTIME2 -!------------------------------------------------------------------------ -! - -CALL SECOND_MNH2(ZTIME1) - - IF (LLES_CALL) THEN - - ALLOCATE( ZTHLUP_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZRTUP_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZRVUP_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZRCUP_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZRIUP_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZEMF_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZDETR_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZENTR_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZWUP_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZFRACUP_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZTHVUP_MF_LES(KIU,KJU,NLES_K) ) - - ALLOCATE( ZTHLMFFLX_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZRTMFFLX_LES (KIU,KJU,NLES_K) ) - ALLOCATE( ZTHVMFFLX_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZUMFFLX_LES (KIU,KJU,NLES_K) ) - ALLOCATE( ZVMFFLX_LES (KIU,KJU,NLES_K) ) - - - CALL LES_VER_INT(MZF(PWTHMF) ,ZTHLMFFLX_LES ) - CALL LES_MEAN_ll(ZTHLMFFLX_LES,LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_WTHLMF(:,NLES_CURRENT_TCOUNT,1)) - - CALL LES_VER_INT( MZF(PWRTMF) ,ZRTMFFLX_LES ) - CALL LES_MEAN_ll (ZRTMFFLX_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_WRTMF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PWUMF) ,ZUMFFLX_LES ) - CALL LES_MEAN_ll (ZUMFFLX_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_WUMF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PWVMF) ,ZVMFFLX_LES ) - CALL LES_MEAN_ll (ZVMFFLX_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_WVMF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PWTHVMF) ,ZTHVMFFLX_LES ) - CALL LES_MEAN_ll (ZTHVMFFLX_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,1) ) - - - CALL LES_VER_INT( MZF(PTHL_UP) ,ZTHLUP_MF_LES ) - CALL LES_MEAN_ll (ZTHLUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_THLUP_MF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PRT_UP) ,ZRTUP_MF_LES ) - CALL LES_MEAN_ll (ZRTUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_RTUP_MF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PRV_UP) ,ZRVUP_MF_LES ) - CALL LES_MEAN_ll (ZRVUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_RVUP_MF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PRC_UP) ,ZRCUP_MF_LES ) - CALL LES_MEAN_ll (ZRCUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_RCUP_MF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PRI_UP) ,ZRIUP_MF_LES ) - CALL LES_MEAN_ll (ZRIUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_RIUP_MF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PEMF) ,ZEMF_MF_LES ) - CALL LES_MEAN_ll (ZEMF_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_MASSFLUX(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PDETR) ,ZDETR_MF_LES ) - CALL LES_MEAN_ll (ZDETR_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_DETR(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PENTR) ,ZENTR_MF_LES ) - CALL LES_MEAN_ll (ZENTR_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_ENTR(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PW_UP) ,ZWUP_MF_LES ) - CALL LES_MEAN_ll (ZWUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_WUP_MF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PFRAC_UP) ,ZFRACUP_MF_LES ) - CALL LES_MEAN_ll (ZFRACUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_FRACUP(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PTHV_UP) ,ZTHVUP_MF_LES ) - CALL LES_MEAN_ll (ZTHVUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_THVUP_MF(:,NLES_CURRENT_TCOUNT,1) ) - - - - DEALLOCATE( ZTHLMFFLX_LES ) - DEALLOCATE( ZRTMFFLX_LES ) - DEALLOCATE( ZTHVMFFLX_LES ) - DEALLOCATE( ZUMFFLX_LES ) - DEALLOCATE( ZVMFFLX_LES ) - - - DEALLOCATE( ZTHLUP_MF_LES ) - DEALLOCATE( ZRTUP_MF_LES ) - DEALLOCATE( ZRVUP_MF_LES ) - DEALLOCATE( ZRCUP_MF_LES ) - DEALLOCATE( ZRIUP_MF_LES ) - DEALLOCATE( ZENTR_MF_LES ) - DEALLOCATE( ZDETR_MF_LES ) - DEALLOCATE( ZEMF_MF_LES ) - DEALLOCATE( ZWUP_MF_LES ) - DEALLOCATE( ZFRACUP_MF_LES ) - DEALLOCATE( ZTHVUP_MF_LES ) - -ENDIF - -CALL SECOND_MNH2(ZTIME2) -PTIME_LES = ZTIME2 - ZTIME1 -XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 - -END SUBROUTINE DIAGNOS_LES_MF diff --git a/src/PHYEX/ext/endstep.f90 b/src/PHYEX/ext/endstep.f90 deleted file mode 100644 index 97734d72b..000000000 --- a/src/PHYEX/ext/endstep.f90 +++ /dev/null @@ -1,668 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ################### - MODULE MODI_ENDSTEP -! ################### -! -INTERFACE -! - SUBROUTINE ENDSTEP (PTSTEP,KRR,KSV,KTCOUNT,KMI, & - HUVW_ADV_SCHEME,HTEMP_SCHEME, PRHODJ, & - PUS,PVS,PWS,PDRYMASSS, & - PTHS,PRS,PTKES,PSVS, & - PLSUS,PLSVS,PLSWS, & - PLSTHS,PLSRVS,PLSZWSS, & - PLBXUS,PLBXVS,PLBXWS, & - PLBXTHS,PLBXRS,PLBXTKES,PLBXSVS, & - PLBYUS,PLBYVS,PLBYWS, & - PLBYTHS,PLBYRS,PLBYTKES,PLBYSVS, & - PUM,PVM,PWM,PZWS, & - PUT,PVT,PWT,PPABST,PDRYMASST, & - PTHT,PRT,PTHM,PRCM,PPABSM,PTKET,PSVT, & - PLSUM,PLSVM,PLSWM, & - PLSTHM,PLSRVM,PLSZWSM, & - PLBXUM,PLBXVM,PLBXWM, & - PLBXTHM,PLBXRM,PLBXTKEM,PLBXSVM, & - PLBYUM,PLBYVM,PLBYWM, & - PLBYTHM,PLBYRM,PLBYTKEM,PLBYSVM ) -! -REAL, INTENT(IN) :: PTSTEP ! Time step -INTEGER, INTENT(IN) :: KRR ! Number of water var. -INTEGER, INTENT(IN) :: KSV ! Number of scal. var. -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop COUNTer -INTEGER, INTENT(IN) :: KMI ! Model index -CHARACTER(LEN=6), INTENT(IN) :: HUVW_ADV_SCHEME ! advection scheme for wind -CHARACTER(LEN=4), INTENT(IN) :: HTEMP_SCHEME ! Temporal scheme -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (Rho) dry * Jacobian -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUS,PVS,PWS, & ! - PTHS,PTKES ! variables at -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRS,PSVS ! t+dt -! -REAL, INTENT(IN) :: PDRYMASSS ! Md source -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSUS,PLSVS,PLSWS,& ! Large Scale - PLSTHS,PLSRVS ! fields tendencies -! -REAL, DIMENSION(:,:), INTENT(IN) :: PLSZWSS ! Large Scale fields tendencies -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS, & ! - PLBXTHS,PLBXTKES ! LBX tendancy -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBXRS,PLBXSVS ! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYUS,PLBYVS,PLBYWS,& ! - PLBYTHS,PLBYTKES ! LBY tendancy -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRS,PLBYSVS ! -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUM,PVM,PWM! Variables at t-dt -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUT,PVT,PWT,PPABST,PTHT,&! - PTKET ! Variables at -REAL, DIMENSION(:,:,:,:),INTENT(INOUT):: PRT,PSVT ! t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHM, PRCM,PPABSM ! Variables at t-Dt -REAL, INTENT(INOUT):: PDRYMASST ! -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSUM,PLSVM,PLSWM,& ! Large Scale fields - PLSTHM,PLSRVM ! at t-dt -REAL, DIMENSION(:,:), INTENT(INOUT) :: PLSZWSM ! Large Scale fields at t-dt -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLBXUM,PLBXVM,PLBXWM, & ! - PLBXTHM,PLBXTKEM ! LBX fields -REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBXRM,PLBXSVM ! -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLBYUM,PLBYVM,PLBYWM, & ! - PLBYTHM,PLBYTKEM ! LBY fields -REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBYRM,PLBYSVM ! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PZWS ! significant wave height -! -END SUBROUTINE ENDSTEP -! -END INTERFACE -! -END MODULE MODI_ENDSTEP -! -! -! -! ###################################################################### - SUBROUTINE ENDSTEP (PTSTEP,KRR,KSV,KTCOUNT,KMI, & - HUVW_ADV_SCHEME,HTEMP_SCHEME, PRHODJ, & - PUS,PVS,PWS,PDRYMASSS, & - PTHS,PRS,PTKES,PSVS, & - PLSUS,PLSVS,PLSWS, & - PLSTHS,PLSRVS,PLSZWSS, & - PLBXUS,PLBXVS,PLBXWS, & - PLBXTHS,PLBXRS,PLBXTKES,PLBXSVS, & - PLBYUS,PLBYVS,PLBYWS, & - PLBYTHS,PLBYRS,PLBYTKES,PLBYSVS, & - PUM,PVM,PWM,PZWS, & - PUT,PVT,PWT,PPABST,PDRYMASST, & - PTHT,PRT,PTHM,PRCM,PPABSM,PTKET,PSVT, & - PLSUM,PLSVM,PLSWM, & - PLSTHM,PLSRVM,PLSZWSM, & - PLBXUM,PLBXVM,PLBXWM, & - PLBXTHM,PLBXRM,PLBXTKEM,PLBXSVM, & - PLBYUM,PLBYVM,PLBYWM, & - PLBYTHM,PLBYRM,PLBYTKEM,PLBYSVM ) -! ###################################################################### -! -!!**** *ENDSTEP* - temporal advance and asselin filter for all variables -!! (replaces the previous endstep_dyn and endstep_scalar subroutines) -!! -!! PURPOSE -!! ------- -!! -!! The purpose of ENDSTEP is to apply the asselin filter, perform -!! the time advance and thereby finalize the time step. -! -! -!!** METHOD -!! ------ -!! -!! The filtered values of the prognostic variables at t is obtained -!! by linear combination of variables at t-dt, t, and t+dt. -!! This value is put into the array containing the t-dt value. -!! To perform the time swapping, the t+dt values are put into the arrays -!! containing the t values. -!! -!! In case of cold start (first time step), indicated by the value 'START' -!! of CCONF in module MODD_CONF, a simple time advance is performed. -!! -!! The swapping for the absolute pressure function is only a copy of time t in -!! time (t-dt). -!! -!! Temporal advances of large scale, lateral boundarie and SST fields -!! are also made in this subroutine. -!! -!! The different sources terms are stored for the budget computations. -!! -!! EXTERNAL -!! -------- -!! BUDGET : Stores the different budget components -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! MODULE MODD_DYN containing XASSELIN -!! MODULE MODD_CONF containing CCONF -!! MODULE MODD_CTURB containing XTKEMIN, XEPSMIN -!! MODULE MODD_BUDGET: -!! NBUMOD : model in which budget is calculated -!! NBUTSHIFT : temporal shift for budgets writing -!! -!! REFERENCE -!! --------- -!! Book2 of documentation -!! -!! AUTHOR -!! ------ -!! P. Bougeault Meteo France -!! -!! MODIFICATIONS -!! ------------- -!! -!! original 22/06/94 -!! corrections 01/09/94 (J. P. Lafore) -!! " 07/11/94 (J.Stein) pressure function swapping -!! update 03/01/94 (J. P. Lafore) Total mass of dry air Md evolution -!! 20/03/95 (J.Stein ) remove R from the historical variables -!! + switch for TKE unused -!! 01/04/95 (Ph. Hereil J. Nicolau) add the budget computation -!! 30/08/95 (J.Stein) remove the positivity control and -!! correct the bug for PRM and PSVM for the cold start -!! 16/10/95 (J. Stein) change the budget calls -!! 12/10/96 (J. Stein) add the SRC temporal evolution -!! 20/12/96 (J.-P. Pinty) update the CALL BUDGET -!! 03/09/96 (J. P. Lafore) temporal advance of LS scalar fields -!! 22/06/97 (J. Stein) add the absolute pressure -!! 13/03/97 (J. P. Lafore) add "surfacic" LS fields -!! 24/09/97 (V. Masson) positive values for ls fields -!! 10/01/98 (J. Stein) use the LB fields -!! 20/04/98 (P. Josse) temporal evolution of SST -!! 18/09/98 (P. Jabouille) merge endstep_dyn and endstep_scalar -!! 08/12/00 (P. Jabouille) minimum values for hydrometeors -!! 22/06/01 (P. Jabouille) use XSVMIN -!! 06/11/02 (V. Masson) update the budget calls -!! 01/2004 (V. Masson) surface externalization -!! 05/2006 Remove KEPS -!! 10/2006 (Maric, Lac) modification for PPM schemes -!! 10/2009 (C.Lac) Correction on FIT temporal scheme for variables -!! advected with PPM -!! 04/2013 (C.Lac) FIT for all the variables -!! 04/2014 (C.Lac) Check on the positivity of PSVT -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! 02/2019 (S. Bielli) Sea salt : significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 02/2020: use the new data structures and subroutines for budgets -! P. Wautelet 02/2022: add sea salt -!------------------------------------------------------------------------------ -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n -use modd_budget, only: lbudget_u, lbudget_v, lbudget_w, lbudget_th, lbudget_tke, lbudget_rv, lbudget_rc, & - lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv, lbu_enable, & - NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_TKE, NBUDGET_RV, NBUDGET_RC, & - NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & - nbustep, tbudgets -USE MODD_CH_AEROSOL, ONLY: LORILAM -USE MODD_CONF -USE MODD_TURB_n, ONLY: XTKEMIN -USE MODD_DUST, ONLY: LDUST -USE MODD_SALT, ONLY: LSALT -USE MODD_DYN -USE MODD_GRID_n -USE MODD_LBC_n, ONLY: CLBCX, CLBCY -USE MODD_NSV, ONLY: XSVMIN, NSV_CHEMBEG, NSV_CHEMEND, & - NSV_AERBEG, NSV_AEREND,& - NSV_DSTBEG, NSV_DSTEND,& - NSV_SLTBEG, NSV_SLTEND,& - NSV_SNWBEG, NSV_SNWEND -USE MODD_PARAM_C2R2, ONLY: LACTIT -USE MODD_PARAM_LIMA, ONLY: LACTIT_LIMA=>LACTIT - -use mode_budget, only: Budget_store_end, Budget_store_init - -USE MODI_SHUMAN -! -USE MODE_ll -! -IMPLICIT NONE -! -!* 0.1 DECLARATIONS OF ARGUMENTS -! -! -REAL, INTENT(IN) :: PTSTEP ! Time step -INTEGER, INTENT(IN) :: KRR ! Number of water var. -INTEGER, INTENT(IN) :: KSV ! Number of scal. var. -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop COUNTer -INTEGER, INTENT(IN) :: KMI ! Model index -CHARACTER(LEN=6), INTENT(IN) :: HUVW_ADV_SCHEME ! advection scheme for wind -CHARACTER(LEN=4), INTENT(IN) :: HTEMP_SCHEME ! Temporal scheme -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (Rho) dry * Jacobian -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUS,PVS,PWS, & ! - PTHS,PTKES ! variables at -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRS,PSVS ! t+dt -! -REAL, INTENT(IN) :: PDRYMASSS ! Md source -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLSUS,PLSVS,PLSWS,& ! Large Scale - PLSTHS,PLSRVS ! fields tendencies -REAL, DIMENSION(:,:), INTENT(IN) :: PLSZWSS ! Large Scale fields tendencies -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS, & ! - PLBXTHS,PLBXTKES ! LBX tendancy -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBXRS,PLBXSVS ! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLBYUS,PLBYVS,PLBYWS,& ! - PLBYTHS,PLBYTKES ! LBY tendancy -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRS,PLBYSVS ! -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUM,PVM,PWM! Variables at t-dt -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUT,PVT,PWT,PPABST,PTHT,&! - PTKET ! Variables at -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHM, PRCM, PPABSM ! Variables at t-Dt -REAL, DIMENSION(:,:,:,:),INTENT(INOUT):: PRT,PSVT ! t -REAL, INTENT(INOUT):: PDRYMASST ! -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSUM,PLSVM,PLSWM,& ! Large Scale fields - PLSTHM,PLSRVM ! at t-dt -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PLSZWSM ! Large Scale fields at t-dt -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLBXUM,PLBXVM,PLBXWM, & ! - PLBXTHM,PLBXTKEM ! LBX fields -REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBXRM,PLBXSVM ! -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLBYUM,PLBYVM,PLBYWM, & ! - PLBYTHM,PLBYTKEM ! LBY fields -REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBYRM,PLBYSVM ! -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PZWS ! significant wave height -! -!* 0.2 DECLARATIONS OF LOCAL VARIABLES -! -INTEGER:: JSV ! loop counters -INTEGER :: IIB, IIE ! index of first and last inner mass points along x -INTEGER :: IJB, IJE ! index of first and last inner mass points along y -real, dimension(:,:,:), allocatable :: zrhodjontime -real, dimension(:,:,:), allocatable :: zwork -! -!------------------------------------------------------------------------------ -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -!* 1. ASSELIN FILTER -! -IF ((HUVW_ADV_SCHEME(1:3)=='CEN').AND. (HTEMP_SCHEME == 'LEFR')) THEN - IF( KTCOUNT /= 1 .OR. CCONF /= 'START' ) THEN - PUM(:,:,:)=(1.-XASSELIN)*PUT(:,:,:)+0.5*XASSELIN*(PUM(:,:,:)+PUS(:,:,:)) - PVM(:,:,:)=(1.-XASSELIN)*PVT(:,:,:)+0.5*XASSELIN*(PVM(:,:,:)+PVS(:,:,:)) - PWM(:,:,:)=(1.-XASSELIN)*PWT(:,:,:)+0.5*XASSELIN*(PWM(:,:,:)+PWS(:,:,:)) - END IF -END IF - -!* 1. TEMPORAL ADVANCE OF PROGNOSTIC VARIABLES -! -PPABSM(:,:,:) = PPABST(:,:,:) -! -IF (LACTIT .OR. LACTIT_LIMA) THEN - PTHM(:,:,:) = PTHT(:,:,:) - PRCM(:,:,:) = PRT(:,:,:,2) -END IF - -PUT(:,:,:)=PUS(:,:,:) -PVT(:,:,:)=PVS(:,:,:) -PWT(:,:,:)=PWS(:,:,:) -! -PDRYMASST = PDRYMASST + PTSTEP * PDRYMASSS -! -PTHT(:,:,:)=PTHS(:,:,:) -! -! Moisture -! -PRT(:,:,:,1:KRR)=PRS(:,:,:,1:KRR) -! -! Turbulence -! -IF (SIZE(PTKET,1) /= 0) PTKET(:,:,:)=PTKES(:,:,:) -! -! Other scalars -! -PSVT(:,:,:,1:KSV)=PSVS(:,:,:,1:KSV) -! -IF(LBLOWSNOW) THEN - DO JSV=1,(NBLOWSNOW_2D) - XSNWCANO(:,:,JSV) = XRSNWCANOS(:,:,JSV) - END DO -!* MINIMUM VALUE FOR BLOWING SNOW -! - WHERE(XSNWCANO(:,:,:)<1.E-20) - XSNWCANO(:,:,:)=0. - END WHERE - - IF (SIZE(PSVT,4) > 1) THEN - WHERE(PSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND)<1.E-20) - PSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND)=0. - END WHERE - END IF -! -END IF -! -IF (LWEST_ll( ) .AND. CLBCX(1)=='OPEN') THEN - DO JSV=1,KSV - PSVT(IIB,:,:,JSV)=MAX(PSVT(IIB,:,:,JSV),XSVMIN(JSV)) - PSVT(IIB-1,:,:,JSV)=MAX(PSVT(IIB-1,:,:,JSV),XSVMIN(JSV)) - END DO -END IF -! -IF (LEAST_ll( ) .AND. CLBCX(2)=='OPEN') THEN - DO JSV=1,KSV - PSVT(IIE,:,:,JSV)=MAX(PSVT(IIE,:,:,JSV),XSVMIN(JSV)) - PSVT(IIE+1,:,:,JSV)=MAX(PSVT(IIE+1,:,:,JSV),XSVMIN(JSV)) - END DO -END IF -! -IF (LSOUTH_ll( ) .AND. CLBCY(1)=='OPEN') THEN - DO JSV=1,KSV - PSVT(:,IJB,:,JSV)=MAX(PSVT(:,IJB,:,JSV),XSVMIN(JSV)) - PSVT(:,IJB-1,:,JSV)=MAX(PSVT(:,IJB-1,:,JSV),XSVMIN(JSV)) - END DO -END IF -! -IF (LNORTH_ll( ) .AND. CLBCY(2)=='OPEN') THEN - DO JSV=1,KSV - PSVT(:,IJE,:,JSV)=MAX(PSVT(:,IJE,:,JSV),XSVMIN(JSV)) - PSVT(:,IJE+1,:,JSV)=MAX(PSVT(:,IJE+1,:,JSV),XSVMIN(JSV)) - END DO -END IF -!------------------------------------------------------------------------------ -! -!* 4. TEMPORAL ADVANCE OF THE LARGE SCALE FIELDS -! -! -IF (SIZE(PLSUS,1) /= 0) THEN - PLSUM(:,:,:) = PLSUM(:,:,:) + PTSTEP * PLSUS(:,:,:) - PLSVM(:,:,:) = PLSVM(:,:,:) + PTSTEP * PLSVS(:,:,:) - PLSWM(:,:,:) = PLSWM(:,:,:) + PTSTEP * PLSWS(:,:,:) -END IF -! -IF (SIZE(PLSTHS,1) /= 0) THEN - PLSTHM(:,:,:) = PLSTHM(:,:,:) + PTSTEP * PLSTHS(:,:,:) -ENDIF -! -IF (SIZE(PLSRVS,1) /= 0) THEN - PLSRVM(:,:,:) = MAX( PLSRVM(:,:,:) + PTSTEP * PLSRVS(:,:,:) , 0.) -ENDIF - -IF (SIZE(PLSZWSS,1) /= 0) THEN - PLSZWSM(:,:) = MAX( PLSZWSM(:,:) + PTSTEP * PLSZWSS(:,:) , 0.) - PZWS(:,:) = PLSZWSM(:,:) -ENDIF -! -!------------------------------------------------------------------------------ -! -!* 5. TEMPORAL ADVANCE OF THE LATERAL BOUNDARIES FIELDS -! -IF (SIZE(PLBXUS,1) /= 0) THEN - PLBXUM(:,:,:) = PLBXUM(:,:,:) + PTSTEP * PLBXUS(:,:,:) - PLBXVM(:,:,:) = PLBXVM(:,:,:) + PTSTEP * PLBXVS(:,:,:) - PLBXWM(:,:,:) = PLBXWM(:,:,:) + PTSTEP * PLBXWS(:,:,:) -ENDIF -IF (SIZE(PLBYUS,1) /= 0) THEN - PLBYUM(:,:,:) = PLBYUM(:,:,:) + PTSTEP * PLBYUS(:,:,:) - PLBYVM(:,:,:) = PLBYVM(:,:,:) + PTSTEP * PLBYVS(:,:,:) - PLBYWM(:,:,:) = PLBYWM(:,:,:) + PTSTEP * PLBYWS(:,:,:) -ENDIF -! -IF (SIZE(PLBXTHS,1) /= 0) THEN - PLBXTHM(:,:,:) = PLBXTHM(:,:,:) + PTSTEP * PLBXTHS(:,:,:) -END IF -IF (SIZE(PLBYTHS,1) /= 0) THEN - PLBYTHM(:,:,:) = PLBYTHM(:,:,:) + PTSTEP * PLBYTHS(:,:,:) -END IF -! -IF (SIZE(PLBXTKES,1) /= 0) THEN - PLBXTKEM(:,:,:) = MAX( PLBXTKEM(:,:,:) + PTSTEP * PLBXTKES(:,:,:), XTKEMIN) -END IF -IF (SIZE(PLBYTKES,1) /= 0) THEN - PLBYTKEM(:,:,:) = MAX( PLBYTKEM(:,:,:) + PTSTEP * PLBYTKES(:,:,:), XTKEMIN) -END IF -! -IF (SIZE(PLBXRS,1) /= 0) THEN - PLBXRM(:,:,:,:) = MAX( PLBXRM(:,:,:,:) + PTSTEP * PLBXRS(:,:,:,:), 0.) -END IF -IF (SIZE(PLBYRS,1) /= 0) THEN - PLBYRM(:,:,:,:) = MAX( PLBYRM(:,:,:,:) + PTSTEP * PLBYRS(:,:,:,:), 0.) -END IF -! -IF (SIZE(PLBXSVS,1) /= 0) THEN - DO JSV = 1,KSV - PLBXSVM(:,:,:,JSV) = MAX( PLBXSVM(:,:,:,JSV) + PTSTEP * PLBXSVS(:,:,:,JSV),XSVMIN(JSV)) - ENDDO -ENDIF -IF (SIZE(PLBYSVS,1) /= 0) THEN - DO JSV = 1,KSV - PLBYSVM(:,:,:,JSV) = MAX( PLBYSVM(:,:,:,JSV) + PTSTEP * PLBYSVS(:,:,:,JSV),XSVMIN(JSV)) - ENDDO -END IF -! -!------------------------------------------------------------------------------ -! -!* 6. MINIMUM VALUE FOR HYDROMETEORS -! -IF (SIZE(PRT,4) > 1) THEN - WHERE(PRT(:,:,:,2:)<1.E-20) - PRT(:,:,:,2:)=0. - END WHERE -END IF -IF (SIZE(PLBXRM,4) > 1) THEN - WHERE(PLBXRM(:,:,:,2:)<1.E-20) - PLBXRM(:,:,:,2:)=0. - END WHERE -END IF -IF (SIZE(PLBYRM,4) > 1) THEN - WHERE(PLBYRM(:,:,:,2:)<1.E-20) - PLBYRM(:,:,:,2:)=0. - END WHERE -END IF -! -!------------------------------------------------------------------------------ -! -!* 7. MINIMUM VALUE FOR CHEMISTRY -! -IF ((SIZE(PLBXSVM,4) > NSV_CHEMEND-1).AND.(SIZE(PLBXSVM,1) /= 0)) THEN - DO JSV=NSV_CHEMBEG, NSV_CHEMEND - PLBXSVM(:,:,:,JSV) = MAX(PLBXSVM(:,:,:,JSV), XSVMIN(JSV)) - END DO -END IF -IF ((SIZE(PLBYSVM,4) > NSV_CHEMEND-1).AND.(SIZE(PLBYSVM,1) /= 0)) THEN - DO JSV=NSV_CHEMBEG, NSV_CHEMEND - PLBYSVM(:,:,:,JSV) = MAX(PLBYSVM(:,:,:,JSV), XSVMIN(JSV)) - END DO -END IF -! -!------------------------------------------------------------------------------ -! -!* 8. MINIMUM VALUE FOR AEROSOLS -! -IF (LORILAM) THEN - IF ((SIZE(PLBXSVM,4) > NSV_AEREND-1).AND.(SIZE(PLBXSVM,1) /= 0)) THEN - DO JSV=NSV_AERBEG, NSV_AEREND - PLBXSVM(:,:,:,JSV) = MAX(PLBXSVM(:,:,:,JSV), XSVMIN(JSV)) - END DO - END IF - IF ((SIZE(PLBYSVM,4) > NSV_AEREND-1).AND.(SIZE(PLBYSVM,1) /= 0)) THEN - DO JSV=NSV_AERBEG, NSV_AEREND - PLBYSVM(:,:,:,JSV) = MAX(PLBYSVM(:,:,:,JSV), XSVMIN(JSV)) - END DO - END IF -END IF -! -!------------------------------------------------------------------------------ -! -!* 9. MINIMUM VALUE FOR DUSTS -! -IF (LDUST) THEN - IF ((SIZE(PLBXSVM,4) > NSV_DSTEND-1).AND.(SIZE(PLBXSVM,1) /= 0)) THEN - DO JSV=NSV_DSTBEG, NSV_DSTEND - PLBXSVM(:,:,:,JSV) = MAX(PLBXSVM(:,:,:,JSV), XSVMIN(JSV)) - END DO - END IF - IF ((SIZE(PLBYSVM,4) > NSV_DSTEND-1).AND.(SIZE(PLBYSVM,1) /= 0)) THEN - DO JSV=NSV_DSTBEG, NSV_DSTEND - PLBYSVM(:,:,:,JSV) = MAX(PLBYSVM(:,:,:,JSV), XSVMIN(JSV)) - END DO - END IF -END IF -! -!------------------------------------------------------------------------------ -! -!* 9. MINIMUM VALUE FOR SEA SALTS -! -IF (LSALT) THEN - IF ((SIZE(PLBXSVM,4) > NSV_SLTEND-1).AND.(SIZE(PLBXSVM,1) /= 0)) THEN - DO JSV=NSV_SLTBEG, NSV_SLTEND - PLBXSVM(:,:,:,JSV) = MAX(PLBXSVM(:,:,:,JSV), XSVMIN(JSV)) - END DO - END IF - IF ((SIZE(PLBYSVM,4) > NSV_SLTEND-1).AND.(SIZE(PLBYSVM,1) /= 0)) THEN - DO JSV=NSV_SLTBEG, NSV_SLTEND - PLBYSVM(:,:,:,JSV) = MAX(PLBYSVM(:,:,:,JSV), XSVMIN(JSV)) - END DO - END IF -END IF -! -!------------------------------------------------------------------------------ -! -!* 11. STORAGE IN BUDGET ARRAYS -! -IF (LBU_ENABLE) THEN - !Division by nbustep to compute average on the selected time period - if ( lbudget_u .or. lbudget_v .or. lbudget_w .or. lbudget_th & - .or. lbudget_tke .or. lbudget_rv .or. lbudget_rc .or. lbudget_rr .or. lbudget_ri & - .or. lbudget_rs .or. lbudget_rg .or. lbudget_rh .or. lbudget_sv ) then - Allocate( zrhodjontime, mold = prhodj ) - Allocate( zwork, mold = prhodj ) - zrhodjontime(:, :, :) = prhodj(:, :, :) / ( ptstep * nbustep ) - end if - - if ( lbudget_u ) call Budget_store_end( tbudgets(NBUDGET_U ), 'AVEF', put (:, :, :) * zrhodjontime(:, :, :) ) - if ( lbudget_v ) call Budget_store_end( tbudgets(NBUDGET_V ), 'AVEF', pvt (:, :, :) * zrhodjontime(:, :, :) ) - if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W ), 'AVEF', pwt (:, :, :) * zrhodjontime(:, :, :) ) - if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH ), 'AVEF', ptht (:, :, :) * zrhodjontime(:, :, :) ) - if ( lbudget_tke ) call Budget_store_end( tbudgets(NBUDGET_TKE), 'AVEF', ptket(:, :, :) * zrhodjontime(:, :, :) ) - if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV ), 'AVEF', prt (:, :, :, 1) * zrhodjontime(:, :, :) ) - if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC ), 'AVEF', prt (:, :, :, 2) * zrhodjontime(:, :, :) ) - if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR ), 'AVEF', prt (:, :, :, 3) * zrhodjontime(:, :, :) ) - if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI ), 'AVEF', prt (:, :, :, 4) * zrhodjontime(:, :, :) ) - if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS ), 'AVEF', prt (:, :, :, 5) * zrhodjontime(:, :, :) ) - if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG ), 'AVEF', prt (:, :, :, 6) * zrhodjontime(:, :, :) ) - if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH ), 'AVEF', prt (:, :, :, 7) * zrhodjontime(:, :, :) ) - if ( lbudget_sv ) then - do jsv = 1, ksv - call Budget_store_end( tbudgets(jsv + NBUDGET_SV1 - 1), 'AVEF', psvt(:, :, :, jsv) * zrhodjontime(:, :, :) ) - end do - end if - - if ( lbudget_u ) then - zwork(:, :, :) = pus (:, :, :) * Mxm( prhodj(:, :, :) ) / ptstep - call Budget_store_end( tbudgets(NBUDGET_U ), 'ENDF', zwork ) - call Budget_store_init( tbudgets(NBUDGET_U ), 'ASSE', zwork ) - end if - - if ( lbudget_v ) then - zwork(:, :, :) = pvs (:, :, :) * Mym( prhodj(:, :, :) ) / ptstep - call Budget_store_end( tbudgets(NBUDGET_V ), 'ENDF', zwork ) - call Budget_store_init( tbudgets(NBUDGET_V ), 'ASSE', zwork ) - end if - - if ( lbudget_w ) then - zwork(:, :, :) = pws (:, :, :) * Mzm( prhodj(:, :, :) ) / ptstep - call Budget_store_end( tbudgets(NBUDGET_W ), 'ENDF', zwork ) - call Budget_store_init( tbudgets(NBUDGET_W ), 'ASSE', zwork ) - end if - - if ( lbudget_th .or. lbudget_tke .or. lbudget_rv .or. lbudget_rc .or. lbudget_rr & - .or. lbudget_ri .or. lbudget_rs .or. lbudget_rg .or. lbudget_rh .or. lbudget_sv ) then - zrhodjontime(:, :, :) = prhodj(:, :, :) / ptstep - end if - - if ( lbudget_th ) then - zwork(:, :, :) = pths (:, :, :) * zrhodjontime(:, :, :) - call Budget_store_end( tbudgets(NBUDGET_TH ), 'ENDF', zwork ) - call Budget_store_init( tbudgets(NBUDGET_TH ), 'ASSE', zwork ) - end if - - if ( lbudget_tke ) then - zwork(:, :, :) = ptkes(:, :, :) * zrhodjontime(:, :, :) - call Budget_store_end( tbudgets(NBUDGET_TKE), 'ENDF', zwork ) - call Budget_store_init( tbudgets(NBUDGET_TKE), 'ASSE', zwork ) - end if - - if ( lbudget_rv ) then - zwork(:, :, :) = prs (:, :, :, 1) * zrhodjontime(:, :, :) - call Budget_store_end( tbudgets(NBUDGET_RV ), 'ENDF', zwork ) - call Budget_store_init( tbudgets(NBUDGET_RV ), 'ASSE', zwork ) - end if - - if ( lbudget_rc ) then - zwork(:, :, :) = prs (:, :, :, 2) * zrhodjontime(:, :, :) - call Budget_store_end( tbudgets(NBUDGET_RC ), 'ENDF', zwork ) - call Budget_store_init( tbudgets(NBUDGET_RC ), 'ASSE', zwork ) - end if - - if ( lbudget_rr ) then - zwork(:, :, :) = prs (:, :, :, 3) * zrhodjontime(:, :, :) - call Budget_store_end( tbudgets(NBUDGET_RR ), 'ENDF', zwork ) - call Budget_store_init( tbudgets(NBUDGET_RR ), 'ASSE', zwork ) - end if - - if ( lbudget_ri ) then - zwork(:, :, :) = prs (:, :, :, 4) * zrhodjontime(:, :, :) - call Budget_store_end( tbudgets(NBUDGET_RI ), 'ENDF', zwork ) - call Budget_store_init( tbudgets(NBUDGET_RI ), 'ASSE', zwork ) - end if - - if ( lbudget_rs ) then - zwork(:, :, :) = prs (:, :, :, 5) * zrhodjontime(:, :, :) - call Budget_store_end( tbudgets(NBUDGET_RS ), 'ENDF', zwork ) - call Budget_store_init( tbudgets(NBUDGET_RS ), 'ASSE', zwork ) - end if - - if ( lbudget_rg ) then - zwork(:, :, :) = prs (:, :, :, 6) * zrhodjontime(:, :, :) - call Budget_store_end( tbudgets(NBUDGET_RG ), 'ENDF', zwork ) - call Budget_store_init( tbudgets(NBUDGET_RG ), 'ASSE', zwork ) - end if - - if ( lbudget_rh ) then - zwork(:, :, :) = prs (:, :, :, 7) * zrhodjontime(:, :, :) - call Budget_store_end( tbudgets(NBUDGET_RH ), 'ENDF', zwork ) - call Budget_store_init( tbudgets(NBUDGET_RH ), 'ASSE', zwork ) - end if - - if ( lbudget_sv ) then - do jsv = 1, ksv - zwork(:, :, :) = psvs(:, :, :, jsv) * zrhodjontime(:, :, :) - call Budget_store_end( tbudgets(jsv + NBUDGET_SV1 - 1), 'ENDF', zwork ) - call Budget_store_init( tbudgets(jsv + NBUDGET_SV1 - 1), 'ASSE', zwork ) - end do - end if - - if ( Allocated( zwork ) ) Deallocate( zwork ) - if ( Allocated( zrhodjontime ) ) Deallocate( zrhodjontime ) -END IF -! -!------------------------------------------------------------------------------ -! -!* 12. COMPUTATION OF PHASE VELOCITY -! ----------------------------- -! -! It is temporarily set to a constant value -! -!------------------------------------------------------------------------------ -! -! -END SUBROUTINE ENDSTEP diff --git a/src/PHYEX/ext/flash_geom_elec.f90 b/src/PHYEX/ext/flash_geom_elec.f90 deleted file mode 100644 index e6eea2d03..000000000 --- a/src/PHYEX/ext/flash_geom_elec.f90 +++ /dev/null @@ -1,2873 +0,0 @@ -!MNH_LIC Copyright 2010-2022 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ############################# - MODULE MODI_FLASH_GEOM_ELEC_n -! ############################# -! -INTERFACE - SUBROUTINE FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, PTSTEP, OEXIT, & - PRHODJ, PRHODREF, PRT, PCIT, PRSVS, PRS, PTHT, PPABST, & - PEFIELDU, PEFIELDV, PEFIELDW, PZZ, PSVS_LINOX, & - TPFILE_FGEOM_DIAG, TPFILE_FGEOM_COORD, TPFILE_LMA, & - PTOWN, PSEA ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter -INTEGER, INTENT(IN) :: KMI ! current model index -INTEGER, INTENT(IN) :: KRR ! number of moist variables -REAL, INTENT(IN) :: PTSTEP ! Double time step except for - ! cold start -LOGICAL, INTENT(IN) :: OEXIT ! switch for the end of the temporal loop -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference dry air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Moist variables at time t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Scalar variables source term -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDU ! x-component of the electric field -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDV ! y-component of the electric field -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDW ! z-component of the electric field -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variables vol. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta (K) at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSVS_LINOX ! NOx source term -TYPE(TFILEDATA), INTENT(IN) :: TPFILE_FGEOM_DIAG -TYPE(TFILEDATA), INTENT(IN) :: TPFILE_FGEOM_COORD -TYPE(TFILEDATA), INTENT(IN) :: TPFILE_LMA -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! town fraction -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask -! -END SUBROUTINE FLASH_GEOM_ELEC_n -END INTERFACE -END MODULE MODI_FLASH_GEOM_ELEC_n -! -! -! ###################################################################################### - SUBROUTINE FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, PTSTEP, OEXIT, & - PRHODJ, PRHODREF, PRT, PCIT, PRSVS, PRS, PTHT, PPABST, & - PEFIELDU, PEFIELDV, PEFIELDW, PZZ, PSVS_LINOX, & - TPFILE_FGEOM_DIAG, TPFILE_FGEOM_COORD, TPFILE_LMA, & - PTOWN, PSEA ) -! ###################################################################################### -! -!!**** * - -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the lightning flash path, -!! and to neutralize the electric charge along the lightning channel. -!! -!! -!! METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! C. Barthe * LACy * -!! -!! MODIFICATIONS -!! ------------- -!! Original : Jan. 2010 -!! Modifications: -!! M. Chong * LA * Juin 2010 : add small ions -!! J-P Pinty * LA * Feb. 2013 : add LMA storage -!! J-P Pinty * LA * Nov. 2013 : add flash map storage -!! M. Chong * LA * Juin 2010 : add LiNOx -!! C. Barthe * LACy * Jan. 2015 : convert trig. pt into lat,lon in ascii file -!! J.Escobar : 18/12/2015 : Correction of bug in bound in // for NHALO <>1 -!! J.Escobar : 28/03/2018 : Correction of multiple // bug & compiler indepedent mnh_random_number -!! J.Escobar : 20/06/2018 : Correction of computation of global index I8VECT -!! J.Escobar : 10/12/2018 : // Correction , mpi_bcast CG & CG_POS parameter -!! & initialize INBLIGHT on all proc for filling/saving AREA* arrays -! P. Wautelet 10/01/2019: use NEWUNIT argument of OPEN -! P. Wautelet 22/01/2019: use standard FLUSH statement instead of non standard intrinsics!! -! P. Wautelet 22/02/2019: use MOD intrinsics with same kind for all arguments (to respect Fortran standard) -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 19/04/2019: use modd_precision kinds -! P. Wautelet 26/04/2019: use modd_precision parameters for datatypes of MPI communications -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) -! P. Wautelet 31/08/2022: remove ZXMASS and ZYMASS (use XXHATM and XYHATM instead) -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_ARGSLIST_ll, ONLY: LIST_ll -USE MODD_CONF, ONLY: CEXP, LCARTESIAN -USE MODD_CST, ONLY: XAVOGADRO, XMD -USE MODD_DYN_n, ONLY: XDXHATM, XDYHATM, NSTOP -USE MODD_ELEC_DESCR -USE MODD_ELEC_FLASH -USE MODD_ELEC_PARAM, ONLY: XFQLIGHTR, XEXQLIGHTR, & - XFQLIGHTI, XEXQLIGHTI, & - XFQLIGHTS, XEXQLIGHTS, & - XFQLIGHTG, XEXQLIGHTG, & - XFQLIGHTH, XEXQLIGHTH, & - XFQLIGHTC -USE MODD_GRID, ONLY: XLATORI,XLONORI -USE MODD_GRID_n, ONLY: XXHATM, XYHATM, XZHAT -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LMA_SIMULATOR -USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZZ ! in linox_production -USE MODD_NSV, ONLY: NSV_ELECBEG, NSV_ELECEND, NSV_ELEC -USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT -use MODD_PRECISION, only: MNHINT_MPI, MNHLOG_MPI, MNHREAL_MPI -USE MODD_RAIN_ICE_DESCR_n, ONLY: XLBR, XLBEXR, XLBS, XLBEXS, & - XLBG, XLBEXG, XLBH, XLBEXH, & - XRTMIN -USE MODD_SUB_ELEC_n -USE MODD_TIME_n -USE MODD_VAR_ll, ONLY: NPROC,NMNH_COMM_WORLD -! -USE MODE_ELEC_ll -USE MODE_GRIDPROJ -USE MODE_ll -USE MODE_MPPDB -#ifdef MNH_PGI -USE MODE_PACK_PGI -#endif -! -USE MODI_ION_ATTACH_ELEC -USE MODI_SHUMAN -USE MODI_TO_ELEC_FIELD_n -! -IMPLICIT NONE -! -! -! 0.1 Declaration of arguments -! -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter -INTEGER, INTENT(IN) :: KMI ! current model index -INTEGER, INTENT(IN) :: KRR ! number of moist variables -REAL, INTENT(IN) :: PTSTEP ! Double time step except for - ! cold start -LOGICAL, INTENT(IN) :: OEXIT ! switch for the end of the temporal loop -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference dry air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Moist variables at time t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Scalar variables source term -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDU ! x-component of the electric field -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDV ! y-component of the electric field -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDW ! z-component of the electric field -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variables vol. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta (K) at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSVS_LINOX ! NOx source term -TYPE(TFILEDATA), INTENT(IN) :: TPFILE_FGEOM_DIAG -TYPE(TFILEDATA), INTENT(IN) :: TPFILE_FGEOM_COORD -TYPE(TFILEDATA), INTENT(IN) :: TPFILE_LMA -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! town fraction -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask -! -! -! 0.2 Declaration of local variables -! -INTEGER :: IIB, IIE ! index values of the first and last inner mass points along x -INTEGER :: IJB, IJE ! index values of the first and last inner mass points along y -INTEGER :: IKB, IKE ! index values of the first and last inner mass points along z -INTEGER :: II, IJ, IK, IL, IM, IPOINT ! loop indexes -INTEGER :: IX, IY, IZ -INTEGER :: IXOR, IYOR ! origin of the extended subdomain -INTEGER :: INB_CELL ! Number of detected electrified cells -INTEGER :: IPROC_CELL ! Proc with the center of the cell -INTEGER :: IICOORD, IJCOORD, IKCOORD ! local indexes of the cell center / max electric field -INTEGER :: IPROC ! my proc number -INTEGER :: IINFO_ll ! return code of parallel routine -INTEGER :: COUNT_BEF ! nb of pts in zcell before testing neighbour pts -INTEGER :: COUNT_AFT ! nb of pts in zcell after testing neighbour pts -INTEGER :: INBFTS_MAX ! Max number of flashes per time step / cell -INTEGER :: IIBL_LOC ! local i index of the ongoing bi-leader segment -INTEGER :: IJBL_LOC ! local j index of the ongoing bi-leader segment -INTEGER :: IKBL ! k index of the ongoing bi-leader segment -INTEGER :: II_TRIG_LOC ! local i index of the triggering point -INTEGER :: IJ_TRIG_LOC ! local j index of the triggering point -INTEGER :: II_TRIG_GLOB ! global i index of the potential triggering pt -INTEGER :: IJ_TRIG_GLOB ! global j index of the potential triggering pt -INTEGER :: IK_TRIG ! k index of the triggering point -INTEGER :: ISIGN_LEADER ! sign of the leader -INTEGER :: IPROC_AUX ! proc number for max_ll and min_ll -INTEGER :: IIND_MAX ! max nb of indexes between the trig. pt and the possible branches -INTEGER :: IIND_MIN ! min nb of indexes between the trig. pt and the possible branches -INTEGER :: IDELTA_IND ! number of indexes between iind_max and iind_min -INTEGER :: IPT_DIST ! nb of possible pts for branching on each proc -INTEGER :: IPT_DIST_GLOB ! global nb of possible pts for branching -INTEGER :: IFOUND ! if =1, then the random selection is successful -INTEGER :: ICHOICE_LOCX ! local i indice for random choice -INTEGER :: ICHOICE_LOCY ! local j indice for random choice -INTEGER :: ICHOICE_Z ! k indice for random choice -INTEGER :: INB_PROP ! nb of pts where the flash can propagate -INTEGER :: INB_NEUT ! nb of pts to neutralize -INTEGER :: INB_NEUT_OK ! nb of effective flash neutralization -INTEGER :: ISTOP -INTEGER :: IERR ! error status -INTEGER :: IWORK -INTEGER :: ICHOICE -INTEGER :: IIMIN, IIMAX, IJMIN, IJMAX, IKMIN, IKMAX -INTEGER :: IPOS_LEADER, INEG_LEADER -INTEGER :: INBLIGHT -INTEGER, DIMENSION(:), ALLOCATABLE, SAVE :: ITYPE ! flash type (IC, CGN or CGP) -INTEGER, DIMENSION(:), ALLOCATABLE :: INBSEG_LEADER ! number of segments in the leader -INTEGER, DIMENSION(:), ALLOCATABLE :: ISIGNE_EZ ! sign of the vertical electric field - ! component at the trig. pt -INTEGER, DIMENSION(:), ALLOCATABLE :: IPROC_TRIG ! proc that contains the triggering point -INTEGER, DIMENSION(:), ALLOCATABLE :: INBSEG ! Number of segments per flash -INTEGER, DIMENSION(:), ALLOCATABLE :: INBSEG_ALL ! Number of segments, all processes -INTEGER, DIMENSION(NPROC) :: INBSEG_PROC ! ------------------ per process -INTEGER, DIMENSION(:), ALLOCATABLE :: INB_FLASH ! Number of flashes per time step / cell -INTEGER, DIMENSION(:), ALLOCATABLE :: INB_FL_REAL ! Effective Number of flashes per timestep/cell -INTEGER, DIMENSION(:), ALLOCATABLE :: IHIST_LOC ! local nb of possible branches at [r,r+dr] -INTEGER, DIMENSION(:), ALLOCATABLE :: IHIST_GLOB ! global nb of possible branches at [r,r+dr] - ! at [r,r+dr] on each proc -INTEGER, DIMENSION(:), ALLOCATABLE :: IMAX_BRANCH ! max nb of branches at [r,r+dr] - ! proportional to the percentage of - ! available pts / proc at this distance -INTEGER, DIMENSION(:,:), ALLOCATABLE :: ISEG_LOC ! Local indexes of the flash segments -INTEGER, DIMENSION(:,:), ALLOCATABLE :: ICELL_LOC ! local indexes + proc of the cell 'center' -INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: IMASKQ_DIST ! contains the distance/indice - ! from the triggering pt -! -LOGICAL :: GPOSITIVE ! if T, positive charge regions where the negative part - ! of the leader propagates -LOGICAL :: GEND_DOMAIN ! no more points with E > E_threshold -LOGICAL :: GEND_CELL ! if T, end of the cell -LOGICAL :: GCG ! if true, the flash is a CG -LOGICAL :: GCG_POS ! if true, the flash is a +CG -LOGICAL :: GNEUTRALIZATION -LOGICAL :: GNEW_FLASH_GLOB -LOGICAL, DIMENSION(:), ALLOCATABLE :: GNEW_FLASH -LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: GATTACH ! if T, ion recombination and - ! attachment -LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: GPOSS ! if T, new cell possible at this pt -LOGICAL, DIMENSION(:,:,:,:), ALLOCATABLE :: GPROP ! if T, propagation possible at this pt -! -REAL :: ZE_TRIG_THRES ! Triggering Electric field threshold corrected for - ! pressure -REAL :: ZMAXE ! Max electric field module (V/m) -REAL :: ZEMOD_BL ! E module at the tip of the last segment of the leader (V/m) -REAL :: ZMEAN_GRID ! mean grid size -REAL :: ZMAX_DIST ! max distance between the triggering pt and the possible branches -REAL :: ZMIN_DIST ! min distance between the triggering pt and the possible branches -REAL :: ZRANDOM ! random number -REAL :: ZQNET ! net charge carried by the flash (C/kg) -REAL :: ZCLOUDLIM ! cloud limit -REAL :: ZSIGMIN ! min efficient cross section -REAL :: ZLAT, ZLON ! lat,lon coordinates of the triggering points if not lcartesian -! -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZQMT ! mass charge density (C/kg) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZCELL ! define the electrified cells -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSIGMA ! efficient cross section of hydrometeors -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZDQDT ! charge to neutralize at each pt (C/kg) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZFLASH ! = 1 if the flash leader reaches this pt - ! = 2 if the flash branch is concerned -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDAR ! Lambda for rain -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDAS ! Lambda for snow -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDAG ! Lambda for graupel -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDAH ! Lambda for hail -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZQMTOT ! total mass charge density (C/kg) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCLOUD ! total mixing ratio (kg/kg) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEMODULE ! Electric field module (V/m) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDIST ! distance between the trig. pt and the cell pts (m) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSIGLOB ! sum of the cross sections -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZQFLASH ! total charge in excess of xqexcess (C/kg) -REAL, DIMENSION(:,:), ALLOCATABLE :: ZCOORD_TRIG ! Global coordinates of triggering point -REAL, DIMENSION(:,:), ALLOCATABLE :: ZCOORD_SEG ! Global coordinates of segments -REAL, DIMENSION(:), ALLOCATABLE :: ZEM_TRIG ! Electric field module at the triggering pt -REAL, DIMENSION(:), ALLOCATABLE :: ZNEUT_POS ! Positive charge neutralized at each segment -REAL, DIMENSION(:), ALLOCATABLE :: ZNEUT_NEG ! Negative charge neutralized at each segment -INTEGER, DIMENSION(:,:), ALLOCATABLE :: ISEG_GLOB ! Global indexes of LMA segments -INTEGER, DIMENSION(:,:), ALLOCATABLE :: ILMA_SEG_ALL ! Global indexes of LMA segments -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLMA_QMT ! Particle charge at neutralization point -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLMA_PRT ! Particle mixing ratio at neutralization point -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLMA_NEUT_POS -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLMA_NEUT_NEG -REAL, DIMENSION(:,:), ALLOCATABLE :: ZCOORD_SEG_ALL -REAL, DIMENSION(:), ALLOCATABLE :: ZEMAX ! Max electric field in each cell -REAL, DIMENSION(:), ALLOCATABLE :: ZHIST_PERCENT ! percentage of possible branches at [r,r+dr] on each proc -REAL, DIMENSION(:), ALLOCATABLE :: ZMAX_BRANCH ! max nb of branches at [r,r+dr] -REAL, DIMENSION(:), ALLOCATABLE :: ZVECT -! -! Storage for nflash_write flashes before writing output files (denoted xSxxx) -INTEGER, SAVE :: ISAVE_STATUS ! 0: print and save - ! 1: save only - ! 2: print only -! -TYPE(LIST_ll), POINTER :: TZFIELDS_ll=> NULL() ! list of fields to exchange -! -! Storage for the localization of the flashes -LOGICAL :: GFIRSTFLASH -INTEGER,DIMENSION(SIZE(PRT,1),SIZE(PRT,2)) :: IMAP2D -! -! Storage for the NOx production terms -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLNOX -REAL :: ZLGHTLENGTH, ZCOEF -INTEGER :: IFLASH_COUNT, IFLASH_COUNT_GLOB ! Total number of flashes within the timestep -! -REAL,DIMENSION(SIZE(PRT,1),SIZE(PRT,2)) :: ZCELL_NEW -! -INTEGER :: ILJ -INTEGER :: NIMAX_ll, NJMAX_ll,IIU_ll,IJU_ll ! dimensions of global domain -! -!------------------------------------------------------------------------------- -! -!* 1. INITIALIZATION -! -------------- -CALL MYPROC_ELEC_ll(IPROC) -! -!* 1.1 subdomains indexes -! -! beginning and end indexes of the physical subdomain -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB = 1 + JPVEXT -IKE = SIZE(PRT,3) - JPVEXT -! -! global indexes of the local subdomains origin -CALL GET_GLOBALDIMS_ll (NIMAX_ll,NJMAX_ll) -CALL GET_OR_ll('B',IXOR,IYOR) -IIU_ll = NIMAX_ll + 2*JPHEXT -IJU_ll = NJMAX_ll + 2*JPHEXT -! -! -!* 1.2 allocations and initializations -! -! -! from the litterature, the max number of flash per minute is ~ 1000 -! this value is used here as the max number of flash per minute per cell -INBFTS_MAX = ANINT(1000 * PTSTEP / 60) -! -IF (GEFIRSTCALL) THEN - GEFIRSTCALL = .FALSE. - ALLOCATE (ZZMASS(SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3))) - ALLOCATE (ZPRES_COEF(SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3))) - IF(LLMA) THEN - ALLOCATE (ZLMA_LAT(NFLASH_WRITE, NBRANCH_MAX)) - ALLOCATE (ZLMA_LON(NFLASH_WRITE, NBRANCH_MAX)) - ALLOCATE (ZSLMA_NEUT_POS(NFLASH_WRITE, NBRANCH_MAX)) - ALLOCATE (ZSLMA_NEUT_NEG(NFLASH_WRITE, NBRANCH_MAX)) - ALLOCATE (ISLMA_SEG_GLOB(NFLASH_WRITE, NBRANCH_MAX, 3)) - ALLOCATE (ZSLMA_QMT(NFLASH_WRITE, NBRANCH_MAX, SIZE(PRSVS,4))) - ALLOCATE (ZSLMA_PRT(NFLASH_WRITE, NBRANCH_MAX, SIZE(PRSVS,4))) - ISLMA_SEG_GLOB(:,:,:) = 0 - END IF - ALLOCATE (ZSCOORD_SEG(NFLASH_WRITE, NBRANCH_MAX, 3)) ! NFLASH_WRITE nb of flash to be stored - ! before writing in files - ! NBRANCH_MAX=5000 default - ALLOCATE (ISFLASH_NUMBER(0:NFLASH_WRITE)) - ALLOCATE (ISNB_FLASH(NFLASH_WRITE)) - ALLOCATE (ISCELL_NUMBER(NFLASH_WRITE)) - ALLOCATE (ISNBSEG(NFLASH_WRITE)) - ALLOCATE (ISTCOUNT_NUMBER(NFLASH_WRITE)) - ALLOCATE (ISTYPE(NFLASH_WRITE)) - ALLOCATE (ZSEM_TRIG(NFLASH_WRITE)) - ALLOCATE (ZSNEUT_POS(NFLASH_WRITE)) - ALLOCATE (ZSNEUT_NEG(NFLASH_WRITE)) -! - ZZMASS = MZF(PZZ) - ZPRES_COEF = EXP(ZZMASS/8400.) - ZSCOORD_SEG(:,:,:) = 0.0 - ISAVE_STATUS = 1 - ISFLASH_NUMBER(:) = 0 -END IF -! -ALLOCATE (ZQMT(SIZE(PRSVS,1),SIZE(PRSVS,2),SIZE(PRSVS,3),SIZE(PRSVS,4))) -ALLOCATE (ZQMTOT(SIZE(PRSVS,1),SIZE(PRSVS,2),SIZE(PRSVS,3))) -ALLOCATE (ZCLOUD(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) -ALLOCATE (GPOSS(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) -ALLOCATE (ZEMODULE(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) -ALLOCATE (ZCELL(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),NMAX_CELL)) - -! -ZQMT(:,:,:,:) = 0. -ZQMTOT(:,:,:) = 0. -ZCLOUD(:,:,:) = 0. -GPOSS(:,:,:) = .FALSE. -GPOSS(IIB:IIE,IJB:IJE,IKB:IKE) = .TRUE. -ZEMODULE(:,:,:) = 0. -ZCELL(:,:,:,:) = 0. -! -! -!* 1.3 point discharge (Corona) -! -PRSVS(:,:,:,1) = XECHARGE * PRSVS(:,:,:,1) ! C /(m3 s) -PRSVS(:,:,:,NSV_ELEC) = -1. * XECHARGE * PRSVS(:,:,:,NSV_ELEC) ! C /(m3 s) -! -CALL PT_DISCHARGE -! -! -!* 1.4 total charge density and mixing ratio -! -DO II = 1, NSV_ELEC -! transform the source term (C/s) into the updated charge density (C/kg) - ZQMT(:,:,:,II) = PRSVS(:,:,:,II) * PTSTEP / PRHODJ(:,:,:) -! -! total mass charge density (C/kg) - ZQMTOT(:,:,:) = ZQMTOT(:,:,:) + PRSVS(:,:,:,II) * PTSTEP / PRHODJ(:,:,:) -END DO -! -! total mixing ratio (g/kg) -DO II = 2, KRR - ZCLOUD(:,:,:) = ZCLOUD(:,:,:) + PRT(:,:,:,II) -END DO -! -! -!* 1.5 constants -! -ZCLOUDLIM = 1.E-5 -ZSIGMIN = 1.E-12 -! -! -!------------------------------------------------------------------------------- -! -!* 2. FIND AND COUNT THE ELECTRIFIED CELLS -! ------------------------------------ -! -ALLOCATE (ZEMAX(NMAX_CELL)) -ALLOCATE (ICELL_LOC(4,NMAX_CELL)) -! -ZEMAX(:) = 0. -ICELL_LOC(:,:) = 0 -! -WHERE (ZCLOUD(IIB:IIE,IJB:IJE,IKB:IKE) .LE. ZCLOUDLIM) - GPOSS(IIB:IIE,IJB:IJE,IKB:IKE) = .FALSE. -END WHERE -! -! -!* 2.1 find the maximum electric field -! -GEND_DOMAIN = .FALSE. -GEND_CELL = .FALSE. -INB_CELL = 0 -ZE_TRIG_THRES = XETRIG * (1. - XEBALANCE) -! -CALL MPPDB_CHECK3DM("flash:: PRHODJ,PRT",PRECISION,& - PRHODJ,PRT(:,:,:,1),PRT(:,:,:,2),PRT(:,:,:,3),PRT(:,:,:,4),& - PRT(:,:,:,5),PRT(:,:,:,6)) -CALL MPPDB_CHECK3DM("flash:: ZQMT",PRECISION,& - ZQMT(:,:,:,1),ZQMT(:,:,:,2),ZQMT(:,:,:,3),ZQMT(:,:,:,4),& - ZQMT(:,:,:,5),ZQMT(:,:,:,6),ZQMT(:,:,:,7)) - -CALL TO_ELEC_FIELD_n (PRT, ZQMT, PRHODJ, KTCOUNT, KRR, & - PEFIELDU, PEFIELDV, PEFIELDW) -CALL MPPDB_CHECK3DM("flash:: PEFIELDU, PEFIELDV, PEFIELDW",PRECISION,& - PEFIELDU, PEFIELDV, PEFIELDW) -! -! electric field module including pressure effect -ZEMODULE(IIB:IIE,IJB:IJE,IKB:IKE) = ZPRES_COEF(IIB:IIE,IJB:IJE,IKB:IKE)* & - (PEFIELDU(IIB:IIE,IJB:IJE,IKB:IKE)**2 + & - PEFIELDV(IIB:IIE,IJB:IJE,IKB:IKE)**2 + & - PEFIELDW(IIB:IIE,IJB:IJE,IKB:IKE)**2)**0.5 -! -DO WHILE (.NOT. GEND_DOMAIN .AND. INB_CELL .LT. NMAX_CELL) -! -! find the maximum electric field on each proc - IF (COUNT(GPOSS(IIB:IIE,IJB:IJE,IKB:IKE)) .GT. 0) THEN - ZMAXE = MAXVAL(ZEMODULE(IIB:IIE,IJB:IJE,IKB:IKE), MASK=GPOSS(IIB:IIE,IJB:IJE,IKB:IKE)) - ELSE - ZMAXE = 0. - END IF -! -! find the max electric field on the whole domain + the proc that contains this value - CALL MAX_ELEC_ll (ZMAXE, IPROC_CELL) -! - IF (ZMAXE .GT. ZE_TRIG_THRES) THEN - INB_CELL = INB_CELL + 1 ! one cell is detected - ZEMAX(INB_CELL) = ZMAXE -! local coordinates of the maximum electric field - ICELL_LOC(1:3,INB_CELL) = MAXLOC(ZEMODULE, MASK=GPOSS ) - IICOORD = ICELL_LOC(1,INB_CELL) - IJCOORD = ICELL_LOC(2,INB_CELL) - ICELL_LOC(1,INB_CELL) = IICOORD + IXOR -1 - ICELL_LOC(2,INB_CELL) = IJCOORD + IYOR -1 - IKCOORD = ICELL_LOC(3,INB_CELL) - ICELL_LOC(4,INB_CELL) = IPROC_CELL -! -! Broadcast the center of the cell to all procs - CALL MPI_BCAST (ICELL_LOC(:,INB_CELL), 4, MNHINT_MPI, IPROC_CELL, & - NMNH_COMM_WORLD, IERR) -! -! -!* 2.2 horizontal extension of the cell -! - DO IK = IKB, IKE - IF (IPROC_CELL .EQ. IPROC) THEN - IF (GPOSS(IICOORD,IJCOORD,IK)) THEN - ZCELL(IICOORD,IJCOORD,IK,INB_CELL) = 1. - GPOSS(IICOORD,IJCOORD,IK) = .FALSE. - END IF - END IF -! -!* 2.2.1 do the neighbour points have q_tot > q_thresh? -! - GEND_CELL = .FALSE. - DO WHILE (.NOT. GEND_CELL) -! - CALL ADD2DFIELD_ll ( TZFIELDS_ll, ZCELL(:,:,IK,INB_CELL), 'FLASH_GEOM_ELEC_n::ZCELL(:,:,IK,INB_CELL)' ) - CALL UPDATE_HALO_ll ( TZFIELDS_ll, IINFO_ll ) - CALL CLEANLIST_ll ( TZFIELDS_ll ) -! - COUNT_BEF = COUNT(ZCELL(IIB:IIE,IJB:IJE,IK,INB_CELL) .EQ. 1.) - CALL SUM_ELEC_ll (COUNT_BEF) -! - ZCELL_NEW = ZCELL(:,:,IK,INB_CELL) - DO II = IIB, IIE - DO IJ = IJB, IJE - IF ((ZCELL(II,IJ,IK,INB_CELL) .EQ. 0.) .AND. & - (GPOSS(II,IJ,IK)) .AND. & - (ZCLOUD(II,IJ,IK) .GT. 1.E-5) .AND. & - ((ABS(ZQMT(II,IJ,IK,2)) * PRHODREF(II,IJ,IK) .GT. XQEXCES).OR. & - (ABS(ZQMT(II,IJ,IK,3)) * PRHODREF(II,IJ,IK) .GT. XQEXCES).OR. & - (ABS(ZQMT(II,IJ,IK,4)) * PRHODREF(II,IJ,IK) .GT. XQEXCES).OR. & - (ABS(ZQMT(II,IJ,IK,5)) * PRHODREF(II,IJ,IK) .GT. XQEXCES).OR. & - (ABS(ZQMT(II,IJ,IK,6)) * PRHODREF(II,IJ,IK) .GT. XQEXCES)) )THEN -! - IF ((ZCELL(II-1,IJ, IK,INB_CELL) .EQ. 1.) .OR. & - (ZCELL(II+1,IJ, IK,INB_CELL) .EQ. 1.) .OR. & - (ZCELL(II, IJ-1,IK,INB_CELL) .EQ. 1.) .OR. & - (ZCELL(II, IJ+1,IK,INB_CELL) .EQ. 1.) .OR. & - (ZCELL(II-1,IJ-1,IK,INB_CELL) .EQ. 1.) .OR. & - (ZCELL(II-1,IJ+1,IK,INB_CELL) .EQ. 1.) .OR. & - (ZCELL(II+1,IJ+1,IK,INB_CELL) .EQ. 1.) .OR. & - (ZCELL(II+1,IJ-1,IK,INB_CELL) .EQ. 1.)) THEN - GPOSS(II,IJ,IK) = .FALSE. - ZCELL_NEW(II,IJ) = 1. - END IF - END IF - END DO - END DO - ZCELL(:,:,IK,INB_CELL) = ZCELL_NEW -! - COUNT_AFT = COUNT(ZCELL(IIB:IIE,IJB:IJE,IK,INB_CELL) .EQ. 1.) - CALL SUM_ELEC_ll(COUNT_AFT) -! - IF (COUNT_BEF .EQ. COUNT_AFT) THEN - GEND_CELL = .TRUE. ! no more point in the cell at this level - ELSE - GEND_CELL = .FALSE. - END IF - END DO ! end loop gend_cell - END DO ! end loop ik -! -! avoid cell detection in the colums where a previous cell is already present - DO II = IIB, IIE - DO IJ = IJB, IJE - DO IK = IKB, IKE - IF (ZCELL(II,IJ,IK,INB_CELL) .EQ. 1.) GPOSS(II,IJ,:) = .FALSE. - END DO - END DO - END DO - ELSE - GEND_DOMAIN = .TRUE. ! no more points with E > E_threshold - END IF ! max E -END DO ! end loop gend_domain -! -DEALLOCATE (GPOSS) -DEALLOCATE (ZEMAX) -! -! -!* 2.3 if at least 1 cell, allocate arrays -! -IF (INB_CELL .GE. 1) THEN -! -! mean mesh size - ZMEAN_GRID = (XDXHATM**2 + XDYHATM**2 + & - ( ( XZHAT(UBOUND(XZHAT,1)) - XZHAT(1) ) / (SIZE(PRT,3)-1.) )**2 )**0.5 -! chaque proc calcule son propre zmean_grid -! mais cette valeur peut etre differente sur chaque proc (ex: relief) -! laisse tel quel pour le moment -! - ALLOCATE (ISEG_LOC(3*SIZE(PRT,3), INB_CELL)) ! 3 coord indices of the leader - ALLOCATE (ZCOORD_TRIG(3, INB_CELL)) - ALLOCATE (ZCOORD_SEG(NBRANCH_MAX*3, INB_CELL)) - ! NBRANCH_MAX=5000 default - ! 3= 3 coord index - ALLOCATE (ZCOORD_SEG_ALL(NBRANCH_MAX*3, INB_CELL)) - ALLOCATE (ISEG_GLOB(NBRANCH_MAX*3, INB_CELL)) - ISEG_GLOB(:,:) = 0 -! - IF(LLMA) THEN - ALLOCATE (ILMA_SEG_ALL (NBRANCH_MAX*3, INB_CELL)) - ALLOCATE (ZLMA_QMT(NBRANCH_MAX*NSV_ELEC, INB_CELL)) ! charge des part. - ! a neutraliser - ALLOCATE (ZLMA_PRT(NBRANCH_MAX*NSV_ELEC, INB_CELL)) ! mixing ratio - ALLOCATE (ZLMA_NEUT_POS(NBRANCH_MAX, INB_CELL)) - ALLOCATE (ZLMA_NEUT_NEG(NBRANCH_MAX, INB_CELL)) - ZLMA_QMT(:,:) = 0. - ZLMA_PRT(:,:) = 0. - ZLMA_NEUT_POS(:,:) = 0. - ZLMA_NEUT_NEG(:,:) = 0. - END IF -! - IF (LLNOX_EXPLICIT) THEN - ALLOCATE (ZLNOX(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) - ZLNOX(:,:,:) = 0. - END IF -! - ALLOCATE (ZEM_TRIG(INB_CELL)) - ALLOCATE (INB_FLASH(INB_CELL)) - ALLOCATE (INB_FL_REAL(INB_CELL)) - ALLOCATE (INBSEG(INB_CELL)) - ALLOCATE (INBSEG_ALL(INB_CELL)) - ALLOCATE (ITYPE(INB_CELL)) - ALLOCATE (INBSEG_LEADER(INB_CELL)) - ALLOCATE (ZDQDT(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)+1)) - ALLOCATE (ZSIGMA(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)-1)) - ALLOCATE (ZLBDAR(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) - ALLOCATE (ZLBDAS(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) - ALLOCATE (ZLBDAG(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) - IF (KRR == 7) ALLOCATE (ZLBDAH(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) - ALLOCATE (ZSIGLOB(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) - ALLOCATE (ZFLASH(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),INB_CELL)) - ALLOCATE (ZDIST(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) - ALLOCATE (ZQFLASH(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) - ALLOCATE (GATTACH(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) -! - ISEG_LOC(:,:) = 0 - ZCOORD_TRIG(:,:) = 0. - ZCOORD_SEG(:,:) = 0. - ZDQDT(:,:,:,:) = 0. - ZSIGMA(:,:,:,:) = 0. - ZLBDAR(:,:,:) = 0. - ZLBDAS(:,:,:) = 0. - ZLBDAG(:,:,:) = 0. - ZSIGLOB(:,:,:) = 0. - ZFLASH(:,:,:,:) = 0. - ZDIST(:,:,:) = 0. - ZQFLASH(:,:,:) = 0. - ZEM_TRIG(:) = 0. - INB_FLASH(:) = 0 - INB_FL_REAL(:) = 0 - INBSEG(:) = 0 - INBSEG_ALL(:) = 0 - INBSEG_PROC(:) = 0 - INBSEG_LEADER(:) = 0 - ITYPE(:) = 1 ! default = IC -! -! -!------------------------------------------------------------------------------- -! -!* 3. COMPUTE THE EFFICIENT CROSS SECTIONS OF HYDROMETEORS -! ---------------------------------------------------- -! -!* 3.1 for cloud droplets -! - WHERE (PRT(:,:,:,2) > ZCLOUDLIM) - ZSIGMA(:,:,:,1) = XFQLIGHTC * PRHODREF(:,:,:) * PRT(:,:,:,2) - ENDWHERE -! -! -!* 3.2 for raindrops -! - WHERE (PRT(:,:,:,3) > 0.0) - ZLBDAR(:,:,:) = XLBR * (PRHODREF(:,:,:) * & - MAX(PRT(:,:,:,3),XRTMIN(3)))**XLBEXR - END WHERE -! - WHERE (PRT(:,:,:,3) > ZCLOUDLIM .AND. ZLBDAR(:,:,:) < XLBDAR_MAXE .AND. & - ZLBDAR(:,:,:) > 0.) - ZSIGMA(:,:,:,2) = XFQLIGHTR * ZLBDAR(:,:,:)**XEXQLIGHTR - END WHERE -! -! -!* 3.3 for ice crystals -! - WHERE (PRT(:,:,:,4) > ZCLOUDLIM .AND. PCIT(:,:,:) > 1.E4) - ZSIGMA(:,:,:,3) = XFQLIGHTI * PCIT(:,:,:)**(1.-XEXQLIGHTI) * & - ((PRHODREF(:,:,:) * PRT(:,:,:,4))**XEXQLIGHTI) - ENDWHERE -! -! -!* 3.4 for snow -! - WHERE (PRT(:,:,:,5) > 0.0) - ZLBDAS(:,:,:) = MIN(XLBDAS_MAXE, & - XLBS * (PRHODREF(:,:,:) * & - MAX(PRT(:,:,:,5),XRTMIN(5)))**XLBEXS) - END WHERE -! - WHERE (PRT(:,:,:,5) > ZCLOUDLIM .AND. ZLBDAS(:,:,:) < XLBDAS_MAXE .AND. & - ZLBDAS(:,:,:) > 0.) - ZSIGMA(:,:,:,4) = XFQLIGHTS * ZLBDAS(:,:,:)**XEXQLIGHTS - ENDWHERE -! -! -!* 3.5 for graupel -! - WHERE (PRT(:,:,:,6) > 0.0) - ZLBDAG(:,:,:) = XLBG * (PRHODREF(:,:,:) * MAX(PRT(:,:,:,6),XRTMIN(6)))**XLBEXG - END WHERE -! - WHERE (PRT(:,:,:,6) > ZCLOUDLIM .AND. ZLBDAG(:,:,:) < XLBDAG_MAXE .AND. & - ZLBDAG(:,:,:) > 0.) - ZSIGMA(:,:,:,5) = XFQLIGHTG * ZLBDAG(:,:,:)**XEXQLIGHTG - ENDWHERE -! -! -!* 3.6 for hail -! - IF (KRR == 7) THEN - WHERE (PRT(:,:,:,7) > 0.0) - ZLBDAH(:,:,:) = XLBH * (PRHODREF(:,:,:) * & - MAX(PRT(:,:,:,7), XRTMIN(7)))**XLBEXH - END WHERE -! - WHERE (PRT(:,:,:,7) > ZCLOUDLIM .AND. ZLBDAH(:,:,:) < XLBDAH_MAXE .AND. & - ZLBDAH(:,:,:) > 0.) - ZSIGMA(:,:,:,6) = XFQLIGHTH * ZLBDAH(:,:,:)**XEXQLIGHTH - ENDWHERE - END IF -! -! -!* 3.7 sum of the efficient cross sections -! - ZSIGLOB(:,:,:) = ZSIGMA(:,:,:,1) + ZSIGMA(:,:,:,2) + ZSIGMA(:,:,:,3) + & - ZSIGMA(:,:,:,4) + ZSIGMA(:,:,:,5) -! - IF (KRR == 7) ZSIGLOB(:,:,:) = ZSIGLOB(:,:,:) + ZSIGMA(:,:,:,6) -! -IF (KRR == 7) THEN - CALL MPPDB_CHECK3DM("flash:: ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH",PRECISION,& - ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH,& - ZSIGMA(:,:,:,1),ZSIGMA(:,:,:,2),ZSIGMA(:,:,:,3),ZSIGMA(:,:,:,4),& - ZSIGMA(:,:,:,5),ZSIGMA(:,:,:,6)) -ELSE - CALL MPPDB_CHECK3DM("flash:: ZLBDAR,ZLBDAS,ZLBDAG",PRECISION,& - ZLBDAR,ZLBDAS,ZLBDAG,& - ZSIGMA(:,:,:,1),ZSIGMA(:,:,:,2),ZSIGMA(:,:,:,3),ZSIGMA(:,:,:,4),& - ZSIGMA(:,:,:,5)) -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 4. FIND THE TRIGGERING POINT IN EACH CELL -! -------------------------------------- -! - ALLOCATE (IPROC_TRIG(INB_CELL)) - ALLOCATE (ISIGNE_EZ(INB_CELL)) - ALLOCATE (GNEW_FLASH(INB_CELL)) - ALLOCATE (ZNEUT_POS(INB_CELL)) - ALLOCATE (ZNEUT_NEG(INB_CELL)) -! - IPROC_TRIG(:) = 0 - ISIGNE_EZ(:) = 0 - GNEW_FLASH(:) = .FALSE. - ZNEUT_POS(:) = 0. - ZNEUT_NEG(:) = 0. -! - CALL TRIG_POINT -! -! -!------------------------------------------------------------------------------- -! -!* 4. FLASH TRIGGERING -! ---------------- -! - IFLASH_COUNT = 0 - IFLASH_COUNT_GLOB = 0 -! - DO WHILE (GNEW_FLASH_GLOB) -! - GATTACH(:,:,:) = .FALSE. -! - DO IL = 1, INB_CELL - IF (GNEW_FLASH(IL)) THEN - ZFLASH(:,:,:,IL) = 0. -! update lightning informations - INB_FLASH(IL) = INB_FLASH(IL) + 1 ! nb of flashes / cell / time step - INB_FL_REAL(IL) = INB_FL_REAL(IL) + 1 ! nb of flashes / cell / time step - INBSEG(IL) = 0 ! nb of segments / flash - ITYPE(IL) = 1 -! - IF (IPROC .EQ. IPROC_TRIG(IL)) THEN - ZEMOD_BL = ZEM_TRIG(IL) - IIBL_LOC = ISEG_LOC(1,IL) - IJBL_LOC = ISEG_LOC(2,IL) - IKBL = ISEG_LOC(3,IL) -! - INBSEG(IL) = 1 ! nb of segments / flash - ZFLASH(IIBL_LOC,IJBL_LOC,IKBL,IL) = 1. - ENDIF -! - GCG = .FALSE. - GCG_POS = .FALSE. - - CALL MPPDB_CHECK3DM("flash:: 4. ZFLASH(IL)",PRECISION,& - ZFLASH(:,:,:,IL)) -! -! -!------------------------------------------------------------------------------- -! -!* 5. PROPAGATE THE BIDIRECTIONAL LEADER -! ---------------------------------- -! -! it is assumed that the leader propagates only along the vertical -! -!* 5.1 positive segments -! -! the positive leader propagates parallel to the electric field - ISIGN_LEADER = 1 - CALL ONE_LEADER - IPOS_LEADER = INBSEG(IL) -1 -! -! -!* 5.2 negative segments -! -! the negative leader propagates anti-parallel to the electric field - ZEMOD_BL = ZEM_TRIG(IL) - IKBL = ISEG_LOC(3,IL) - ISIGN_LEADER = -1 - CALL ONE_LEADER -! - INBSEG_LEADER(IL) = INBSEG(IL) - INEG_LEADER = INBSEG_LEADER(IL) - IPOS_LEADER - 1 -! -! Eliminate this flash if only positive or negative leader exists - IF (IPROC .EQ. IPROC_TRIG(IL)) THEN - IF (IPOS_LEADER .EQ. 0 .OR. INEG_LEADER .EQ. 0) THEN - ZFLASH(IIBL_LOC,IJBL_LOC,IKB:IKE,IL) = 0. - INB_FL_REAL(IL) = INB_FL_REAL(IL) - 1 - GNEW_FLASH(IL) = .FALSE. - ELSE ! return to actual Triggering electrical field - IIBL_LOC = ISEG_LOC(1,IL) - IJBL_LOC = ISEG_LOC(2,IL) - IKBL = ISEG_LOC(3,IL) - ZEM_TRIG(IL) = ZEM_TRIG(IL)/ZPRES_COEF(IIBL_LOC,IJBL_LOC,IKBL) - ENDIF - ENDIF - - CALL MPPDB_CHECK3DM("flash:: 5. ZFLASH(IL)",PRECISION,& - ZFLASH(:,:,:,IL)) -! - CALL MPI_BCAST (GNEW_FLASH(IL),1, MNHLOG_MPI, IPROC_TRIG(IL), & - NMNH_COMM_WORLD, IERR) - CALL MPI_BCAST (ZEM_TRIG(IL), 1, MNHREAL_MPI, IPROC_TRIG(IL), & - NMNH_COMM_WORLD, IERR) - CALL MPI_BCAST (INB_FL_REAL(IL), 1, MNHINT_MPI, IPROC_TRIG(IL), & - NMNH_COMM_WORLD, IERR) - END IF - END DO ! end loop il -! -! -!------------------------------------------------------------------------------- -! -!* 6. POSITIVE AND NEGATIVE REGIONS WHERE THE FLASH CAN PROPAGATE -! ----------------------------------------------------------- -! -! Note: this is done to avoid branching in a third charge region: -! the branches 'stay' in the 2 charge regions where the bileader started to propagate -! -!* 6.1 positive charge region associated to the negative leader -! - ALLOCATE (GPROP(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),INB_CELL)) - GPROP(:,:,:,:) = .FALSE. -! - GPOSITIVE = .TRUE. - CALL CHARGE_POCKET -! -! -!* 6.2 negative charge region associated to the positive leader -! - GPOSITIVE = .FALSE. - CALL CHARGE_POCKET -! -! => a point can be added to the flash only if gprop = true -! -! -!------------------------------------------------------------------------------- -! -!* 7. NUMBER OF POINTS TO REDISTRIBUTE AT DISTANCE D -! ---------------------------------------------- -! -!* 7.1 distance between the triggering point and each point of the mask -!* global coordinates: only points possibly contributing to branches -! - INB_NEUT_OK = 0 -! - DO IL = 1, INB_CELL - IF (GNEW_FLASH(IL)) THEN - INB_PROP = COUNT(GPROP(IIB:IIE,IJB:IJE,IKB:IKE,IL)) - CALL SUM_ELEC_ll(INB_PROP) -! - IF (INB_PROP .GT. 0) THEN - ZDIST(:,:,:) = 0. - DO II = IIB, IIE - DO IJ = IJB, IJE - DO IK = IKB, IKE - IF (GPROP(II,IJ,IK,IL)) THEN - ZDIST(II,IJ,IK) = ((XXHATM(II) - ZCOORD_TRIG(1,IL))**2 + & - (XYHATM(IJ) - ZCOORD_TRIG(2,IL))**2 + & - (ZZMASS(II,IJ,IK) - ZCOORD_TRIG(3,IL))**2)**0.5 - END IF - END DO - END DO - END DO -! -! -!* 7.3 compute the min and max distance from the triggering point - global -! - ZMIN_DIST = 0.0 - ZMAX_DIST = MAX_ll(ZDIST,IPROC_AUX) -! -! transform the min and max distances into min and max increments - IIND_MIN = 1 - IIND_MAX = MAX(1, INT((ZMAX_DIST-ZMIN_DIST)/ZMEAN_GRID +1.)) - IDELTA_IND = IIND_MAX + 1 -! - ALLOCATE (IHIST_LOC(IDELTA_IND)) - ALLOCATE (ZHIST_PERCENT(IDELTA_IND)) - ALLOCATE (IHIST_GLOB(IDELTA_IND)) - ALLOCATE (ZMAX_BRANCH(IDELTA_IND)) - ALLOCATE (IMAX_BRANCH(IDELTA_IND)) - ALLOCATE (IMASKQ_DIST(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) -! - IHIST_LOC(:) = 0 - ZHIST_PERCENT(:) = 0. - IHIST_GLOB(:) = 0 - ZMAX_BRANCH(:) = 0. - IMAX_BRANCH(:) = 0 - IMASKQ_DIST(:,:,:) = 0 -! -! -!* 7.4 histogram: number of points between r and r+dr -!* for each proc -! -! build an array with the possible points: IMASKQ_DIST contains the distance -! rank of points contributing to branches, excluding the leader points -! - DO II = IIB, IIE - DO IJ = IJB, IJE - DO IK = IKB, IKE - IF (ZDIST(II,IJ,IK) .NE. 0.) THEN - IM = INT( (ZDIST(II,IJ,IK)-ZMIN_DIST)/ZMEAN_GRID + 1.) - IHIST_LOC(IM) = IHIST_LOC(IM) + 1 - IMASKQ_DIST(II,IJ,IK) = IM - ENDIF - END DO - END DO - END DO -! -! -!* 7.5 global histogram -! - IHIST_GLOB(:) = IHIST_LOC(:) - CALL SUM_ELEC_ll(IHIST_GLOB) -! -! -!* 7.6 normalization -! - ZHIST_PERCENT(:) = 0. - ZMAX_BRANCH(:) = 0. - IMAX_BRANCH(:) = 0 -! - DO IM = 1, IDELTA_IND - IF (IHIST_GLOB(IM) .GT. 0) THEN - ZHIST_PERCENT(IM) = REAL(IHIST_LOC(IM)) / REAL(IHIST_GLOB(IM)) - END IF -! -! -!------------------------------------------------------------------------------- -! -!* 8. BRANCHES -! -------- -! -!* 8.1 max number of branches at distance d from the triggering point -! - ZMAX_BRANCH(IM) = (XDFRAC_L / ZMEAN_GRID) * & - REAL(IIND_MIN+IM-1)**(XDFRAC_ECLAIR - 1.) - ZMAX_BRANCH(IM) = ANINT(ZMAX_BRANCH(IM)) -! all procs know the max total number of branches at distance d -! => the max number of branches / proc is proportional to the percentage of -! available points / proc at this distance -! - IMAX_BRANCH(IM) = INT(ANINT(ZMAX_BRANCH(IM))) - END DO -! - DEALLOCATE (IHIST_LOC) - DEALLOCATE (ZHIST_PERCENT) - DEALLOCATE (IHIST_GLOB) - DEALLOCATE (ZMAX_BRANCH) -! -! -!* 8.3 distribute the branches -! -! - CALL BRANCH_GEOM(IKB, IKE) -! - DEALLOCATE (IMAX_BRANCH) - DEALLOCATE (IMASKQ_DIST) - END IF ! end if count(gprop) -! -! -!------------------------------------------------------------------------------- -! -!* 9. NEUTRALIZATION -! -------------- - CALL MPPDB_CHECK3DM("flash:: 9. ZQMTOT",PRECISION,ZQMTOT) - CALL MPPDB_CHECK3DM("flash:: 9. ZFLASH",PRECISION,ZFLASH(:,:,:,IL)) -! -!* 9.1 charge carried by the lightning flash -! - ZQFLASH(:,:,:) = 0. - WHERE (ZFLASH(IIB:IIE,IJB:IJE,IKB:IKE,IL) .GT. 0. .AND. & - ABS(ZQMTOT(IIB:IIE,IJB:IJE,IKB:IKE) * & - PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) .GT. XQNEUT .AND. & - ZSIGLOB(IIB:IIE,IJB:IJE,IKB:IKE) .GE. ZSIGMIN) - ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) = -1. * & - (ABS(ZQMTOT(IIB:IIE,IJB:IJE,IKB:IKE)) / & - ZQMTOT(IIB:IIE,IJB:IJE,IKB:IKE)) * & - (ABS(ZQMTOT(IIB:IIE,IJB:IJE,IKB:IKE)) - & - (XQNEUT / PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE))) - GATTACH(IIB:IIE,IJB:IJE,IKB:IKE) = .TRUE. - - END WHERE -! -! net charge carried by the flash (for charge conservation / IC) - ZQNET = SUM3D_ll(ZQFLASH*PRHODJ, IINFO_ll) -! -! -!* 9.2 number of points to neutralize -! - INB_NEUT = COUNT(ZSIGLOB(IIB:IIE,IJB:IJE,IKB:IKE) .GE. ZSIGMIN .AND. & - ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) .NE. 0.) - CALL SUM_ELEC_ll(INB_NEUT) - -! -! -!* 9.3 ensure total charge conservation for IC -! - IF (INB_NEUT .GE. 3) THEN - GNEUTRALIZATION = .TRUE. - ELSE - GNEUTRALIZATION = .FALSE. - GNEW_FLASH(IL) = .FALSE. - INB_FL_REAL(IL) = INB_FL_REAL(IL) - 1 - END IF -! - IF (GNEUTRALIZATION .AND. (.NOT. GCG) .AND. ZQNET .NE. 0.) THEN - ZQNET = ZQNET / REAL(INB_NEUT) - WHERE (ZSIGLOB(IIB:IIE,IJB:IJE,IKB:IKE) .GE. ZSIGMIN .AND. & - ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) .NE. 0.) - ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) = ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) - & - ZQNET / PRHODJ(IIB:IIE,IJB:IJE,IKB:IKE) - ENDWHERE - END IF -! -! -!* 9.4 charge neutralization -! - CALL MPPDB_CHECK3DM("flash:: 9.4 ZQFLASH,ZSIGLOB",PRECISION,& - ZQFLASH,ZSIGLOB) - - ZDQDT(:,:,:,:) = 0. -! - IF (GNEUTRALIZATION) THEN - IF (ITYPE(IL) .EQ. 1.) THEN - WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) < 0.) - ! increase negative ion charge - ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_ELEC) = & - ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_ELEC) + & - ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) - ENDWHERE -! - WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) > 0.) - ! Increase positive ion charge - ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,1) = & - ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,1) + & - ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) - ENDWHERE -! -! -!* 9.4.2 cloud-to-ground flashes -! - ELSE -! -! Neutralization of the charge on positive CG flashes - IF (ITYPE(IL) .EQ. 3) THEN - DO II = 1, NSV_ELEC - WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) > 0.) - ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,II) = & - ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,II) - & - ZQMT(IIB:IIE,IJB:IJE,IKB:IKE,II) - END WHERE - ENDDO -! - WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) > 0.) - ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE)=0. - END WHERE -! - WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) < 0.) -! Increase negative ion charge - ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_ELEC) = & - ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_ELEC) + & - ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) - ENDWHERE - ELSE -! -! Neutralization of the charge on negative CG flashes -! - DO II = 1, NSV_ELEC - WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) < 0.) - ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,II) = & - ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,II) - & - ZQMT(IIB:IIE,IJB:IJE,IKB:IKE,II) - END WHERE - ENDDO -! - WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) < 0.) - ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE)=0. - END WHERE -! - WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) > 0.) - ! Increase positive ion charge - ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,1) = & - ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,1) + & - ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) - ENDWHERE - END IF ! GCG_POS - END IF ! NOT(GCG) -! -! Counting the total number of points neutralized in the cell - IF (IPROC .EQ. IPROC_TRIG(IL)) THEN - INB_NEUT_OK = INB_NEUT_OK + INB_NEUT - END IF -! - CALL MPI_BCAST (INB_NEUT_OK,1, MNHINT_MPI, IPROC_TRIG(IL), & - NMNH_COMM_WORLD, IERR) -! -!* 9.5 Gather lightning information from all processes -!* Save the particule charge and total pos/neg charge neutralization points. -!* the coordinates of all flash branch points -! - CALL MPI_ALLGATHER(INBSEG(IL), 1, MNHINT_MPI, & - INBSEG_PROC, 1, MNHINT_MPI, NMNH_COMM_WORLD, IERR) - - INBSEG_ALL(IL) = INBSEG(IL) - CALL SUM_ELEC_ll(INBSEG_ALL(IL)) - - CALL GATHER_ALL_BRANCH -! -!* 9.6 update the source term -! - CALL MPPDB_CHECK3DM("flash:: 9.6 PRSVS",PRECISION,& - PRSVS(:,:,:,1),PRSVS(:,:,:,2),PRSVS(:,:,:,3),PRSVS(:,:,:,4),& - PRSVS(:,:,:,5),PRSVS(:,:,:,6),PRSVS(:,:,:,7)) - CALL MPPDB_CHECK3DM("flash:: 9.6 ZDQDT",PRECISION,& - ZDQDT(:,:,:,1),ZDQDT(:,:,:,2),ZDQDT(:,:,:,3),ZDQDT(:,:,:,4),& - ZDQDT(:,:,:,5),ZDQDT(:,:,:,6),ZDQDT(:,:,:,7)) - - DO II = IIB, IIE - DO IJ = IJB, IJE - DO IK = IKB, IKE - DO IM = 1, NSV_ELEC - IF (ZDQDT(II,IJ,IK,IM) .NE. 0.) THEN - PRSVS(II,IJ,IK,IM) = PRSVS(II,IJ,IK,IM) + & - ZDQDT(II,IJ,IK,IM) * & - PRHODJ(II,IJ,IK) / PTSTEP - END IF -! -! -!* 9.7 update the positive and negative charge neutralized -! - IF (ZDQDT(II,IJ,IK,IM) .LT. 0.) THEN - ZNEUT_NEG(IL) = ZNEUT_NEG(IL) + ZDQDT(II,IJ,IK,IM) * & - PRHODJ(II,IJ,IK) - ELSE IF (ZDQDT(II,IJ,IK,IM) .GT. 0.) THEN - ZNEUT_POS(IL) = ZNEUT_POS(IL) + ZDQDT(II,IJ,IK,IM) * & - PRHODJ(II,IJ,IK) - END IF - END DO - END DO - END DO - END DO -! - CALL SUM_ELEC_ll(ZNEUT_POS(IL)) - CALL SUM_ELEC_ll(ZNEUT_NEG(IL)) -! -! -!* 9.8 compute the NOx production -! -!! The lightning length is first computed. The number of NOx molecules per -!! meter of lightning flash is taken from Wang et al. (1998). It is a linear -!! function of the pressure. No distinction is made between ICs and CGs. - - IF (LLNOX_EXPLICIT) THEN - IFLASH_COUNT_GLOB = IFLASH_COUNT_GLOB + 1 - IF (INBSEG(IL) .NE. 0) THEN - DO II = 0, INBSEG(IL)-1 - IM = 3 * II - IX = ISEG_GLOB(IM+1,IL) - IXOR + 1 - IY = ISEG_GLOB(IM+2,IL) - IYOR + 1 - IZ = ISEG_GLOB(IM+3,IL) - ZLGHTLENGTH = (XDXX(IX,IY,IZ) * XDYY(IX,IY,IZ) * & - XDZZ(IX,IY,IZ))**(1./3.) - ZLNOX(IX, IY, IZ) = ZLNOX(IX, IY, IZ) + & - (XWANG_A + XWANG_B * PPABST(IX,IY,IZ)) * & - ZLGHTLENGTH - ENDDO - IFLASH_COUNT = IFLASH_COUNT + 1 - END IF - END IF - END IF ! GNEUTRALIZATION - END IF ! end if gnew_flash - END DO ! end loop il -! - DEALLOCATE (GPROP) -! -! -!---------------------------------------------------------------------------- -! -!* 10. PRINT OR SAVE (before print) LIGHTNING INFORMATIONS -! --------------------------------------------------- -! -! Synchronizing all processes -! CALL MPI_BARRIER(NMNH_COMM_WORLD, IERR) ! A ACTIVER SI PB. -! - INBLIGHT = COUNT(GNEW_FLASH(1:INB_CELL)) - IF (IPROC .EQ. 0) THEN - IF (INBLIGHT .NE. 0) THEN - IF ((NNBLIGHT+INBLIGHT) .LE. NFLASH_WRITE) THEN ! SAVE - ISAVE_STATUS = 1 - DO IL = 1, INB_CELL - IF (GNEW_FLASH(IL)) THEN - NNBLIGHT = NNBLIGHT + 1 - ISFLASH_NUMBER(NNBLIGHT) = ISFLASH_NUMBER(NNBLIGHT-1) + 1 - ISNB_FLASH(NNBLIGHT) = INB_FL_REAL(IL) - ISNBSEG(NNBLIGHT) = INBSEG_ALL(IL) - ISCELL_NUMBER(NNBLIGHT) = IL - ISTCOUNT_NUMBER(NNBLIGHT) = KTCOUNT - ISTYPE(NNBLIGHT) = ITYPE(IL) - ZSEM_TRIG(NNBLIGHT) = ZEM_TRIG(IL) / 1000. - ZSNEUT_POS(NNBLIGHT) = ZNEUT_POS(IL) - ZSNEUT_NEG(NNBLIGHT) = ZNEUT_NEG(IL) -! - DO II = 1, INBSEG_ALL(IL) - IM = 3 * (II - 1) - ZSCOORD_SEG(NNBLIGHT,II,1:3) = ZCOORD_SEG_ALL(IM+1:IM+3,IL) - ENDDO -! - IF(LLMA) THEN - DO II = 1, INBSEG_ALL(IL) - IM = 3 * (II - 1) - ISLMA_SEG_GLOB(NNBLIGHT,II,1:3) = ILMA_SEG_ALL(IM+1:IM+3,IL) - IM = NSV_ELEC * (II - 1) - ZSLMA_QMT(NNBLIGHT,II,2:6) = ZLMA_QMT(IM+2:IM+6,IL) - ZSLMA_PRT(NNBLIGHT,II,2:6) = ZLMA_PRT(IM+2:IM+6,IL) - ZSLMA_NEUT_POS(NNBLIGHT,II) = ZLMA_NEUT_POS(II,IL) - ZSLMA_NEUT_NEG(NNBLIGHT,II) = ZLMA_NEUT_NEG(II,IL) - END DO - END IF ! llma - END IF ! gnew_flash - END DO ! end loop il -! - IF (NNBLIGHT .EQ. NFLASH_WRITE) ISAVE_STATUS = 0 -! - ELSE ! Print in output files - ISAVE_STATUS = 2 - END IF -! - IF (ISAVE_STATUS .EQ. 0 .OR. ISAVE_STATUS .EQ. 2) THEN - CALL WRITE_OUT_ASCII - IF(LLMA) THEN - CALL WRITE_OUT_LMA - END IF - ISFLASH_NUMBER(0) = ISFLASH_NUMBER(NNBLIGHT) - END IF -! - IF (ISAVE_STATUS .EQ. 2) THEN ! Save flashes of the temporal loop - NNBLIGHT = 0 - DO IL = 1, INB_CELL - IF (GNEW_FLASH(IL)) THEN - NNBLIGHT = NNBLIGHT + 1 - ISFLASH_NUMBER(NNBLIGHT) = ISFLASH_NUMBER(NNBLIGHT-1) + 1 - ISNB_FLASH(NNBLIGHT) = INB_FL_REAL(IL) - ISNBSEG(NNBLIGHT) = INBSEG_ALL(IL) - ISCELL_NUMBER(NNBLIGHT) = IL - ISTCOUNT_NUMBER(NNBLIGHT) = KTCOUNT - ISTYPE(NNBLIGHT) = ITYPE(IL) - ZSEM_TRIG(NNBLIGHT) = ZEM_TRIG(IL) / 1000. - ZSNEUT_POS(NNBLIGHT) = ZNEUT_POS(IL) - ZSNEUT_NEG(NNBLIGHT) = ZNEUT_NEG(IL) -! - DO II = 1, INBSEG_ALL(IL) - IM = 3 * (II - 1) - ZSCOORD_SEG(NNBLIGHT, II, 1:3) = ZCOORD_SEG_ALL(IM+1:IM+3, IL) - ENDDO -! - IF(LLMA) THEN - DO II = 1, INBSEG_ALL(IL) - IM = 3 * (II - 1) - ISLMA_SEG_GLOB(NNBLIGHT,II,1:3) = ILMA_SEG_ALL(IM+1:IM+3,IL) - IM = NSV_ELEC*(II-1) - ZSLMA_QMT(NNBLIGHT,II,2:6) = ZLMA_QMT(IM+2:IM+6,IL) - ZSLMA_PRT(NNBLIGHT,II,2:6) = ZLMA_PRT(IM+2:IM+6,IL) - ZSLMA_NEUT_POS(NNBLIGHT,II) = ZLMA_NEUT_POS(II,IL) - ZSLMA_NEUT_NEG(NNBLIGHT,II) = ZLMA_NEUT_NEG(II,IL) - END DO - END IF - END IF - ENDDO - END IF -! - IF (ISAVE_STATUS .EQ. 0) THEN - NNBLIGHT = 0 - END IF - END IF ! INBLIGHT - END IF ! IPROC -! -! Save flash location statistics in all processes - IF (INBLIGHT .NE. 0) THEN - DO IL = 1, INB_CELL - IF (GNEW_FLASH(IL)) THEN - IMAP2D(:,:) = 0 - DO IK = IKB, IKE - IMAP2D(:,:) = IMAP2D(:,:) + ZFLASH(:,:,IK,IL) - END DO -! -! Detect Trig/Impact X,Y location - IX = 0 - IY = 0 - GFIRSTFLASH = .FALSE. - DO II = IIB, IIE - DO IJ = IJB, IJE - DO IK = IKB, IKE - IF (GFIRSTFLASH) EXIT - IF (ZFLASH(II,IJ,IK,IL)==1.) THEN - IX = II - IY = IJ - GFIRSTFLASH = .TRUE. - END IF - END DO - END DO - END DO -! -! Store - IF (ITYPE(IL)==1) THEN ! IC - IF (IX*IY/=0) NMAP_TRIG_IC(IX,IY) = NMAP_TRIG_IC(IX,IY) + 1 - NMAP_2DAREA_IC(:,:) = NMAP_2DAREA_IC(:,:) + MIN(1,IMAP2D(:,:)) - NMAP_3DIC(:,:,:) = NMAP_3DIC(:,:,:) + ZFLASH(:,:,:,IL) - ELSE ! CGN & CGP - IF (IX*IY/=0) NMAP_IMPACT_CG(IX,IY) = NMAP_IMPACT_CG(IX,IY) + 1 - NMAP_2DAREA_CG(:,:) = NMAP_2DAREA_CG(:,:) + MIN(1,IMAP2D(:,:)) - NMAP_3DCG(:,:,:) = NMAP_3DCG(:,:,:) + ZFLASH(:,:,:,IL) - END IF - END IF - ENDDO - END IF ! INBLIGHT -! -!------------------------------------------------------------------------------ -! -!* 11. ATTACHMENT AFTER CHARGE NEUTRALIZATION -! -------------------------------------- -! -!* 11.1 ion attachment -! - IF (INB_NEUT_OK .NE. 0) THEN - - CALL MPPDB_CHECK3DM("flash:: PRSVS",PRECISION,& - PRSVS(:,:,:,1),PRSVS(:,:,:,2),PRSVS(:,:,:,3),PRSVS(:,:,:,4),& - PRSVS(:,:,:,5),PRSVS(:,:,:,6),PRSVS(:,:,:,7)) - - PRSVS(:,:,:,1) = PRSVS(:,:,:,1) / XECHARGE - PRSVS(:,:,:,NSV_ELEC) = - PRSVS(:,:,:,NSV_ELEC) / XECHARGE -! - CALL ION_ATTACH_ELEC(KTCOUNT, KRR, PTSTEP, PRHODREF, & - PRHODJ, PRSVS, PRS, PTHT, PCIT, PPABST, PEFIELDU, & - PEFIELDV, PEFIELDW, GATTACH, PTOWN, PSEA ) -! - PRSVS(:,:,:,1) = PRSVS(:,:,:,1) * XECHARGE - PRSVS(:,:,:,NSV_ELEC) = - PRSVS(:,:,:,NSV_ELEC) * XECHARGE - - CALL MPPDB_CHECK3DM("flash:: after ION PRSVS",PRECISION,& - PRSVS(:,:,:,1),PRSVS(:,:,:,2),PRSVS(:,:,:,3),PRSVS(:,:,:,4),& - PRSVS(:,:,:,5),PRSVS(:,:,:,6),PRSVS(:,:,:,7)) - ENDIF -! -! -!* 11.2 update the charge density to check if another flash can be triggered -! - ZQMTOT(:,:,:) = 0. - DO II = 1, NSV_ELEC -! transform the source term (C/s) into the updated charge density (C/kg) - ZQMT(:,:,:,II) = PRSVS(:,:,:,II) * PTSTEP / PRHODJ(:,:,:) -! -! total charge density (C/kg) - ZQMTOT(:,:,:) = ZQMTOT(:,:,:) + PRSVS(:,:,:,II) * PTSTEP / PRHODJ(:,:,:) - END DO -! -! -!------------------------------------------------------------------------------- -! -!* 12. CHECK IF ANOTHER FLASH CAN BE TRIGGERED -! --------------------------------------- -! - - IF ((MAXVAL(INB_FLASH(:))+1) < INBFTS_MAX) THEN - IF (INB_NEUT_OK .NE. 0) THEN - CALL MPPDB_CHECK3DM("flash:: PRHODJ,PRT",PRECISION,& - PRHODJ,PRT(:,:,:,1),PRT(:,:,:,2),PRT(:,:,:,3),PRT(:,:,:,4),& - PRT(:,:,:,5),PRT(:,:,:,6)) - CALL MPPDB_CHECK3DM("flash:: ZQMT",PRECISION,& - ZQMT(:,:,:,1),ZQMT(:,:,:,2),ZQMT(:,:,:,3),ZQMT(:,:,:,4),& - ZQMT(:,:,:,5),ZQMT(:,:,:,6),ZQMT(:,:,:,7)) - CALL TO_ELEC_FIELD_n (PRT, ZQMT, PRHODJ, KTCOUNT, KRR, & - PEFIELDU, PEFIELDV, PEFIELDW) - CALL MPPDB_CHECK3DM("flash:: PEFIELDU, PEFIELDV, PEFIELDW",PRECISION,& - PEFIELDU, PEFIELDV, PEFIELDW) -! electric field module including pressure effect - ZEMODULE(IIB:IIE,IJB:IJE,IKB:IKE) = ZPRES_COEF(IIB:IIE,IJB:IJE,IKB:IKE)* & - (PEFIELDU(IIB:IIE,IJB:IJE,IKB:IKE)**2 + & - PEFIELDV(IIB:IIE,IJB:IJE,IKB:IKE)**2 + & - PEFIELDW(IIB:IIE,IJB:IJE,IKB:IKE)**2)**0.5 - ENDIF -! - ISEG_LOC(:,:) = 0 - ZCOORD_TRIG(:,:) = 0. - ZCOORD_SEG(:,:) = 0. - IPROC_TRIG(:) = 0 - ISIGNE_EZ(:) = 0 -! - CALL TRIG_POINT - ELSE - GNEW_FLASH_GLOB = .FALSE. - END IF -! - ZNEUT_POS(:) = 0. - ZNEUT_NEG(:) = 0. -! - IF (LLMA) THEN - ZLMA_NEUT_POS(:,:) = 0. - ZLMA_NEUT_NEG(:,:) = 0. - END IF - END DO ! end loop do while -! -! -!------------------------------------------------------------------------------- -! -!* 13. COMPUTE THE NOX SOURCE TERM -! --------------------------- -! - IF (LLNOX_EXPLICIT) THEN - IF (IFLASH_COUNT_GLOB .NE. 0) THEN - ZCOEF = XMD / XAVOGADRO - XLNOX_ECLAIR = 0. - IF (IFLASH_COUNT .NE. 0) THEN - XLNOX_ECLAIR = SUM(ZLNOX(:,:,:)) - PSVS_LINOX(:,:,:) = PSVS_LINOX(:,:,:) + ZLNOX(:,:,:) * ZCOEF ! PRHODJ is - ! implicit - END IF - CALL SUM_ELEC_ll (XLNOX_ECLAIR) - XLNOX_ECLAIR = XLNOX_ECLAIR / (XAVOGADRO * REAL(IFLASH_COUNT_GLOB)) - END IF - DEALLOCATE (ZLNOX) - END IF -! - DEALLOCATE (ZNEUT_POS) - DEALLOCATE (ZNEUT_NEG) - DEALLOCATE (ZSIGMA) - DEALLOCATE (ZLBDAR) - DEALLOCATE (ZLBDAS) - DEALLOCATE (ZLBDAG) - IF (KRR == 7) DEALLOCATE (ZLBDAH) - DEALLOCATE (ZSIGLOB) - DEALLOCATE (ZDQDT) - DEALLOCATE (ZDIST) - DEALLOCATE (ZFLASH) - DEALLOCATE (ZQFLASH) - DEALLOCATE (IPROC_TRIG) - DEALLOCATE (ISIGNE_EZ) - DEALLOCATE (GNEW_FLASH) - DEALLOCATE (INBSEG) - DEALLOCATE (INBSEG_ALL) - DEALLOCATE (INBSEG_LEADER) - DEALLOCATE (INB_FLASH) - DEALLOCATE (INB_FL_REAL) - DEALLOCATE (ZEM_TRIG) - DEALLOCATE (ITYPE) - DEALLOCATE (ISEG_LOC) - DEALLOCATE (ZCOORD_TRIG) - DEALLOCATE (ZCOORD_SEG) - DEALLOCATE (ZCOORD_SEG_ALL) - DEALLOCATE (ISEG_GLOB) - DEALLOCATE (GATTACH) - IF(LLMA) THEN - DEALLOCATE (ILMA_SEG_ALL) - DEALLOCATE (ZLMA_QMT) - DEALLOCATE (ZLMA_PRT) - DEALLOCATE (ZLMA_NEUT_POS) - DEALLOCATE (ZLMA_NEUT_NEG) - END IF -END IF ! (inb_cell .ge. 1) -! -! -!------------------------------------------------------------------------------- -! -!* 13. PRINT LIGHTNING INFORMATIONS FOR THE LAST TIMESTEP -! OR LMA_TIME_SAVE IS REACHED IF LLMA OPTION IS USED -! -------------------------------------------------- -! -IF (LLMA) THEN - IF( IPROC .EQ. 0 .AND. TDTCUR%xtime >= TDTLMA%xtime - PTSTEP ) THEN - CALL WRITE_OUT_ASCII - CALL WRITE_OUT_LMA - ISFLASH_NUMBER(0) = ISFLASH_NUMBER(NNBLIGHT) - NNBLIGHT = 0 - END IF -END IF -! -IF (NNBLIGHT .NE. 0 .AND. ((IPROC .EQ. 0 .AND. OEXIT) .OR. & - (KTCOUNT == NSTOP .AND. KMI==1))) THEN - CALL WRITE_OUT_ASCII - IF(LLMA) CALL WRITE_OUT_LMA -END IF -! -! -!------------------------------------------------------------------------------- -! -!* 14. DEALLOCATE -! ---------- -! -DEALLOCATE (ICELL_LOC) -DEALLOCATE (ZQMT) -DEALLOCATE (ZQMTOT) -DEALLOCATE (ZCLOUD) -DEALLOCATE (ZCELL) -DEALLOCATE (ZEMODULE) -! -! -!------------------------------------------------------------------------------- -! -!* 14. BACK TO INPUT UNITS (per kg and per (m3 s)) FOR IONS -! ---------------------------------------------------- -! -PRSVS(:,:,:,1) = PRSVS(:,:,:,1) / XECHARGE ! 1 /(m3 s) -PRSVS(:,:,:,NSV_ELEC) = -PRSVS(:,:,:,NSV_ELEC) / XECHARGE ! 1 /(m3 s) -! -! -!------------------------------------------------------------------------------- -! -CONTAINS -! -!------------------------------------------------------------------------------- -! - SUBROUTINE TRIG_POINT () -! -! Goal : find randomly a triggering point where E > E_trig -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -! -!* 0.1 declaration of dummy arguments -! -!* 0.2 declaration of local variables -! -LOGICAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),INB_CELL) :: & - GTRIG ! mask for the triggering pts -INTEGER :: INB_TRIG ! Nb of pts where triggering is possible -INTEGER :: IWEST_GLOB_TRIG ! western global limit of possible triggering -INTEGER :: IEAST_GLOB_TRIG ! eastern global limit of possible triggering -INTEGER :: ISOUTH_GLOB_TRIG ! southern global limit of possible triggering -INTEGER :: INORTH_GLOB_TRIG ! northern global limit of possible triggering -INTEGER :: IUP_TRIG ! upper limit of possible triggering -INTEGER :: IDOWN_TRIG ! down limit of possible triggering -! -! -!* 1. INITIALIZATIONS -! ----------- -! -GTRIG(:,:,:,:) = .FALSE. -GNEW_FLASH(:) = .FALSE. -GNEW_FLASH_GLOB = .FALSE. -! -! -!* 2. FIND THE POSSIBLE TRIGGERING POINTS -! ----------------------------------- -! -DO IL = 1, INB_CELL - WHERE (ZEMODULE(IIB:IIE,IJB:IJE,IKB:IKE) > ZE_TRIG_THRES .AND. & - ZCELL(IIB:IIE,IJB:IJE,IKB:IKE,IL) .GT. 0.) - GTRIG(IIB:IIE,IJB:IJE,IKB:IKE,IL) = .TRUE. - ENDWHERE -END DO -! -! -!* 3. CHOICE OF THE TRIGGERING POINT -! ------------------------------ -! -!* 3.1 number and coordinates of the possible triggering points -! -INB_TRIG = 0 -DO IL = 1, INB_CELL - INB_TRIG = COUNT(GTRIG(IIB:IIE,IJB:IJE,IKB:IKE,IL)) - CALL SUM_ELEC_ll(INB_TRIG) -! -! -!* 3.2 random choice of the triggering point -! - IF (INB_TRIG .GT. 0) THEN - IFOUND = 0 -! -! find the global limits where GTRIG = T - CALL EXTREMA_ELEC_ll(GTRIG(:,:,:,IL), IWEST_GLOB_TRIG, IEAST_GLOB_TRIG, & - ISOUTH_GLOB_TRIG, INORTH_GLOB_TRIG, & - IDOWN_TRIG, IUP_TRIG) -! - DO WHILE (IFOUND .NE. 1) -! -! random choice of the 3 global ind. - CALL MNH_RANDOM_NUMBER(ZRANDOM) - II_TRIG_GLOB = IWEST_GLOB_TRIG + & - INT(ANINT(ZRANDOM * (IEAST_GLOB_TRIG - IWEST_GLOB_TRIG))) - CALL MNH_RANDOM_NUMBER(ZRANDOM) - IJ_TRIG_GLOB = ISOUTH_GLOB_TRIG + & - INT(ANINT(ZRANDOM * (INORTH_GLOB_TRIG - ISOUTH_GLOB_TRIG))) - CALL MNH_RANDOM_NUMBER(ZRANDOM) - IK_TRIG = IDOWN_TRIG + INT(ANINT(ZRANDOM * (IUP_TRIG - IDOWN_TRIG))) -! -! global ind. --> local ind. of the potential triggering pt - II_TRIG_LOC = II_TRIG_GLOB - IXOR + 1 - IJ_TRIG_LOC = IJ_TRIG_GLOB - IYOR + 1 -! -! test if the randomly chosen pt meets all conditions for triggering - IF ((II_TRIG_LOC .LE. IIE) .AND. (II_TRIG_LOC .GE. IIB) .AND. & - (IJ_TRIG_LOC .LE. IJE) .AND. (IJ_TRIG_LOC .GE. IJB) .AND. & - (IK_TRIG .LE. IKE) .AND. (IK_TRIG .GE. IKB)) THEN - IF (GTRIG(II_TRIG_LOC,IJ_TRIG_LOC,IK_TRIG,IL)) THEN - IFOUND = 1 -! -! update the local coordinates of the flash segments - ISEG_LOC(1,IL) = II_TRIG_LOC - ISEG_LOC(2,IL) = IJ_TRIG_LOC - ISEG_LOC(3,IL) = IK_TRIG -! - ISEG_GLOB(1,IL) = II_TRIG_GLOB - ISEG_GLOB(2,IL) = IJ_TRIG_GLOB - ISEG_GLOB(3,IL) = IK_TRIG -! - ZCOORD_TRIG(1,IL) = XXHATM(II_TRIG_LOC) - ZCOORD_TRIG(2,IL) = XYHATM(IJ_TRIG_LOC) - ZCOORD_TRIG(3,IL) = ZZMASS(II_TRIG_LOC, IJ_TRIG_LOC, IK_TRIG) -! - ZCOORD_SEG(1:3,IL) = ZCOORD_TRIG(1:3,IL) -! -! electric field module at the triggering point - ZEM_TRIG(IL) = ZEMODULE(II_TRIG_LOC,IJ_TRIG_LOC,IK_TRIG) -! -! sign of Ez at the triggering point - ISIGNE_EZ(IL) = 0 - IF (PEFIELDW(II_TRIG_LOC,IJ_TRIG_LOC,IK_TRIG) .GT. 0.) THEN - ISIGNE_EZ(IL) = 1 - ELSE IF (PEFIELDW(II_TRIG_LOC,IJ_TRIG_LOC,IK_TRIG) .LT. 0.) THEN - ISIGNE_EZ(IL) = -1 - END IF - END IF - END IF -! -! broadcast IFOUND and find the proc where IFOUND = 1 - CALL MAX_ELEC_ll (IFOUND, IPROC_TRIG(IL)) -! - END DO -! -! -! -!* 4. BROADCAST USEFULL PARAMETERS -! ---------------------------- -! - CALL MPI_BCAST (ZEM_TRIG(IL), 1, & - MNHREAL_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR) - CALL MPI_BCAST (ISEG_LOC(:,IL), 3*SIZE(PRT,3), & - MNHINT_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR) - CALL MPI_BCAST (ZCOORD_TRIG(:,IL), 3, & - MNHREAL_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR) - CALL MPI_BCAST (ISIGNE_EZ(IL), 1, & - MNHINT_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR) -! -! -!* 5. CHECK IF THE FLASH CAN DEVELOP -! ------------------------------ -! - IF (INB_FLASH(IL) < INBFTS_MAX) THEN - IF (IPROC.EQ.IPROC_TRIG(IL)) THEN - ZCELL(II_TRIG_LOC,IJ_TRIG_LOC,IK_TRIG,IL) = 0. - END IF -! - GNEW_FLASH(IL) = .TRUE. - GNEW_FLASH_GLOB = .TRUE. - CALL MPI_BCAST (GNEW_FLASH(IL),1, MNHLOG_MPI, IPROC_TRIG(IL), & - NMNH_COMM_WORLD, IERR) - CALL MPI_BCAST (GNEW_FLASH_GLOB,1, MNHLOG_MPI, IPROC_TRIG(IL), & - NMNH_COMM_WORLD, IERR) - END IF - END IF -END DO -! -! -END SUBROUTINE TRIG_POINT -! -!------------------------------------------------------------------------------- -! - SUBROUTINE ONE_LEADER () -! -!! Purpose: propagates the bidirectional leader along the vertical -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -! -INTEGER :: IKSTEP, IIDECAL -! -!* 1. BUILD THE POSITIVE/NEGATIVE LEADER -! ---------------------------------- -CALL MPPDB_CHECK3DM("flash:: one_leader ZFLASH",PRECISION,ZFLASH(:,:,:,IL)) -! -IKSTEP = ISIGN_LEADER * ISIGNE_EZ(IL) - ! the positive leader propagates parallel to the electric field - ! while the negative leader propagates anti// to the electric field -ISTOP = 0 -! -! -IF (IPROC .EQ. IPROC_TRIG(IL)) THEN - - DO WHILE (ZEMOD_BL > XEPROP .AND. IKBL > IKB .AND. & - IKBL < IKE .AND. ISTOP .EQ. 0 .AND. & - INBSEG(IL) .LE. (NLEADER_MAX-1)) -! -! local coordinates of the new segment - IIBL_LOC = ISEG_LOC(1,IL) - IJBL_LOC = ISEG_LOC(2,IL) - IKBL = IKBL + IKSTEP - IIDECAL = INBSEG(IL) * 3 -! - ISEG_LOC(IIDECAL+1,IL) = IIBL_LOC - ISEG_LOC(IIDECAL+2,IL) = IJBL_LOC - ISEG_LOC(IIDECAL+3,IL) = IKBL -! - ISEG_GLOB(IIDECAL+1,IL) = IIBL_LOC + IXOR - 1 - ISEG_GLOB(IIDECAL+2,IL) = IJBL_LOC + IYOR - 1 - ISEG_GLOB(IIDECAL+3,IL) = IKBL -! - ZCOORD_SEG(IIDECAL+1,IL) = XXHATM(IIBL_LOC) - ZCOORD_SEG(IIDECAL+2,IL) = XYHATM(IJBL_LOC) - ZCOORD_SEG(IIDECAL+3,IL) = ZZMASS(IIBL_LOC, IJBL_LOC, IKBL) -! - INBSEG(IL) = INBSEG(IL) + 1 -! -! -!* 1.3 test if Ez keeps the same sign -! - IF (PEFIELDW(IIBL_LOC,IJBL_LOC,IKBL) .EQ. 0. .OR. & - INT(ABS(PEFIELDW(IIBL_LOC,IJBL_LOC,IKBL)) / & - PEFIELDW(IIBL_LOC,IJBL_LOC,IKBL)) /= ISIGNE_EZ(IL) .OR. & - ZCELL(IIBL_LOC,IJBL_LOC,IKBL,IL) .EQ. 0.) THEN - ISTOP = 1 -! then this segment is not part of the leader - INBSEG(IL) = INBSEG(IL) - 1 - END IF -! -! -!* 1.4 sign of the induced charge -! - IF (ISTOP .EQ. 0) THEN - ZFLASH(IIBL_LOC,IJBL_LOC,IKBL,IL) = 1. - ZCELL(IIBL_LOC,IJBL_LOC,IKBL,IL) = 0. -! -! -!* 1.6 electric field module at the tip of the leader -! - ZEMOD_BL = ZEMODULE(IIBL_LOC,IJBL_LOC,IKBL) -! -! -!* 1.7 test if the domain boundaries are reached -! - IF ((IIBL_LOC < IIB .AND. LWEST_ll()) .OR. & - (IIBL_LOC > IIE .AND. LEAST_ll()) .OR. & - (IJBL_LOC < IJB .AND. LSOUTH_ll()) .OR. & - (IJBL_LOC > IJE .AND. LNORTH_ll())) THEN - PRINT*,'DOMAIN BOUNDARIES REACHED BY THE LIGHTNING ' - ISTOP = 1 - ENDIF -! - IF (IKBL .LE. IKB) THEN - PRINT*,'THE LIGHTNING FLASH HAS REACHED THE GROUND ' - ISTOP = 1 - GCG = .TRUE. - NNB_CG = NNB_CG + 1 - IF (ISIGN_LEADER > 0) THEN - GCG_POS = .TRUE. - ITYPE(IL) = 3 ! CGP - NNB_CG_POS = NNB_CG_POS + 1 - ELSE - ITYPE(IL) = 2 ! CGN - END IF - ENDIF -! - IF (IKBL .GE. IKE) THEN - PRINT*,'THE LIGHTNING FLASH HAS REACHED THE TOP OF THE DOMAIN ' - ISTOP = 1 - ENDIF -! -! -!* 2. TEST IF THE FLASH IS A CG -! ------------------------- -! - IF (.NOT. GCG) THEN - IF ( (ZZMASS(IIBL_LOC,IJBL_LOC,IKBL)-PZZ(IIBL_LOC,IJBL_LOC,IKB)) <= & - XALT_CG .AND. INBSEG(IL) .GT. 1 .AND. IKSTEP .LT. 0) THEN -! -! -!* 2.1 the channel is prolongated to the ground if -!* one segment reaches the altitude XALT_CG -! - DO WHILE (IKBL > IKB) - IKBL = IKBL - 1 -! -! local coordinates of the new segment - IIDECAL = INBSEG(IL) * 3 -! - ISEG_LOC(IIDECAL+1,IL) = IIBL_LOC - ISEG_LOC(IIDECAL+2,IL) = IJBL_LOC - ISEG_LOC(IIDECAL+3,IL) = IKBL -! - ISEG_GLOB(IIDECAL+1:IIDECAL+2,IL) = ISEG_GLOB(IIDECAL-2:IIDECAL-1,IL) - ISEG_GLOB(IIDECAL+3,IL) = IKBL -! - ZCOORD_SEG(IIDECAL+1:IIDECAL+2,IL) = ZCOORD_SEG(IIDECAL-2:IIDECAL-1,IL) - ZCOORD_SEG(IIDECAL+3,IL) = ZZMASS(IIBL_LOC, IJBL_LOC, IKBL) -! -! Increment number of segments - INBSEG(IL) = INBSEG(IL) + 1 ! Nb of segments - ZFLASH(IIBL_LOC,IJBL_LOC,IKBL,IL) = 1. - ZCELL(IIBL_LOC,IJBL_LOC,IKBL,IL) = 0. - END DO -! -! -!* 2.2 update the number of CG flashes -! - GCG = .TRUE. - NNB_CG = NNB_CG + 1 - ISTOP = 1 -! - IF (ISIGN_LEADER > 0) THEN - GCG_POS = .TRUE. - NNB_CG_POS = NNB_CG_POS + 1 - ITYPE(IL) = 3 - ELSE - ITYPE(IL) = 2 - END IF - END IF - END IF - END IF ! end if ISTOP=0 - END DO ! end loop leader -END IF ! only iproc_trig was working -! -! -!* 3. BROADCAST THE INFORMATIONS TO ALL PROCS -! --------------------------------------- -! -CALL MPI_BCAST (ISEG_LOC(:,IL), 3*SIZE(PRT,3), & - MNHINT_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR) -CALL MPI_BCAST (ITYPE(IL), 1, & - MNHINT_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR) - -CALL MPI_BCAST (GCG, 1, & - MNHLOG_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR) -CALL MPI_BCAST (GCG_POS, 1, & - MNHLOG_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR) -CALL MPI_BCAST (NNB_CG, 1, & - MNHINT_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR) -CALL MPI_BCAST (NNB_CG_POS, 1, & - MNHINT_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR) - -! -CALL MPPDB_CHECK3DM("flash:: one_leader end ZFLASH",PRECISION,ZFLASH(:,:,:,IL)) -! -END SUBROUTINE ONE_LEADER -! -!------------------------------------------------------------------------------- -! - SUBROUTINE CHARGE_POCKET -! -!! -!! Purpose: limit flash propagation into the positive and negative charge layers -!! located immediatly above and below the triggering point -!! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -! -REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZSIGN_AREA,ZSIGN_AREA_NEW - -REAL, DIMENSION(INB_CELL) :: ZSIGN ! sign of the charge immediatly below/above the triggering pt -! -INTEGER, DIMENSION(INB_CELL) :: IEND ! if 1, no more neighbour pts meeting the conditions -INTEGER, DIMENSION(INB_CELL) :: COUNT_BEF2 -INTEGER, DIMENSION(INB_CELL) :: COUNT_AFT2 -INTEGER :: IPROC_END -INTEGER :: IEND_GLOB -INTEGER :: IIDECAL, IKMIN, IKMAX -REAL :: ZFACT -! -! -!* 1. SEARCH THE POINTS BELONGING TO THE LAYERS -! ----------------------------------------- -! -ZFACT = -1. -IF(GPOSITIVE) ZFACT = 1. - -ZSIGN_AREA(:,:,:) = 0. -ZSIGN(:) = 0. -IEND(:) = 0 -IEND_GLOB = 0 -! -! -DO IL = 1, INB_CELL - IF (.NOT. GNEW_FLASH(IL)) THEN - IEND(IL) = 1 - IEND_GLOB = IEND_GLOB + IEND(IL) - END IF - IF (GNEW_FLASH(IL) .AND. IPROC .EQ. IPROC_TRIG(IL)) THEN - DO II = 1, INBSEG(IL) - IIDECAL = 3 * (II - 1) - IIBL_LOC = ISEG_LOC(IIDECAL+1,IL) - IJBL_LOC = ISEG_LOC(IIDECAL+2,IL) - IKBL = ISEG_LOC(IIDECAL+3,IL) -! - IF (ZQMTOT(IIBL_LOC,IJBL_LOC,IKBL) .GT. 0. .AND. GPOSITIVE) THEN - ZSIGN_AREA(IIBL_LOC,IJBL_LOC,IKBL) = 1. * REAL(IL) - ZSIGN(IL) = ZSIGN_AREA(IIBL_LOC,IJBL_LOC,IKBL) - ELSE IF (ZQMTOT(IIBL_LOC,IJBL_LOC,IKBL) .LT. 0. .AND. .NOT.GPOSITIVE) THEN - ZSIGN_AREA(IIBL_LOC,IJBL_LOC,IKBL) = -1. * REAL(IL) - ZSIGN(IL) = ZSIGN_AREA(IIBL_LOC,IJBL_LOC,IKBL) - END IF - END DO - END IF -! - CALL MPI_BCAST (ZSIGN(IL), 1, MNHREAL_MPI, IPROC_TRIG(IL), & - NMNH_COMM_WORLD, IERR) -END DO -! -DO WHILE (IEND_GLOB .NE. INB_CELL) - DO IL = 1, INB_CELL - CALL ADD3DFIELD_ll ( TZFIELDS_ll, ZSIGN_AREA, 'FLASH_GEOM_ELEC_n::ZSIGN_AREA' ) - CALL UPDATE_HALO_ll ( TZFIELDS_ll, IINFO_ll) - CALL CLEANLIST_ll ( TZFIELDS_ll) -! - IF (GNEW_FLASH(IL) .AND. (IEND(IL) .NE. 1)) THEN - COUNT_BEF2(IL) = COUNT(ZSIGN_AREA(IIB:IIE,IJB:IJE,IKB:IKE) .EQ. ZSIGN(IL)) - CALL SUM_ELEC_ll (COUNT_BEF2(IL)) -! - IF (ISIGNE_EZ(IL).EQ.1) THEN - IF (GPOSITIVE) THEN - IKMIN = IKB - IKMAX = ISEG_LOC(3, IL) - ELSE - IKMIN = ISEG_LOC(3, IL) - IKMAX = IKE - ENDIF - ENDIF -! - IF (ISIGNE_EZ(IL).EQ.-1) THEN - IF (GPOSITIVE) THEN - IKMIN = ISEG_LOC(3, IL) - IKMAX = IKE - ELSE - IKMIN = IKB - IKMAX = ISEG_LOC(3, IL) - ENDIF - ENDIF -! - ZSIGN_AREA_NEW(:,:,IKMIN:IKMAX) = ZSIGN_AREA (:,:,IKMIN:IKMAX) - DO II = IIB, IIE - DO IJ = IJB, IJE - DO IK = IKMIN, IKMAX - IF ((ZSIGN_AREA(II, IJ, IK) .EQ. 0.) .AND. & - (ZCELL(II,IJ,IK,IL) .EQ. 1.) .AND. & - (.NOT. GPROP(II,IJ,IK,IL)) .AND. & - (ZQMTOT(II,IJ,IK)*ZFACT .GT. 0.) .AND. & - (ABS(ZQMTOT(II,IJ,IK) * & - PRHODREF(II,IJ,IK)) .GT. XQNEUT)) THEN -! - IF ((ZSIGN_AREA(II-1,IJ, IK) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II+1,IJ, IK) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II, IJ-1,IK) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II, IJ+1,IK) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II-1,IJ-1,IK) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II-1,IJ+1,IK) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II+1,IJ+1,IK) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II+1,IJ-1,IK) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II, IJ, IK+1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II-1,IJ, IK+1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II+1,IJ, IK+1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II, IJ-1,IK+1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II, IJ+1,IK+1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II-1,IJ-1,IK+1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II-1,IJ+1,IK+1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II+1,IJ+1,IK+1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II+1,IJ-1,IK+1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II, IJ, IK-1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II-1,IJ, IK-1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II+1,IJ, IK-1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II, IJ-1,IK-1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II, IJ+1,IK-1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II-1,IJ-1,IK-1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II-1,IJ+1,IK-1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II+1,IJ+1,IK-1) .EQ. ZSIGN(IL)) .OR. & - (ZSIGN_AREA(II+1,IJ-1,IK-1) .EQ. ZSIGN(IL))) THEN - ZSIGN_AREA_NEW(II,IJ,IK) = ZSIGN(IL) - GPROP(II,IJ,IK,IL) = .TRUE. - END IF - END IF - END DO - END DO - END DO - ZSIGN_AREA (:,:,IKMIN:IKMAX) = ZSIGN_AREA_NEW(:,:,IKMIN:IKMAX) -! - COUNT_AFT2(IL) = COUNT(ZSIGN_AREA(IIB:IIE,IJB:IJE,IKB:IKE) .EQ. ZSIGN(IL)) - CALL SUM_ELEC_ll(COUNT_AFT2(IL)) -! - IF (COUNT_BEF2(IL) .EQ. COUNT_AFT2(IL)) THEN - IEND(IL) = 1 - ELSE - IEND(IL) = 0 - END IF -! broadcast IEND and find the proc where IEND = 1 - CALL MAX_ELEC_ll (IEND(IL), IPROC_END) - IEND_GLOB = IEND_GLOB + IEND(IL) - END IF - END DO -END DO ! end do while -! -END SUBROUTINE CHARGE_POCKET -! -!------------------------------------------------------------------------------- -! - SUBROUTINE BRANCH_GEOM (IKMIN, IKMAX) -! -! Goal : find randomly flash branch points -! -!* 0. DECLARATIONS -! ------------ -! -use modd_precision, only: MNHINT64, MNHINT64_MPI - -IMPLICIT NONE -! -!* 0.1 declaration of dummy arguments -! -INTEGER, INTENT(IN) :: IKMIN, IKMAX -! -!* 0.2 declaration of local variables -! -INTEGER :: IIDECALB -INTEGER :: IPLOOP ! loop index for the proc number -INTEGER :: IMIN, IMAX -INTEGER :: IAUX -INTEGER :: INB_SEG_BEF ! nb of segments before branching -INTEGER :: INB_SEG_AFT ! nb of segments after branching -INTEGER :: INB_SEG_TO_BRANCH ! = NBRANCH_MAX-INB_SEG_BEF -LOGICAL :: GRANDOM ! T = the gridpoints are chosen randomly -INTEGER, DIMENSION(NPROC) :: INBPT_PROC -REAL, DIMENSION(:), ALLOCATABLE :: ZAUX -! -INTEGER :: JI,JJ,JK,JIL , ICHOICE,IPOINT -INTEGER, DIMENSION(NPROC+1) :: IDISPL -INTEGER(kind=MNHINT64), DIMENSION(:), ALLOCATABLE :: I8VECT , I8VECT_LL -INTEGER, DIMENSION(:), ALLOCATABLE :: IRANK , IRANK_LL , IORDER_LL -! -! -! -!* 1. ON EACH PROC, COUNT THE NUMBER OF POINTS AT DISTANCE D -!* THAT CAN RECEIVE A BRANCH -! ------------------------------------------------------ -CALL MPPDB_CHECK3DM("flash:: branch ZFLASH,IMASKQ_DIST",PRECISION,& - ZFLASH(:,:,:,IL),IMASKQ_DIST*1.0) -! -IM = 1 -ISTOP = 0 -INB_SEG_BEF = COUNT(ZFLASH(IIB:IIE,IJB:IJE,IKB:IKE,IL) .NE. 0.) -CALL SUM_ELEC_ll(INB_SEG_BEF) -! -INB_SEG_TO_BRANCH = NBRANCH_MAX - INB_SEG_BEF -! -DO WHILE (IM .LE. IDELTA_IND .AND. ISTOP .NE. 1) -! number of points that can receive a branch in each proc - IPT_DIST = COUNT(IMASKQ_DIST(IIB:IIE,IJB:IJE,IKB:IKE) .EQ. IM) -! global number of points that can receive a branch - IPT_DIST_GLOB = IPT_DIST - CALL SUM_ELEC_ll (IPT_DIST_GLOB) -! - IF (IPT_DIST_GLOB .LE. INB_SEG_TO_BRANCH) THEN - IF (IPT_DIST_GLOB .LE. IMAX_BRANCH(IM)) THEN - GRANDOM = .FALSE. - ELSE - GRANDOM = .TRUE. - END IF - ELSE - GRANDOM = .TRUE. - END IF -! -! -!* 2. DISTRIBUTE THE BRANCHES -! ----------------------- -! - IF (IPT_DIST_GLOB .GT. 0 .AND. INB_SEG_TO_BRANCH .NE. 0) THEN - IF (.NOT. GRANDOM) THEN - INB_SEG_TO_BRANCH = INB_SEG_TO_BRANCH - IPT_DIST_GLOB -! -!* 2.1 all points are selected -! - IF(IPT_DIST .GT. 0) THEN - WHERE (IMASKQ_DIST(IIB:IIE,IJB:IJE,IKB:IKE) .EQ. IM) - ZFLASH(IIB:IIE,IJB:IJE,IKB:IKE,IL) = 2. - ZCELL(IIB:IIE,IJB:IJE,IKB:IKE,IL) = 0. - END WHERE - END IF - ELSE -! -!* 2.2 the gridpoints are chosen randomly -! - IF (IMAX_BRANCH(IM) .GT. 0) THEN - INBPT_PROC(:) = 0 - CALL MPI_ALLGATHER(IPT_DIST, 1, MNHINT_MPI, & - INBPT_PROC, 1, MNHINT_MPI, NMNH_COMM_WORLD, IERR) -! - IDISPL(1) = 0 - DO JI=2, NPROC+1 - IDISPL(JI) = IDISPL(JI-1)+INBPT_PROC(JI-1) - ENDDO -! - ALLOCATE (I8VECT(IPT_DIST)) - ALLOCATE (IRANK(IPT_DIST)) - IF (IPT_DIST .GT. 0) THEN - JIL=0 - DO JK=IKB,IKE - DO JJ=IJB,IJE - DO JI=IIB,IIE - IF (IMASKQ_DIST(JI,JJ,JK) .EQ. IM) THEN - JIL = JIL + 1 - I8VECT(JIL) = IJU_ll*IIU_ll*(JK-1) + IIU_ll*(JJ-1 +IYOR-1) + (JI +IXOR-1) - !print*,"IN => I8VECT(JIL )=",I8VECT(JIL),JI,JJ,JK,JIL - END IF - END DO - END DO - END DO - ! - IRANK(:) = IPROC - END IF -! - ALLOCATE(I8VECT_LL(IPT_DIST_GLOB)) - ALLOCATE(IRANK_LL(IPT_DIST_GLOB)) - ALLOCATE(IORDER_LL(IPT_DIST_GLOB)) - CALL MPI_ALLGATHERV(I8VECT,IPT_DIST, MNHINT64_MPI,I8VECT_LL , & - INBPT_PROC, IDISPL, MNHINT64_MPI, NMNH_COMM_WORLD, IERR) - CALL MPI_ALLGATHERV(IRANK,IPT_DIST, MNHINT_MPI,IRANK_LL , & - INBPT_PROC, IDISPL, MNHINT_MPI, NMNH_COMM_WORLD, IERR) - CALL N8QUICK_SORT(I8VECT_LL, IORDER_LL) -! - DO IPOINT = 1, MIN(IMAX_BRANCH(IM), INB_SEG_TO_BRANCH) - IFOUND = 0 - DO WHILE (IFOUND .NE. 1) - ! randomly chose points in zvect - CALL MNH_RANDOM_NUMBER(ZRANDOM) - ICHOICE = INT(ANINT(ZRANDOM * IPT_DIST_GLOB)) - IF (ICHOICE .EQ. 0) ICHOICE = 1 - IF (I8VECT_LL(ICHOICE) .NE. 0 ) THEN - IFOUND = 1 - ! The points is in this processors , get is coord and set it - IF (IRANK_LL(IORDER_LL(ICHOICE)) .EQ. IPROC) THEN - JK = 1 + (I8VECT_LL(ICHOICE)-1) / ( IJU_ll*IIU_ll ) - JJ = 1 + ( (I8VECT_LL(ICHOICE)-1) - IJU_ll*IIU_ll*(JK-1) ) / IIU_ll - IYOR +1 - JI = 1 + MOD((I8VECT_LL(ICHOICE)-1) , int(IIU_ll,kind(I8VECT_LL(1)))) - IXOR +1 - !print*,"OUT => I8VECT_LL(ICHOICE)=",I8VECT_ll(ICHOICE),JI,JJ,JK,ICHOICE - ZFLASH(JI,JJ,JK,IL) = 2. - END IF - I8VECT_LL(ICHOICE) = 0 - ENDIF - END DO - END DO -! - INB_SEG_TO_BRANCH = INB_SEG_TO_BRANCH - MIN(IMAX_BRANCH(IM), INB_SEG_TO_BRANCH) -! - DEALLOCATE(I8VECT,I8VECT_LL,IRANK,IRANK_LL,IORDER_LL) - CALL MPPDB_CHECK3DM("flash:: branch IPT_DIST ZFLASH",PRECISION,& - ZFLASH(:,:,:,IL)) - END IF - END IF !IPT_DIST .LE. IMAX_BRANCH(IM) - ELSE -! if no pt available at r, then no branching possible at r+dr ! - ISTOP = 1 - END IF ! end if ipt_dist > 0 -! -! next distance - CALL MPPDB_CHECK3DM("flash:: branch IM+1 ZFLASH",PRECISION,ZFLASH(:,:,:,IL)) - IM = IM + 1 -END DO ! end loop / do while / radius IM -! -INB_SEG_AFT = COUNT (ZFLASH(IIB:IIE,IJB:IJE,IKB:IKE,IL) .NE. 0.) -CALL SUM_ELEC_ll(INB_SEG_AFT) -! -IF (INB_SEG_AFT .GT. INB_SEG_BEF) THEN - DO II = IIB, IIE - DO IJ = IJB, IJE - DO IK = IKB, IKE - IF (ZFLASH(II,IJ,IK,IL) .EQ. 2.) THEN - IIDECALB = INBSEG(IL) * 3 -! - ISEG_GLOB(IIDECALB+1,IL) = II + IXOR - 1 - ISEG_GLOB(IIDECALB+2,IL) = IJ + IYOR - 1 - ISEG_GLOB(IIDECALB+3,IL) = IK -! - ZCOORD_SEG(IIDECALB+1,IL) = XXHATM(II) - ZCOORD_SEG(IIDECALB+2,IL) = XYHATM(IJ) - ZCOORD_SEG(IIDECALB+3,IL) = ZZMASS(II,IJ,IK) - INBSEG(IL) = INBSEG(IL) + 1 - END IF - END DO - END DO - END DO -END IF -! -CALL MPPDB_CHECK3DM("flash:: end branch ZFLASH",PRECISION,ZFLASH(:,:,:,IL)) -! -END SUBROUTINE BRANCH_GEOM -! -!-------------------------------------------------------------------------------- -! - SUBROUTINE GATHER_ALL_BRANCH -! -!! -!! Purpose: -!! -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -! -INTEGER :: INSEGPROC, INSEGCELL ! number of segments in the process, - ! and number of segments in the cell -INTEGER :: ISAVEDECAL -INTEGER :: INSEGTRIG, IPROCTRIG -REAL, DIMENSION(:), ALLOCATABLE :: ZLMAQMT, ZLMAPRT, ZLMAPOS, ZLMANEG -REAL, DIMENSION(:), ALLOCATABLE :: ZSEND, ZRECV -INTEGER, DIMENSION(:), ALLOCATABLE :: ISEND, IRECV -INTEGER, DIMENSION(NPROC) :: IDECAL, IDECAL3, IDECALN -INTEGER, DIMENSION(NPROC) :: INBSEG_PROC_X3, INBSEG_PROC_XNSV -! -! -IPROCTRIG = IPROC_TRIG(IL) -INSEGCELL = INBSEG_ALL(IL) -INSEGPROC = INBSEG_PROC(IPROC+1) -INSEGTRIG = INBSEG_PROC(IPROCTRIG+1) -! -IDECAL(1) = INSEGTRIG -DO IK = 2, NPROC - IDECAL(IK) = IDECAL(IK-1) + INBSEG_PROC(IK-1) -END DO -! -IF(IPROCTRIG .EQ. 0) ISAVEDECAL = IDECAL(IPROCTRIG+1) -! -IDECAL(IPROCTRIG+1) = 0 -DO IK = IPROCTRIG+2, NPROC - IF(IPROCTRIG .EQ. 0) THEN - IDECAL(IK) = IDECAL(IK) - ISAVEDECAL - ELSE - IDECAL(IK) = IDECAL(IK) - IDECAL(1) - END IF -END DO -! -IDECAL3(:) = 3 * IDECAL(:) -! -! -!* 1. BRANCH COORDINATES -! -ALLOCATE (ZRECV(INSEGCELL*3)) -ALLOCATE (ZSEND(INSEGPROC*3)) -! -IF (INSEGPROC .NE. 0) THEN - ZSEND(1:3*INSEGPROC) = ZCOORD_SEG(1:3*INSEGPROC,IL) -END IF -! -IF (IPROC .EQ. 0) THEN - INBSEG_PROC_X3(:) = 3 * INBSEG_PROC(:) -END IF -! -CALL MPI_GATHERV (ZSEND, 3*INSEGPROC, MNHREAL_MPI, ZRECV, INBSEG_PROC_X3, & - IDECAL3, MNHREAL_MPI, 0, NMNH_COMM_WORLD, IERR) -! -IF (IPROC .EQ. 0) THEN - ZCOORD_SEG_ALL(1:3*INSEGCELL,IL) = ZRECV(1:3*INSEGCELL) -END IF -! -DEALLOCATE (ZRECV) -DEALLOCATE (ZSEND) -! -! -!* 2. FOR LMA-LIKE RESULTS: Charge, mixing ratio, -!* neutralized positive/negative charge -!* and grid index -! -IF (LLMA) THEN - ALLOCATE (ISEND(3*INSEGPROC)) - ALLOCATE (ZLMAQMT(INSEGPROC*NSV_ELEC)) - ALLOCATE (ZLMAPRT(INSEGPROC*NSV_ELEC)) - ALLOCATE (ZLMAPOS(INSEGPROC)) - ALLOCATE (ZLMANEG(INSEGPROC)) -! - ISEND (:) = 0 - ZLMAPOS(:) = 0. - ZLMANEG(:) = 0. - ZLMAQMT(:) = 0. - ZLMAPRT(:) = 0. -! - IF (INSEGPROC .NE. 0) THEN - DO II = 1, INSEGPROC - IM = 3 * (II - 1) - IX = ISEG_GLOB(IM+1,IL) - IXOR + 1 - IY = ISEG_GLOB(IM+2,IL) - IYOR + 1 - IZ = ISEG_GLOB(IM+3,IL) -! - IM = NSV_ELEC * (II - 1) - IF (IX .LE. IIE .AND. IX .GE. IIB .AND. & - IY .LE. IJE .AND. IY .GE. IJB) THEN - ZLMAQMT(IM+2:IM+6) = ZQMT(IX,IY,IZ,2:6) - ZLMAPRT(IM+2:IM+6) = PRT(IX,IY,IZ,2:6) - DO IJ = 1, NSV_ELEC - IF (ZDQDT(IX,IY,IZ,IJ) .GT. 0.) THEN - ZLMAPOS(II) = ZLMAPOS(II) + & - ZDQDT(IX,IY,IZ,IJ) * PRHODJ(IX,IY,IZ) - ELSE IF (ZDQDT(IX,IY,IZ,IJ) .LT. 0.) THEN - ZLMANEG(II) = ZLMANEG(II) + & - ZDQDT(IX,IY,IZ,IJ) * PRHODJ(IX,IY,IZ) - END IF - END DO - END IF - END DO -! - ISEND(1:3*INSEGPROC) = ISEG_GLOB(1:3*INSEGPROC, IL) - END IF -! -! Grid Indexes -! - ALLOCATE (IRECV(3*INSEGCELL)) -! - CALL MPI_GATHERV (ISEND, 3*INSEGPROC, MNHINT_MPI, IRECV, INBSEG_PROC_X3, & - IDECAL3, MNHINT_MPI, 0, NMNH_COMM_WORLD, IERR) -! - IF (IPROC .EQ. 0) THEN - ILMA_SEG_ALL(1:3*INSEGCELL,IL) = IRECV(1:3*INSEGCELL) - END IF -! - DEALLOCATE (IRECV) - DEALLOCATE (ISEND) -! -! Neutralized charge at grid points -! - ALLOCATE (ZRECV(INSEGCELL)) -! - CALL MPI_GATHERV (ZLMAPOS, INSEGPROC, MNHREAL_MPI, ZRECV, INBSEG_PROC, & - IDECAL, MNHREAL_MPI, 0, NMNH_COMM_WORLD, IERR) -! - IF (IPROC .EQ. 0) THEN - ZLMA_NEUT_POS(1:INSEGCELL,IL) = ZRECV(1:INSEGCELL) - END IF -! - CALL MPI_GATHERV (ZLMANEG, INSEGPROC, MNHREAL_MPI, ZRECV, INBSEG_PROC, & - IDECAL, MNHREAL_MPI, 0, NMNH_COMM_WORLD, IERR) -! - IF (IPROC .EQ. 0) THEN - ZLMA_NEUT_NEG(1:INSEGCELL,IL) = ZRECV(1:INSEGCELL) - END IF -! - DEALLOCATE (ZLMAPOS) - DEALLOCATE (ZLMANEG) - DEALLOCATE (ZRECV) -! -! Charge and mixing ratios at neutralized points -! - ALLOCATE (ZRECV(NSV_ELEC*INSEGCELL)) -! - IDECALN(:) = IDECAL(:) * NSV_ELEC -! - IF (IPROC .EQ. 0) THEN - INBSEG_PROC_XNSV(:) = NSV_ELEC * INBSEG_PROC(:) - END IF -! - CALL MPI_GATHERV (ZLMAQMT, NSV_ELEC*INSEGPROC, MNHREAL_MPI, ZRECV, & - INBSEG_PROC_XNSV, & - IDECALN, MNHREAL_MPI, 0, NMNH_COMM_WORLD, IERR ) -! - IF (IPROC .EQ. 0) THEN - ZLMA_QMT(1:NSV_ELEC*INSEGCELL,IL) = ZRECV(1:NSV_ELEC*INSEGCELL) - END IF -! - CALL MPI_GATHERV (ZLMAPRT, NSV_ELEC*INSEGPROC, MNHREAL_MPI, ZRECV, & - INBSEG_PROC_XNSV, & - IDECALN, MNHREAL_MPI, 0, NMNH_COMM_WORLD, IERR ) -! - IF (IPROC .EQ. 0) THEN - ZLMA_PRT(1:NSV_ELEC*INSEGCELL,IL) = ZRECV(1:NSV_ELEC*INSEGCELL) - END IF -! - DEALLOCATE (ZLMAQMT) - DEALLOCATE (ZLMAPRT) - DEALLOCATE (ZRECV) -! -END IF -! -END SUBROUTINE GATHER_ALL_BRANCH -! -!-------------------------------------------------------------------------------- -! - SUBROUTINE PT_DISCHARGE -! -!! -!! Purpose: -!! -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -! -! -WHERE (ABS(PEFIELDW(:,:,IKB)) > XECORONA .AND. PEFIELDW(:,:,IKB) > 0.) - PRSVS(:,:,IKB,1) = PRSVS(:,:,IKB,1) + & - XFCORONA * PEFIELDW(:,:,IKB) * (ABS(PEFIELDW(:,:,IKB)) - & - XECORONA)**2 / (PZZ(:,:,IKB+1) - PZZ(:,:,IKB)) -ENDWHERE -! -WHERE (ABS(PEFIELDW(:,:,IKB)) > XECORONA .AND. PEFIELDW(:,:,IKB) < 0.) - PRSVS(:,:,IKB,NSV_ELEC) = PRSVS(:,:,IKB,NSV_ELEC) + & - XFCORONA * PEFIELDW(:,:,IKB) * (ABS(PEFIELDW(:,:,IKB)) - & - XECORONA)**2 / (PZZ(:,:,IKB+1) - PZZ(:,:,IKB)) -ENDWHERE -! -END SUBROUTINE PT_DISCHARGE -! -!---------------------------------------------------------------------------------- -! - SUBROUTINE WRITE_OUT_ASCII -! -!! -!! Purpose: -!! -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -! -INTEGER :: I1, I2 -INTEGER :: ILU ! unit number for IO -! -! -!* 1. FLASH PARAMETERS -! ---------------- -! -ILU = TPFILE_FGEOM_DIAG%NLU -! -! Ecriture ascii dans CEXP//'_fgeom_diag.asc" defini dans RESOLVED_ELEC -! -IF (LCARTESIAN) THEN - DO I1 = 1, NNBLIGHT - WRITE (UNIT=ILU,FMT='(I8,F9.1,I4,I6,I4,I6,F9.3,F12.3,F12.3,F9.3,F8.2,F9.2,f9.4)') & - ISFLASH_NUMBER(I1), & - ISTCOUNT_NUMBER(I1) * PTSTEP, & - ISCELL_NUMBER(I1), & - ISNB_FLASH(I1), & - ISTYPE(I1), & - ISNBSEG(I1), & - ZSEM_TRIG(I1), & - ZSCOORD_SEG(I1,1,1)*1.E-3, & - ZSCOORD_SEG(I1,1,2)*1.E-3, & - ZSCOORD_SEG(I1,1,3)*1.E-3, & - ZSNEUT_POS(I1), & - ZSNEUT_NEG(I1), ZSNEUT_POS(I1)+ZSNEUT_NEG(I1) - END DO -ELSE - DO I1 = 1, NNBLIGHT -! compute latitude and longitude of the triggering point - CALL SM_LATLON(XLATORI,XLONORI,ZSCOORD_SEG(I1,1,1),& - ZSCOORD_SEG(I1,1,2),& - ZLAT,ZLON) -! - WRITE (UNIT=ILU,FMT='(I8,F9.1,I4,I6,I4,I6,F9.3,F12.3,F12.3,F9.3,F8.2,F9.2,f9.4)') & - ISFLASH_NUMBER(I1), & - ISTCOUNT_NUMBER(I1) * PTSTEP, & - ISCELL_NUMBER(I1), & - ISNB_FLASH(I1), & - ISTYPE(I1), & - ISNBSEG(I1), & - ZSEM_TRIG(I1), & - ZLAT, & - ZLON, & - ZSCOORD_SEG(I1,1,3)*1.E-3, & - ZSNEUT_POS(I1), & - ZSNEUT_NEG(I1), ZSNEUT_POS(I1)+ZSNEUT_NEG(I1) - END DO -END IF -! -FLUSH(UNIT=ILU) -! -! -!* 2. FLASH SEGMENT COORDINATES -! ------------------------- -! -IF (LSAVE_COORD) THEN -! -! Ecriture ascii dans CEXP//'_fgeom_coord.asc" defini dans RESOLVED_ELEC -! - ILU = TPFILE_FGEOM_COORD%NLU -! - DO I1 = 1, NNBLIGHT - DO I2 = 1, ISNBSEG(I1) - WRITE (ILU, FMT='(I4,F9.1,I4,F12.3,F12.3,F12.3)') & - ISFLASH_NUMBER(I1), & - ISTCOUNT_NUMBER(I1) * PTSTEP, & - ISTYPE(I1), & - ZSCOORD_SEG(I1,I2,1)*1.E-3, & - ZSCOORD_SEG(I1,I2,2)*1.E-3, & - ZSCOORD_SEG(I1,I2,3)*1.E-3 - END DO - END DO -! - FLUSH(UNIT=ILU) -END IF -! -END SUBROUTINE WRITE_OUT_ASCII -! -!------------------------------------------------------------------------------- -! -SUBROUTINE WRITE_OUT_LMA -! -!! -!! Purpose: -!! -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -! -INTEGER :: I1, I2 -INTEGER :: ILU ! unit number for IO -! -! -!* 1. LMA SIMULATOR -! ------------- -! -CALL SM_LATLON(XLATORI,XLONORI,ZSCOORD_SEG(:,:,1),ZSCOORD_SEG(:,:,2), & - ZLMA_LAT(:,:),ZLMA_LON(:,:)) -! -ILU = TPFILE_LMA%NLU -! -DO I1 = 1, NNBLIGHT - DO I2 = 1, ISNBSEG(I1) - WRITE (UNIT=ILU,FMT='(I6,F12.1,I6,2(F15.6),3(F15.3),3(I6),12(E15.4))') & - ISFLASH_NUMBER(I1), & - ISTCOUNT_NUMBER(I1) * PTSTEP, & - ISTYPE(I1), & - ZLMA_LAT(I1,I2), & - ZLMA_LON(I1,I2), & - ZSCOORD_SEG(I1,I2,1)*1.E-3, & - ZSCOORD_SEG(I1,I2,2)*1.E-3, & - ZSCOORD_SEG(I1,I2,3)*1.E-3, & - ISLMA_SEG_GLOB(I1,I2,1), & - ISLMA_SEG_GLOB(I1,I2,2), & - ISLMA_SEG_GLOB(I1,I2,3), & - ZSLMA_PRT(I1,I2,2), & - ZSLMA_PRT(I1,I2,3), & - ZSLMA_PRT(I1,I2,4), & - ZSLMA_PRT(I1,I2,5), & - ZSLMA_PRT(I1,I2,6), & - ZSLMA_QMT(I1,I2,2), & - ZSLMA_QMT(I1,I2,3), & - ZSLMA_QMT(I1,I2,4), & - ZSLMA_QMT(I1,I2,5), & - ZSLMA_QMT(I1,I2,6), & - ZSLMA_NEUT_POS(I1,I2), & - ZSLMA_NEUT_NEG(I1,I2) - END DO -END DO -! -FLUSH(UNIT=ILU) -! -END SUBROUTINE WRITE_OUT_LMA -! -!------------------------------------------------------------------------------- -! -RECURSIVE SUBROUTINE N8QUICK_SORT(PLIST, KORDER) - -! Quick sort routine from: -! Brainerd, W.S., Goldberg, C.H. & Adams, J.C. (1990) "Programmer's Guide to -! Fortran 90", McGraw-Hill ISBN 0-07-000248-7, pages 149-150. -! Modified by Alan Miller to include an associated integer array which gives -! the positions of the elements in the original order. -! -use modd_precision, only: MNHINT64 - -IMPLICIT NONE -! -INTEGER(kind=MNHINT64), DIMENSION (:), INTENT(INOUT) :: PLIST -INTEGER, DIMENSION (:), INTENT(OUT) :: KORDER -! -! Local variable -INTEGER :: JI - -DO JI = 1, SIZE(PLIST) - KORDER(JI) = JI -END DO - -CALL N8QUICK_SORT_1(1, SIZE(PLIST), PLIST, KORDER) - -END SUBROUTINE N8QUICK_SORT -! -!------------------------------------------------------------------------------- -! -RECURSIVE SUBROUTINE N8QUICK_SORT_1(KLEFT_END, KRIGHT_END, PLIST1, KORDER1) - -use modd_precision, only: MNHINT64 - -implicit none - -INTEGER, INTENT(IN) :: KLEFT_END, KRIGHT_END -INTEGER(kind=MNHINT64), DIMENSION (:), INTENT(INOUT) :: PLIST1 -INTEGER, DIMENSION (:), INTENT(INOUT) :: KORDER1 -! Local variables -INTEGER, PARAMETER :: IMAX_SIMPLE_SORT_SIZE = 6 - -INTEGER :: JI, JJ, ITEMP -INTEGER(kind=MNHINT64) :: ZREF, ZTEMP - -IF (KRIGHT_END < KLEFT_END + IMAX_SIMPLE_SORT_SIZE) THEN - ! Use interchange sort for small PLISTs - CALL N8INTERCHANGE_SORT(KLEFT_END, KRIGHT_END, PLIST1, KORDER1) - ! -ELSE - ! - ! Use partition ("quick") sort - ! valeur au centre du tableau - ZREF = PLIST1((KLEFT_END + KRIGHT_END)/2) - JI = KLEFT_END - 1 - JJ = KRIGHT_END + 1 - - DO - ! Scan PLIST from left end until element >= ZREF is found - DO - JI = JI + 1 - IF (PLIST1(JI) >= ZREF) EXIT - END DO - ! Scan PLIST from right end until element <= ZREF is found - DO - JJ = JJ - 1 - IF (PLIST1(JJ) <= ZREF) EXIT - END DO - - - IF (JI < JJ) THEN - ! Swap two out-of-order elements - ZTEMP = PLIST1(JI) - PLIST1(JI) = PLIST1(JJ) - PLIST1(JJ) = ZTEMP - ITEMP = KORDER1(JI) - KORDER1(JI) = KORDER1(JJ) - KORDER1(JJ) = ITEMP - ELSE IF (JI == JJ) THEN - JI = JI + 1 - EXIT - ELSE - EXIT - END IF - END DO - - IF ( KLEFT_END < JJ ) CALL N8QUICK_SORT_1( KLEFT_END, JJ, PLIST1, KORDER1 ) - IF ( JI < KRIGHT_END ) CALL N8QUICK_SORT_1( JI, KRIGHT_END, PLIST1, KORDER1 ) -END IF - -END SUBROUTINE N8QUICK_SORT_1 -! -!------------------------------------------------------------------------------- -! -SUBROUTINE N8INTERCHANGE_SORT(KLEFT_END, KRIGHT_END, PLIST2, KORDER2) - -use modd_precision, only: MNHINT64 - -implicit none - -INTEGER, INTENT(IN) :: KLEFT_END, KRIGHT_END -INTEGER(kind=MNHINT64), DIMENSION(:), INTENT(INOUT) :: PLIST2 -INTEGER, DIMENSION(:), INTENT(INOUT) :: KORDER2 -! Local variables -INTEGER :: JI, JJ, ITEMP -INTEGER(kind=MNHINT64) :: ZTEMP - -! boucle sur tous les points -DO JI = KLEFT_END, KRIGHT_END - 1 - ! - ! boucle sur les points suivants le point JI - DO JJ = JI+1, KRIGHT_END - ! - ! si la distance de JI au point est plus grande que celle de JJ - IF (PLIST2(JI) > PLIST2(JJ)) THEN - ! distance de JI au point (la plus grande) - ZTEMP = PLIST2(JI) - ! le point JJ est déplacé à l'indice JI dans le tableau - PLIST2(JI) = PLIST2(JJ) - ! le point JI est déplacé à l'indice JJ dans le tableau - PLIST2(JJ) = ZTEMP - ! indice du point JI dans le tableau - ITEMP = KORDER2(JI) - ! l'indice du point JJ est mis à la place JI - KORDER2(JI) = KORDER2(JJ) - ! l'indice du point JI est mis à la place JJ - KORDER2(JJ) = ITEMP - END IF - ! - END DO - ! -END DO - -END SUBROUTINE N8INTERCHANGE_SORT -!------------------------------------------------------------------------------- - SUBROUTINE MNH_RANDOM_NUMBER(ZRANDOM) - - use modd_precision, only: MNHINT32 - - REAL, INTENT(OUT) :: ZRANDOM - INTEGER(kind=MNHINT32), SAVE :: NSEED_MNH = 26032012_MNHINT32 - - ZRANDOM = real( r8_uniform_01( NSEED_MNH ), kind(ZRANDOM) ) - - END SUBROUTINE MNH_RANDOM_NUMBER - -!------------------------------------------------------------------------------------------ - - FUNCTION r8_uniform_01 ( seed ) - - !*****************************************************************************80 - ! - !! R8_UNIFORM_01 returns a unit pseudorandom R8. - ! - ! Discussion: - ! - ! An R8 is a real ( kind = 8 ) value. - ! - ! For now, the input quantity SEED is an integer variable. - ! - ! This routine implements the recursion - ! - ! seed = ( 16807 * seed ) mod ( 2^31 - 1 ) - ! r8_uniform_01 = seed / ( 2^31 - 1 ) - ! - ! The integer arithmetic never requires more than 32 bits, - ! including a sign bit. - ! - ! If the initial seed is 12345, then the first three computations are - ! - ! Input Output R8_UNIFORM_01 - ! SEED SEED - ! - ! 12345 207482415 0.096616 - ! 207482415 1790989824 0.833995 - ! 1790989824 2035175616 0.947702 - ! - ! Licensing: - ! - ! This code is distributed under the GNU LGPL license. - ! Souce here : https://people.sc.fsu.edu/~jburkardt/f_src/uniform/uniform.f90 - ! - ! Modified: - ! - ! 31 May 2007 - ! - ! Author: - ! - ! John Burkardt - ! - ! Reference: - ! - ! Paul Bratley, Bennett Fox, Linus Schrage, - ! A Guide to Simulation, - ! Second Edition, - ! Springer, 1987, - ! ISBN: 0387964673, - ! LC: QA76.9.C65.B73. - ! - ! Bennett Fox, - ! Algorithm 647: - ! Implementation and Relative Efficiency of Quasirandom - ! Sequence Generators, - ! ACM Transactions on Mathematical Software, - ! Volume 12, Number 4, December 1986, pages 362-376. - ! - ! Pierre L'Ecuyer, - ! Random Number Generation, - ! in Handbook of Simulation, - ! edited by Jerry Banks, - ! Wiley, 1998, - ! ISBN: 0471134031, - ! LC: T57.62.H37. - ! - ! Peter Lewis, Allen Goodman, James Miller, - ! A Pseudo-Random Number Generator for the System/360, - ! IBM Systems Journal, - ! Volume 8, Number 2, 1969, pages 136-143. - ! - ! Parameters: - ! - ! Input/output, integer ( kind = MNHINT32 ) SEED, the "seed" value, which should - ! NOT be 0. On output, SEED has been updated. - ! - ! Output, real ( kind = MNHREAL64 ) R8_UNIFORM_01, a new pseudorandom variate, - ! strictly between 0 and 1. - ! - use modd_precision, only: MNHINT32, MNHREAL64 - - implicit none - - integer(kind = MNHINT32), intent(inout) :: seed - real(kind=MNHREAL64) :: r8_uniform_01 - - integer(kind = MNHINT32), parameter :: i4_huge = 2147483647_MNHINT32 - - integer(kind = MNHINT32) :: k - - if ( seed == 0_MNHINT32 ) THEN - call Print_msg( NVERB_FATAL, 'GEN', 'r8_uniform_01', 'seed dummy argument must be different of 0' ) - end if - - k = seed / 127773_MNHINT32 - - seed = 16807_MNHINT32 * ( seed - k * 127773_MNHINT32 ) - k * 2836_MNHINT32 - - if ( seed < 0_MNHINT32 ) then - seed = seed + i4_huge - end if - - r8_uniform_01 = real(seed) * 4.656612875d-10 - - return - end function r8_uniform_01 -! -END SUBROUTINE FLASH_GEOM_ELEC_n -! -!------------------------------------------------------------------------------- diff --git a/src/PHYEX/ext/goto_model_wrapper.f90 b/src/PHYEX/ext/goto_model_wrapper.f90 deleted file mode 100644 index e869230e2..000000000 --- a/src/PHYEX/ext/goto_model_wrapper.f90 +++ /dev/null @@ -1,252 +0,0 @@ -!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!! MODIFICATIONS -!! ------------- -!! 06/12 (Tomasini) Grid-nesting of ADVFRC and EDDY_FLUX -!! 07/13 (Bosseur & Filippi) adds Forefire -!! 2014 (Faivre) -!! 2016 (Leriche) Add MODD_CH_ICE Suppress MODD_CH_DEP_n -!! Modification 01/2016 (JP Pinty) Add LIMA -!! 10/2016 (F Brosse) Add prod/loss terms computation for chemistry -!! 07/2017 (M.Leriche) Add DIAG chimical surface fluxes -! 02/2018 Q.Libois ECRAD -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! 2017 V.Vionnet blow snow -! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree -! F. Auguste 02/21: add IBM -! T. Nagel 02/21: add turbulence recycling -! R. Schoetter 12/2021 multi-level coupling between MesoNH and SURFEX -! P. Wautelet 27/04/2022: add namelist for profilers -! P. Wautelet 10/02/2023: add Blaze variables -!----------------------------------------------------------------- -MODULE MODI_GOTO_MODEL_WRAPPER - -INTERFACE -SUBROUTINE GOTO_MODEL_WRAPPER(KFROM, KTO, ONOFIELDLIST) -INTEGER, INTENT(IN) :: KFROM, KTO -LOGICAL, OPTIONAL, INTENT(IN) :: ONOFIELDLIST -END SUBROUTINE GOTO_MODEL_WRAPPER -END INTERFACE - -END MODULE MODI_GOTO_MODEL_WRAPPER - -SUBROUTINE GOTO_MODEL_WRAPPER(KFROM, KTO, ONOFIELDLIST) -! all USE modd*_n modules -USE MODD_ADVFRC_n -USE MODD_ADV_n -USE MODD_ALLPROFILER_n -USE MODD_ALLSTATION_n -USE MODD_BIKHARDT_n -USE MODD_BLANK_n -USE MODD_BLOWSNOW_n -USE MODD_CH_AERO_n -USE MODD_CH_BUDGET_n -USE MODD_CH_FLX_n -USE MODD_CH_ICE_n -USE MODD_CH_JVALUES_n -USE MODD_CH_M9_n -USE MODD_CH_MNHC_n -USE MODD_CH_PH_n -USE MODD_CH_PRODLOSSTOT_n -USE MODD_CH_ROSENBROCK_n -USE MODD_CH_SOLVER_n -USE MODD_CLOUDPAR_n -USE MODD_PARAM_ICE_n -USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_ASSOCIATE !not yet a '_n' module -USE MODD_RAIN_ICE_PARAM_n -USE MODD_RAIN_ICE_DESCR_n -USE MODD_CLOUD_MF_n -USE MODD_CONF_n -USE MODD_CURVCOR_n -USE MODD_DIM_n -USE MODD_DRAG_n -USE MODD_DRAGTREE_n -USE MODD_DRAGBLDG_n -USE MODD_COUPLING_LEVELS_n -USE MODD_DUMMY_GR_FIELD_n -USE MODD_DYN_n -USE MODD_DYNZD_n -USE MODD_ELEC_n -USE MODD_FIELD_n -USE MODD_FIRE_n -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE_n -#endif -USE MODD_FRC_n -USE MODD_GET_n -USE MODD_GR_FIELD_n -USE MODD_IBM_LSF -USE MODD_IBM_PARAM_n -USE MODD_IO_SURF_MNH -USE MODD_LBC_n -USE MODD_LES_n -USE MODD_LSFIELD_n -USE MODD_LUNIT_n -USE MODD_MEAN_FIELD_n -USE MODD_METRICS_n -USE MODD_NEST_PGD_n -USE MODD_NUDGING_n -USE MODD_OUT_n -USE MODD_PACK_GR_FIELD_n -USE MODD_PARAM_KAFR_n -USE MODD_PARAM_MFSHALL_n -USE MODD_PARAM_n -USE MODD_PARAM_RAD_n -USE MODD_PARAM_ECRAD_n -USE MODD_PASPOL_n -USE MODD_PAST_FIELD_n -USE MODD_PRECIP_n -USE MODD_PROFILER_n -USE MODD_RADIATIONS_n -USE MODD_RBK90_Global_n -USE MODD_RBK90_JacobianSP_n -USE MODD_RBK90_Parameters_n -USE MODD_RECYCL_PARAM_n -USE MODD_REF_n -USE MODD_RELFRC_n -USE MODD_SECPGD_FIELD_n -USE MODD_SERIES_n -USE MODD_SHADOWS_n -USE MODD_STATION_n -USE MODD_SUB_CH_FIELD_VALUE_n -USE MODD_SUB_CH_MONITOR_n -USE MODD_SUB_ELEC_n -USE MODD_SUB_MODEL_n -USE MODD_SUB_PASPOL_n -USE MODD_SUB_PHYS_PARAM_n -USE MODD_TIMEZ -USE MODD_TURB_n -USE MODD_NEB_n, ONLY: NEB_GOTO_MODEL -! -! -use mode_field, only: Fieldlist_goto_model -use mode_msg -! -! -IMPLICIT NONE -! -INTEGER, INTENT(IN) :: KFROM, KTO -LOGICAL, OPTIONAL, INTENT(IN) :: ONOFIELDLIST -! -CHARACTER(LEN=64) :: YMSG -LOGICAL :: GNOFIELDLIST -! -WRITE(YMSG,'( I4,"->",I4 )') KFROM,KTO -CALL PRINT_MSG(NVERB_DEBUG,'GEN','GOTO_MODEL_WRAPPER',TRIM(YMSG)) -! -IF (PRESENT(ONOFIELDLIST)) THEN - GNOFIELDLIST = ONOFIELDLIST -ELSE - GNOFIELDLIST = .FALSE. -END IF -! -! All calls to specific modd_*n goto_model routines -! -CALL ADV_GOTO_MODEL(KFROM, KTO) -CALL BIKHARDT_GOTO_MODEL(KFROM, KTO) -CALL BLANK_GOTO_MODEL(KFROM,KTO) -CALL CH_AERO_GOTO_MODEL(KFROM,KTO) -CALL CH_FLX_GOTO_MODEL(KFROM, KTO) -CALL CH_JVALUES_GOTO_MODEL(KFROM, KTO) -CALL CH_MNHC_GOTO_MODEL(KFROM, KTO) -CALL CH_SOLVER_GOTO_MODEL(KFROM, KTO) -CALL CLOUDPAR_GOTO_MODEL(KFROM, KTO) -CALL PARAM_ICE_GOTO_MODEL(KFROM, KTO) -CALL PARAM_LIMA_ASSOCIATE() !Not yet a goto_model but put here for simplicity and to prepare the transformation into a '_n' module -CALL RAIN_ICE_PARAM_GOTO_MODEL(KFROM, KTO) -CALL RAIN_ICE_DESCR_GOTO_MODEL(KFROM, KTO) -CALL CLOUD_MF_GOTO_MODEL(KFROM, KTO) -CALL CONF_GOTO_MODEL(KFROM, KTO) -CALL CURVCOR_GOTO_MODEL(KFROM, KTO) -!CALL DEEP_CONVECTION_GOTO_MODEL(KFROM, KTO) -CALL DIM_GOTO_MODEL(KFROM, KTO) -CALL DRAGTREE_GOTO_MODEL(KFROM, KTO) -CALL DRAGBLDG_GOTO_MODEL(KFROM, KTO) -CALL COUPLING_MULT_GOTO_MODEL(KFROM, KTO) -CALL DUMMY_GR_FIELD_GOTO_MODEL(KFROM, KTO) -CALL DYN_GOTO_MODEL(KFROM, KTO) -CALL DYNZD_GOTO_MODEL(KFROM,KTO) -CALL FIELD_GOTO_MODEL(KFROM, KTO) -!CALL PAST_FIELD_GOTO_MODEL(KFROM, KTO) -CALL GET_GOTO_MODEL(KFROM, KTO) -!CALL GR_FIELD_GOTO_MODEL(KFROM, KTO) -!$20140403 add grid_conf_proj_goto_model -!CALL GRID_CONF_PROJ_GOTO_MODEL(KFROM,KTO) -!$ -!CALL GRID_GOTO_MODEL(KFROM, KTO) -!CALL HURR_FIELD_GOTO_MODEL(KFROM, KTO) -!$20140403 add io_surf_mnh_goto_model!! -CALL IO_SURF_MNH_GOTO_MODEL(KFROM, KTO) -!$ -CALL LBC_GOTO_MODEL(KFROM, KTO) -CALL LES_GOTO_MODEL(KFROM, KTO) -CALL LSFIELD_GOTO_MODEL(KFROM, KTO) -CALL LUNIT_GOTO_MODEL(KFROM, KTO) -CALL MEAN_FIELD_GOTO_MODEL(KFROM, KTO) -CALL METRICS_GOTO_MODEL(KFROM, KTO) -CALL NEST_PGD_GOTO_MODEL(KFROM, KTO) -CALL NUDGING_GOTO_MODEL(KFROM, KTO) -CALL OUT_GOTO_MODEL(KFROM, KTO) -CALL PACK_GR_FIELD_GOTO_MODEL(KFROM, KTO) -CALL PARAM_KAFR_GOTO_MODEL(KFROM, KTO) -CALL PARAM_MFSHALL_GOTO_MODEL(KFROM, KTO) -CALL PARAM_GOTO_MODEL(KFROM, KTO) -CALL PARAM_RAD_GOTO_MODEL(KFROM, KTO) -#ifdef MNH_ECRAD -CALL PARAM_ECRAD_GOTO_MODEL(KFROM, KTO) -#endif -CALL PASPOL_GOTO_MODEL(KFROM, KTO) -#ifdef MNH_FOREFIRE -CALL FOREFIRE_GOTO_MODEL(KFROM, KTO) -#endif -CALL FIRE_GOTO_MODEL( KFROM, KTO ) -!CALL PRECIP_GOTO_MODEL(KFROM, KTO) -CALL ELEC_GOTO_MODEL(KFROM, KTO) -CALL RADIATIONS_GOTO_MODEL(KFROM, KTO) -CALL SHADOWS_GOTO_MODEL(KFROM, KTO) -CALL REF_GOTO_MODEL(KFROM, KTO) -CALL FRC_GOTO_MODEL(KFROM, KTO) -CALL SECPGD_FIELD_GOTO_MODEL(KFROM, KTO) -CALL SERIES_GOTO_MODEL(KFROM, KTO) -CALL PROFILER_GOTO_MODEL(KFROM, KTO) -CALL STATION_GOTO_MODEL(KFROM, KTO) -CALL ALLPROFILER_GOTO_MODEL(KFROM, KTO) -CALL ALLSTATION_GOTO_MODEL(KFROM, KTO) -CALL SUB_CH_FIELD_VALUE_GOTO_MODEL(KFROM, KTO) -CALL SUB_CH_MONITOR_GOTO_MODEL(KFROM, KTO) -CALL SUB_MODEL_GOTO_MODEL(KFROM, KTO) -CALL SUB_PHYS_PARAM_GOTO_MODEL(KFROM, KTO) -CALL SUB_PASPOL_GOTO_MODEL(KFROM, KTO) -CALL SUB_ELEC_GOTO_MODEL(KFROM, KTO) -!CALL TIME_GOTO_MODEL(KFROM, KTO) -CALL TURB_GOTO_MODEL(KFROM, KTO) -CALL NEB_GOTO_MODEL(KFROM, KTO) -CALL DRAG_GOTO_MODEL(KFROM, KTO) -CALL TIMEZ_GOTO_MODEL(KFROM, KTO) -CALL CH_PH_GOTO_MODEL(KFROM, KTO) -CALL CH_ICE_GOTO_MODEL(KFROM, KTO) -CALL CH_M9_GOTO_MODEL(KFROM, KTO) -CALL CH_ROSENBROCK_GOTO_MODEL(KFROM, KTO) -CALL RBK90_Global_GOTO_MODEL(KFROM, KTO) -CALL RBK90_JacobianSP_GOTO_MODEL(KFROM, KTO) -CALL RBK90_Parameters_GOTO_MODEL(KFROM, KTO) -! -!CALL LIMA_PRECIP_SCAVENGING_GOTO_MODEL(KFROM, KTO) -! -!CALL EDDY_FLUX_GOTO_MODEL(KFROM, KTO) -!CALL EDDYUV_FLUX_GOTO_MODEL(KFROM, KTO) -CALL ADVFRC_GOTO_MODEL(KFROM, KTO) -CALL RELFRC_GOTO_MODEL(KFROM, KTO) -CALL CH_PRODLOSSTOT_GOTO_MODEL(KFROM,KTO) -CALL CH_BUDGET_GOTO_MODEL(KFROM,KTO) -CALL BLOWSNOW_GOTO_MODEL(KFROM, KTO) -CALL IBM_GOTO_MODEL(KFROM, KTO) -CALL RECYCL_GOTO_MODEL(KFROM, KTO) -CALL LSF_GOTO_MODEL(KFROM, KTO) -! -IF (.NOT.GNOFIELDLIST) CALL FIELDLIST_GOTO_MODEL(KFROM, KTO) -! -END SUBROUTINE GOTO_MODEL_WRAPPER diff --git a/src/PHYEX/ext/ground_paramn.f90 b/src/PHYEX/ext/ground_paramn.f90 deleted file mode 100644 index 598dcdeec..000000000 --- a/src/PHYEX/ext/ground_paramn.f90 +++ /dev/null @@ -1,1521 +0,0 @@ -!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ########## -MODULE MODI_GROUND_PARAM_n -! ########## -! -INTERFACE -! - SUBROUTINE GROUND_PARAM_n(D, PSFTH, PSFTH_WALL, PSFTH_ROOF, PCD_ROOF, PSFRV, PSFRV_WALL, & - PSFRV_ROOF, PSFSV, PSFCO2, PSFU, PSFV, PDIR_ALB, PSCA_ALB, & - PEMIS, PTSRAD, KTCOUNT, TPFILE ) -! -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -! -!* surface fluxes -! -------------- -! -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_IO, ONLY: TFILEDATA -! -TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH ! Total surface flux of potential temperature (Km/s) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH_WALL ! Wall surface flux of potential temperature (Km/s) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH_ROOF ! Roof surface flux of potential temperature (Km/s) -REAL, DIMENSION(:,:), INTENT(OUT) :: PCD_ROOF ! Drag coefficient for roofs (-) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV ! Total surface flux of water vapor (m/s*kg/kg) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV_WALL ! Wall surface flux of water vapor (m/s*kg/kg) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV_ROOF ! Roof surface flux of water vapor (m/s*kg/kg) -REAL, DIMENSION(:,:,:),INTENT(OUT):: PSFSV ! surface flux of scalar (m/s*kg/kg) - ! flux of chemical var. (ppv.m/s) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFCO2! surface flux of CO2 (m/s*kg/kg) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFU ! surface fluxes of horizontal -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFV ! momentum in x and y directions (m2/s2) -! -!* Radiative parameters -! -------------------- -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDIR_ALB ! direct albedo for each spectral band (-) -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSCA_ALB ! diffuse albedo for each spectral band (-) -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMIS ! surface emissivity (-) -REAL, DIMENSION(:,:), INTENT(OUT) :: PTSRAD ! surface radiative temperature (K) -! -INTEGER, INTENT(IN) :: KTCOUNT ! temporal iteration count -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Synchronous output file -END SUBROUTINE GROUND_PARAM_n -! -END INTERFACE -! -END MODULE MODI_GROUND_PARAM_n -! -! ###################################################################### - SUBROUTINE GROUND_PARAM_n(D, PSFTH, PSFTH_WALL, PSFTH_ROOF, PCD_ROOF, PSFRV, & - PSFRV_WALL, PSFRV_ROOF, PSFSV, PSFCO2, PSFU, & - PSFV, PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD, KTCOUNT, TPFILE ) -! ####################################################################### -! -! -!!**** *GROUND_PARAM* -!! -!! PURPOSE -!! ------- -! Monitor to call the externalized surface -! -!!** METHOD -!! ------ -! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! Noilhan and Planton (1989) -!! -!! AUTHOR -!! ------ -!! S. Belair * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 10/03/95 -!! (J.Stein) 25/10/95 add the rain flux computation at the ground -!! and the lbc -!! (J.Stein) 15/11/95 include the strong slopes cases -!! (J.Stein) 06/02/96 bug correction for the precipitation flux writing -!! (J.Stein) 20/05/96 set the right IGRID value for the rain rate -!! (J.Viviand) 04/02/97 add cold and convective precipitation rate -!! (J.Stein) 22/06/97 use the absolute pressure -!! (V.Masson) 09/07/97 add directional z0 computations and RESA correction -!! (V.Masson) 13/02/98 merge the ISBA and TSZ0 routines, -!! rename the routine as a monitor, called by PHYS_PARAMn -!! add the town parameterization -!! recomputes z0 where snow is. -!! pack and unpack of 2D fields into 1D fields -!! (V.Masson) 04/01/00 removes the TSZ0 case -! (F.Solmon/V.Masson) adapatation for patch approach -! modification of internal subroutine pack/ allocation in function -! of patch indices -! calling of isba for each defined patch -! averaging of patch fluxes to get nat fluxes -! (P. Tulet/G.Guenais) 04/02/01 separation of vegetatives class -! for friction velocity and -! aerodynamical resistance -! (S Donnier) 09/12/02 add specific humidity at 2m for diagnostic -! (V.Masson) 01/03/03 externalisation of the surface schemes! -! (P.Tulet ) 01/11/03 externalisation of the surface chemistry! -!! (D.Gazen) 01/12/03 change emissions handling for surf. externalization -!! (J.escobar) 18/10/2012 missing USE MODI_COUPLING_SURF_ATM_n & MODI_DIAG_SURF_ATM_n -! (J.escobar) 02/2014 add Forefire coupling -!! (G.Delautier) 06/2016 phasage surfex 8 -!! (B.Vie) 2016 LIMA -!! (J.Pianezze) 08/2016 add send/recv oasis functions -!! (M.Leriche) 24/03/16 remove flag for chemical surface fluxes -!! (M.Leriche) 01/07/2017 Add DIAG chimical surface fluxes -!! 01/2018 (G.Delautier) SURFEX 8.1 -!! 02/2018 Q.Libois ECRAD -!! (P.Wautelet) 28/03/2018 replace TEMPORAL_DIST by DATETIME_DISTANCE - -!! (V. Vionnet) 18/07/2017 add coupling for blowing snow module -!! (Bielli S.) 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! R. Schoetter 12/2021 multi-level coupling between MesoNH and SURFEX -! A. Costes 12/2021: Blaze Fire model -! P. Wautelet 09/02/2022: bugfix: add missing XCURRENT_LEI computation -! P. Wautelet 30/09/2022: bugfix: missing communications for SWDIFF, SWDIR and LEI -! P. Wautelet 30/09/2022: bugfix: use XUNDEF from SURFEX for surface variables computed by SURFEX -! P. Wautelet 21/10/2022: bugfix: communicate halo values between processes for OUT variables -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_ALLPROFILER_n, ONLY: LDIAG_SURFRAD_PROF -USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD_STAT -USE MODD_ARGSLIST_ll, ONLY: LIST_ll -USE MODD_BLOWSNOW, ONLY: LBLOWSNOW, NBLOWSNOW_2D, YPBLOWSNOW_2D -USE MODD_BLOWSNOW_n, ONLY: XRSNWCANOS -USE MODD_BUDGET, ONLY: LBUDGET_TH, LBUDGET_RV, NBUDGET_RV, NBUDGET_TH, TBUDGETS -USE MODD_CH_AEROSOL, ONLY: LORILAM -USE MODD_CH_FLX_n, ONLY: XCHFLX -USE MODD_CH_MNHC_n, ONLY: LUSECHEM -USE MODD_CONF, ONLY: CPROGRAM, LCARTESIAN, NHALO -USE MODD_COUPLING_LEVELS_n -USE MODD_CONF_n, ONLY: NRR -USE MODD_CST, ONLY: XP00, XCPD, XRD, XRV, XRHOLW, XDAY, XPI, XMD, XAVOGADRO -USE MODD_CSTS_DUST, ONLY: XMOLARWEIGHT_DUST -USE MODD_CSTS_SALT, ONLY: XMOLARWEIGHT_SALT -USE MODD_DEEP_CONVECTION_n, ONLY: XPRCONV, XPRSCONV -USE MODD_DRAGBLDG_n, ONLY : LFLUXBLDG -USE MODD_DIAG_FLAG, ONLY: LCHEMDIAG -USE MODD_DIAG_IN_RUN -USE MODD_DIM_n, ONLY: NKMAX -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_DUST, ONLY: LDUST -USE MODD_DYN_n, ONLY: XTSTEP -USE MODD_FIELD_n, ONLY: XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS, XRTHS, XRRS -USE MODD_FIRE_n, ONLY: XLSPHI, XBMAP, XFMR0, XFMRFA, XFMWF0, XFMR00, XFMIGNITION, XFMFUELTYPE, & - XFIRETAU, XFLUXPARAMH, XFLUXPARAMW, XFIRERW, XFMASE, XFMAWC, XFMWALKIG, & - XFMFLUXHDH, XFMFLUXHDW, XFMHWS, XFMWINDU, XFMWINDV, XFMWINDW, XGRADLSPHIX, & - XGRADLSPHIY, XFIREWIND, XFMGRADOROX, XFMGRADOROY -USE MODD_GRID, ONLY: XLON0, XRPK, XBETA -USE MODD_GRID_n, ONLY: XLON, XZZ, XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & - XCOSSLOPE, XSINSLOPE, XZS -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZZ -USE MODD_MNH_SURFEX_n, ONLY: YSURF_CUR -USE MODD_NSV, ONLY: CSV, NSV, NSV_AERBEG, NSV_AEREND, NSV_CHEMBEG, NSV_CHEMEND, NSV_DSTBEG, NSV_DSTEND, & - NSV_SLTBEG, NSV_SLTEND, NSV_SNWBEG, NSV_SNWEND -USE MODD_PARAM_C2R2, ONLY: LSEDC -USE MODD_PREP_SNOW, ONLY: NIMPUR -USE MODD_PARAMETERS, ONLY: JPVEXT -USE MODD_PARAM_ICE_n, ONLY: LSEDIC -USE MODD_PARAM_LIMA, ONLY: MSEDC=>LSEDC -USE MODD_PARAM_n, ONLY: CDCONV, CCLOUD, CRAD, CTURB -USE MODD_PRECIP_n, ONLY: XINPRC, XINPRR, XINPRS, XINPRG, XINPRH -USE MODD_PRECISION, ONLY: MNHTIME -USE MODD_PROFILER_n, ONLY: LPROFILER -USE MODD_RADIATIONS_n, ONLY: XFLALWD, XCCO2, XTSIDER, & - XSW_BANDS, XDIRSRFSWD, XSCAFLASWD, & - XZENITH, XAZIM, XAER, XSWU, XLWU -USE MODD_REF_n, ONLY: XEXNREF, XRHODREF, XRHODJ -USE MODD_SALT, ONLY: LSALT -USE MODD_STATION_n, ONLY: LSTATION -USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF -USE MODD_TIME, ONLY: TDTSEG -USE MODD_TIME_n, ONLY: TDTCUR -#ifdef CPLOASIS -USE MODD_SFX_OASIS, ONLY: LOASIS -USE MODD_DYN, ONLY: XSEGLEN -USE MODD_DYN_n, ONLY: DYN_MODEL -#endif -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE -USE MODD_FOREFIRE_n -#endif - -USE MODE_BUDGET, ONLY: BUDGET_STORE_INIT, BUDGET_STORE_END -USE MODE_DATETIME -USE MODE_FIRE_MODEL -USE MODE_ll -USE MODE_MNH_TIMING, ONLY: SECOND_MNH2 -USE MODE_MSG -USE MODE_ROTATE_WIND, ONLY: ROTATE_WIND - -USE MODI_COUPLING_SURF_ATM_n -USE MODI_DIAG_SURF_ATM_n -USE MODI_MNHGET_SURF_PARAM_n -USE MODI_NORMAL_INTERPOL -USE MODI_SHUMAN -#ifdef CPLOASIS -USE MODI_GET_HALO -USE MODI_MNH_OASIS_RECV -USE MODI_MNH_OASIS_SEND -#endif -#ifdef MNH_FOREFIRE -USE MODI_COUPLING_FOREFIRE_n -#endif -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -!* surface fluxes -! -------------- -! -TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH ! Total surface flux of potential temperature (Km/s) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH_WALL ! Wall surface flux of potential temperature (Km/s) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH_ROOF ! Roof surface flux of potential temperature (Km/s) -REAL, DIMENSION(:,:), INTENT(OUT) :: PCD_ROOF ! Drag coefficient for roofs (-) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV ! Total surface flux of water vapor (m/s*kg/kg) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV_WALL ! Wall surface flux of water vapor (m/s*kg/kg) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV_ROOF ! Roof surface flux of water vapor (m/s*kg/kg) -REAL, DIMENSION(:,:,:),INTENT(OUT):: PSFSV ! surface flux of scalar (m/s*kg/kg) - ! flux of chemical var. (ppv.m/s) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFCO2! surface flux of CO2 (m/s*kg/kg) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFU ! surface fluxes of horizontal -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFV ! momentum in x and y directions (m2/s2) -! -!* Radiative parameters -! -------------------- -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDIR_ALB ! direct albedo for each spectral band (-) -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSCA_ALB ! diffuse albedo for each spectral band (-) -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMIS ! surface emissivity (-) -REAL, DIMENSION(:,:), INTENT(OUT) :: PTSRAD ! surface radiative temperature (K) -! -INTEGER, INTENT(IN) :: KTCOUNT ! temporal iteration count -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Synchronous output file -! -!------------------------------------------------------------------------------- -! -! -! -!* 0.2 declarations of local variables -! ------------------------------- -! -! -!* Atmospheric variables -! --------------------- -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV ! vapor mixing ratio -! -! suffix 'A' stands for atmospheric variable at first model level -! -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZRAIN ! liquid precipitation (kg/m2/s) -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSNOW ! solid precipitation (kg/m2/s) -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZTSUN ! solar time (s since midnight) -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZPS ! Surface pressure -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZEXNS ! Surface Exner function -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZCO2 ! CO2 concentration (kg/kg) -! -! Variables for which multiple levels are sent to SURFEX and related ancilliary variables -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZREF ! Forcing height -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTA ! Temperature -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVA ! vapor mixing ratio -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZQA ! humidity (kg/m3) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPA ! Pressure -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXNA ! Exner function -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHA ! potential temperature -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZUA ! u component of the wind parallel to the orography -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZVA ! v component of the wind parallel to the orography -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZU ! zonal wind -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZV ! meridian wind -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWIND ! wind parallel to the orography -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHOA ! air density -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTKE ! Subgrid turbulent kinetic energy -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDIR ! wind direction (rad from N clockwise) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZALFA ! angle between the wind and the x axis -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZU2D ! u and v component of the -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZV2D ! wind at mass point -! -! SURFEX output fluxes -! -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFU ! zonal momentum flux -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFV ! meridian momentum flux -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFTH ! Total turbulent flux of heat -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFTH_SURF ! Surface turbulent flux of heat -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFTH_WALL ! Wall turbulent flux of heat -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFTH_ROOF ! Roof turbulent flux of heat -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZCD_ROOF ! Drag coefficient for roofs -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFTQ ! Total turbulent flux of water -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFTQ_SURF ! Surface turbulent flux of water -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFTQ_WALL ! Wall turbulent flux of water -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFTQ_ROOF ! Roof turbulent flux of water -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFCO2 ! Turbulent flux of CO2 -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),NSV):: ZSFTS ! Turbulent flux of scalar -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),NBLOWSNOW_2D) :: ZBLOWSNOW_2D ! 2D blowing snow variables - ! after advection - ! They refer to the 2D fields advected by MNH including: - ! - total number concentration in Canopy - ! - total mass concentration in Canopy - ! - equivalent concentration in the saltation layer - -! -! Anxiliary variables -! -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZZREF_DIST -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZZREF_VERT -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZWEIGHT_VERT -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZAGLW_ILEV -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZAGLW_ILEVP1 -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZAGLSCAL_ILEV -! -!* Dimensions -! ---------- -! -INTEGER :: IIB ! physical boundary -INTEGER :: IIE ! physical boundary -INTEGER :: IJB ! physical boundary -INTEGER :: IJE ! physical boundary -INTEGER :: IKB ! physical boundary -INTEGER :: IKE ! physical boundary -INTEGER :: IKU ! vertical array sizes -! -INTEGER :: JLAYER ! loop counter -INTEGER :: JSV ! loop counter -INTEGER :: JI,JJ,JK ! loop index -! -INTEGER :: IDIM1 ! X physical dimension -INTEGER :: IDIM2 ! Y physical dimension -INTEGER :: IDIM1D! total physical dimension -INTEGER :: IKRAD -! -INTEGER :: KSV_SURF ! Number of scalar variables sent to SURFEX -! -!* Arrays put in 1D vectors -! ------------------------ -! -! Pure surface variables or variables forced at only one level -! -REAL, DIMENSION(:), ALLOCATABLE :: ZP_CO2 ! air CO2 concentration -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SV ! scalar at first atmospheric level -REAL, DIMENSION(:), ALLOCATABLE :: ZP_RAIN ! liquid precipitation -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SNOW ! solid precipitation -REAL, DIMENSION(:), ALLOCATABLE :: ZP_LW ! incoming longwave -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_DIR_SW ! direct incoming shortwave -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SCA_SW ! diffuse incoming shortwave -REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZWS ! significant wave height (m) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PS ! surface pressure -REAL, DIMENSION(:), ALLOCATABLE :: ZP_TSUN ! solar time -REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZENITH ! zenithal angle -REAL, DIMENSION(:), ALLOCATABLE :: ZP_AZIM ! azimuthal angle -REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZS ! orography -! -! Variables that are forced at multiple levels -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_ZREF ! forcing height -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_U ! zonal wind -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_V ! meridian wind -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_QA ! air humidity (kg/m3) -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_TA ! air temperature -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_RHOA ! air density -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_PA ! pressure at first atmospheric level -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_TKE ! Subgrid turbulent kinetic energy -! -! SURFEX output variables -! -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTQ ! Total water vapor flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTQ_SURF ! Surface water vapor flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTQ_WALL ! Wall water vapor flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTQ_ROOF ! Roof water vapor flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTH ! Total potential temperature flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTH_SURF ! Surface potential temperature flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTH_WALL ! Wall potential temperature flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTH_ROOF ! Roof potential temperature flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_CD_ROOF ! Drag coefficient for roofs -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SFTS ! scalar flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFCO2 ! CO2 flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFU ! zonal momentum flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFV ! meridian momentum flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_TSRAD ! radiative surface temperature -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_DIR_ALB ! direct albedo -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SCA_ALB ! diffuse albedo -REAL, DIMENSION(:), ALLOCATABLE :: ZP_EMIS ! emissivity -REAL, DIMENSION(:), ALLOCATABLE :: ZP_TSURF -REAL, DIMENSION(:), ALLOCATABLE :: ZP_Z0 -REAL, DIMENSION(:), ALLOCATABLE :: ZP_Z0H -REAL, DIMENSION(:), ALLOCATABLE :: ZP_QSURF -! -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEW_A_COEF ! coefficients for -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEW_B_COEF ! implicit coupling -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PET_A_COEF -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEQ_A_COEF -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PET_B_COEF -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEQ_B_COEF -REAL, DIMENSION(:), ALLOCATABLE :: ZP_RN ! net radiation (W/m2) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_H ! sensible heat flux (W/m2) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_LE ! Total latent heat flux (W/m2) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_LEI ! Solid Latent heat flux (W/m2) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_GFLUX ! ground flux (W/m2) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_T2M ! Air temperature at 2 meters (K) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_Q2M ! Air humidity at 2 meters (kg/kg) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_HU2M ! Air relative humidity at 2 meters (-) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZON10M ! zonal Wind at 10 meters (m/s) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_MER10M ! meridian Wind at 10 meters (m/s) -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_ZIMPWET ! wet deposit coefficient for each impurity type (g) -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_ZIMPDRY ! dry deposit coefficient for each impurity type (g) - -TYPE(LIST_ll), POINTER :: TZFIELDSURF_ll ! list of fields to exchange -INTEGER :: IINFO_ll ! return code of parallel routine -! -! -CHARACTER(LEN=6) :: YJSV -CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: YSV_SURF ! name of the scalar variables - ! sent to SURFEX -! -LOGICAL :: GSTATPROF_SURF ! TRUE if station or profiler need to write surface or radiation data -REAL :: ZTIMEC -INTEGER :: ILUOUT ! logical unit -! -! New variables for coupling at several levels -! -REAL :: ZAGLW_JK -REAL :: ZAGLW_JKP1 -REAL :: ZAGLSCAL_JK -INTEGER :: ICOUNT, ILEV -! -! Fire model -REAL(KIND=MNHTIME), DIMENSION(2) :: ZFIRETIME1, ZFIRETIME2 ! CPU time for Blaze perf profiling -REAL(KIND=MNHTIME), DIMENSION(2) :: ZGRADTIME1, ZGRADTIME2 ! CPU time for Blaze perf profiling -REAL(KIND=MNHTIME), DIMENSION(2) :: ZPROPAGTIME1, ZPROPAGTIME2 ! CPU time for Blaze perf profiling -REAL(KIND=MNHTIME), DIMENSION(2) :: ZFLUXTIME1, ZFLUXTIME2 ! CPU time for Blaze perf profiling -REAL(KIND=MNHTIME), DIMENSION(2) :: ZROSWINDTIME1, ZROSWINDTIME2 ! CPU time for Blaze perf profiling -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZFIREFUELMAP ! Fuel map -CHARACTER(LEN=7) :: YFUELMAPFILE ! Fuel Map file name -TYPE(LIST_ll), POINTER :: TZFIELDFIRE_ll ! list of fields to exchange -! -!------------------------------------------------------------------------------- -! -! -ILUOUT=TLUOUT%NLU -IKB= 1+JPVEXT -IKU=NKMAX + 2* JPVEXT -IKE=IKU-JPVEXT -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -PSFTH = XUNDEF_SFX -PSFTH_WALL = XUNDEF_SFX -PSFTH_ROOF = XUNDEF_SFX -PCD_ROOF = XUNDEF_SFX -PSFRV = XUNDEF_SFX -PSFRV_WALL = XUNDEF_SFX -PSFRV_ROOF = XUNDEF_SFX -! -PSFSV = XUNDEF_SFX -PSFCO2 = XUNDEF_SFX -PSFU = XUNDEF_SFX -PSFV = XUNDEF_SFX -PDIR_ALB = XUNDEF_SFX -PSCA_ALB = XUNDEF_SFX -PEMIS = XUNDEF_SFX -PTSRAD = XUNDEF_SFX -! -! Allocation of the local variables -! -ALLOCATE(ZZREF(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZTA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZRVA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZQA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZPA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZEXNA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZTHA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZUA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZVA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZU(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZV(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZWIND(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZRHOA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -IF(CTURB/='NONE') ALLOCATE(ZTKE(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZDIR(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZALFA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZU2D(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -ALLOCATE(ZV2D(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE)) -! -GSTATPROF_SURF = ( LPROFILER .AND. LDIAG_SURFRAD_PROF ) .OR. ( LSTATION .AND. LDIAG_SURFRAD_STAT ) -! -!------------------------------------------------------------------------------- -! -!* 1. CONVERSION OF THE ATMOSPHERIC VARIABLES -! --------------------------------------- -! -! 1.1 water vapor -! ----------- - -! -ALLOCATE(ZRV(SIZE(PSFTH,1),SIZE(PSFTH,2),IKU)) -! -IF(NRR>0) THEN - ZRV(:,:,:)=XRT(:,:,:,1) -ELSE - ZRV(:,:,:)=0. -END IF -! -! 1.2 Horizontal wind direction (rad from N clockwise) -! ------------------------- -! -ZU2D(:,:,:)=MXF(XUT(:,:,IKB:(IKB+NLEV_COUPLE-1))) -ZV2D(:,:,:)=MYF(XVT(:,:,IKB:(IKB+NLEV_COUPLE-1))) -! -!* angle between Y axis and wind (rad., clockwise) -! -ZALFA = 0. -! -DO ILEV=1,NLEV_COUPLE - ! - WHERE(ZU2D(:,:,ILEV)/=0. .OR. ZV2D(:,:,ILEV)/=0.) - ZALFA(:,:,ILEV)=ATAN2(ZU2D(:,:,ILEV),ZV2D(:,:,ILEV)) - END WHERE - ! - WHERE(ZALFA(:,:,ILEV)<0.) ZALFA(:,:,ILEV) = ZALFA(:,:,ILEV) + 2. * XPI - ! - !* angle between North and wind (rad., clockwise) - ! - IF (.NOT. LCARTESIAN) THEN - ZDIR(:,:,ILEV) = ( (XRPK*(XLON(:,:)-XLON0)) - XBETA ) * XPI/180. + ZALFA(:,:,ILEV) - ELSE - ZDIR(:,:,ILEV) = - XBETA * XPI/180. + ZALFA(:,:,ILEV) - ENDIF - ! - ! 1.3 Rotate the wind - ! Only for the first forcing level, used for friction force direction. - ! --------------- - ! - IF (ILEV.EQ.1) THEN - ! - CALL ROTATE_WIND(D,XUT,XVT,XWT, & - XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & - XCOSSLOPE,XSINSLOPE, & - XDXX,XDYY,XDZZ, & - ZUA(:,:,ILEV),ZVA(:,:,ILEV) ) - ! - ELSE - ! - ZUA(:,:,ILEV) = XUT(:,:,IKB+ILEV-1) - ZVA(:,:,ILEV) = XVT(:,:,IKB+ILEV-1) - ! - ENDIF - ! - ! 1.4 zonal and meridian components of the wind parallel to the slope - ! --------------------------------------------------------------- - ! - ZWIND(:,:,ILEV) = SQRT( ZUA(:,:,ILEV)**2 + ZVA(:,:,ILEV)**2 ) - ! - ZU(:,:,ILEV) = ZWIND(:,:,ILEV) * SIN(ZDIR(:,:,ILEV)) - ZV(:,:,ILEV) = ZWIND(:,:,ILEV) * COS(ZDIR(:,:,ILEV)) - ! -ENDDO - ! - ! 1.5 Horizontal interpolation of the thermodynamic fields - ! ------------------------------------------------- - ! - ! This horizontal interpolation is only made if the forcing is located at the first level - ! -IF (NLEV_COUPLE.EQ.1) THEN - ! - CALL NORMAL_INTERPOL(XTHT,ZRV,XPABST, & - XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & - XCOSSLOPE,XSINSLOPE, & - XDXX,XDYY,XDZZ, & - ZTHA(:,:,1),ZRVA(:,:,1),ZEXNA(:,:,1) ) - ! -ELSE - ! - ZEXNA (:,:,1:NLEV_COUPLE) = (XPABST(:,:,IKB:(IKB+NLEV_COUPLE-1))/XP00) ** (XRD/XCPD) - ZTHA (:,:,1:NLEV_COUPLE) = XTHT(:,:,IKB:(IKB+NLEV_COUPLE-1)) - ZRVA (:,:,1:NLEV_COUPLE) = ZRV (:,:,IKB:(IKB+NLEV_COUPLE-1)) - ! -ENDIF -! -DEALLOCATE(ZRV) -! -! -! 1.6 Pressure and Exner function -! --------------------------- -! -ZPA(:,:,:) = XP00 * ZEXNA(:,:,:) ** (XCPD/XRD) -! -ZEXNS(:,:) = 0.5 * ( (XPABST(:,:,IKB-1)/XP00)**(XRD/XCPD) & - +(XPABST(:,:,IKB )/XP00)**(XRD/XCPD) & - ) -ZPS(:,:) = XP00 * ZEXNS(:,:) **(XCPD/XRD) -! -! 1.7 humidity in kg/m3 from the mixing ratio -! --------------------------------------- -! -ZQA(:,:,:) = ZRVA(:,:,:) * XRHODREF(:,:,IKB:(IKB+NLEV_COUPLE-1)) -! -! 1.8 Temperature from the potential temperature -! ------------------------------------------ -! -ZTA(:,:,:) = ZTHA(:,:,:) * ZEXNA(:,:,:) -! -! 1.9 Air density -! ----------- -! -ZRHOA(:,:,:) = ZPA(:,:,:)/(XRD * ZTA(:,:,:) * & - ((1. + (XRD/XRV)*ZRVA(:,:,:)) / (1. + ZRVA(:,:,:)))) -! -! Subgrid turbulent kinetic energy -! -IF(CTURB/='NONE') ZTKE(:,:,:) = XTKET(:,:,IKB:(IKB+NLEV_COUPLE-1)) -! -! 1.10 Precipitations -! -------------- -! -ZRAIN=0. -ZSNOW=0. -IF (NRR>2 .AND. SIZE(XINPRR)>0 ) THEN - IF (( CCLOUD(1:3) == 'ICE' .AND. LSEDIC) .OR. & - ((CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') .AND. LSEDC) .OR. & - ( CCLOUD=='LIMA' .AND. MSEDC)) THEN - ZRAIN = ZRAIN + XINPRR * XRHOLW + XINPRC * XRHOLW - ELSE - ZRAIN = ZRAIN + XINPRR * XRHOLW - END IF -END IF -IF (CDCONV == 'KAFR') THEN - ZRAIN = ZRAIN + (XPRCONV - XPRSCONV) * XRHOLW - ZSNOW = ZSNOW + XPRSCONV * XRHOLW -END IF -IF( NRR >= 5 .AND. SIZE(XINPRS)>0 ) ZSNOW = ZSNOW + XINPRS * XRHOLW -IF( NRR >= 6 .AND. SIZE(XINPRG)>0 ) ZSNOW = ZSNOW + XINPRG * XRHOLW -IF( NRR >= 7 .AND. SIZE(XINPRH)>0 ) ZSNOW = ZSNOW + XINPRH * XRHOLW -! -! -! 1.11 Solar time -! ---------- -! -IF (.NOT. LCARTESIAN) THEN - ZTSUN(:,:) = MOD(TDTCUR%xtime -XTSIDER*3600. +XLON(:,:)*240., XDAY) -ELSE - ZTSUN(:,:) = MOD(TDTCUR%xtime -XTSIDER*3600. +XLON0 *240., XDAY) -END IF -! -! 1.12 Forcing level -! ------------- -! -! A smooth transition between vertical height above ground and -! distance to the surface is implemented here. -! We assume that for katabatic winds located in the first meters above -! ground, the distance to the surface is the most relevant whereas -! for most other processes it will be the vertical distance to the surface -! -DO ILEV=1,NLEV_COUPLE - ! - ! Height above ground of w-levels - ! - ZAGLW_ILEV (:,:) = XZZ(:,:,JPVEXT+ILEV ) - XZZ(:,:,1+JPVEXT) - ZAGLW_ILEVP1 (:,:) = XZZ(:,:,JPVEXT+ILEV+1) - XZZ(:,:,1+JPVEXT) - ! - ! Height above ground of scalar variables and (u,v) - ! - ZAGLSCAL_ILEV(:,:) = 0.5 * ( ZAGLW_ILEV(:,:) + ZAGLW_ILEVP1(:,:) ) - ! - ! Distance to the inclined surface and vertical distance - ! - ZZREF_DIST(:,:) = ZAGLSCAL_ILEV(:,:) * XDIRCOSZW(:,:) - ! - ZZREF_VERT(:,:) = ZAGLSCAL_ILEV(:,:) - ! - ! Scaling between 5 m and 20 m height - ! - ZWEIGHT_VERT(:,:) = MIN(1.0,MAX(ZZREF_VERT(:,:)-5.0,0.0)/15.0) - ! - IF (MAXVAL(ZWEIGHT_VERT).GT.1.0) STOP ("Wrong weight") - IF (MINVAL(ZWEIGHT_VERT).LT.0.0) STOP ("Wrong weight") - ! - ZZREF(:,:,ILEV) = ZWEIGHT_VERT(:,:) * ZZREF_VERT(:,:) + (1.0 - ZWEIGHT_VERT(:,:)) * ZZREF_DIST(:,:) - ! -ENDDO -! -! 1.13 CO2 concentration (kg/m3) -! ----------------- -! -ZCO2(:,:) = XCCO2 * XRHODREF(:,:,IKB) -! -! -! -! 1.14 Blowing snow scheme (optional) -! ----------------- -! -ZBLOWSNOW_2D=0. - -IF(LBLOWSNOW) THEN - KSV_SURF = NSV+NBLOWSNOW_2D ! When blowing snow scheme is used - ! NBLOWSN0W_2D variables are sent to SURFEX through ZP_SV. - ! They refer to the 2D fields advected by MNH including: - ! - total number concentration in Canopy - ! - total mass concentration in Canopy - ! - equivalent concentration in the saltation layer - ! Initialize array of scalar to be sent to SURFEX including 2D blowing snow fields - ALLOCATE(YSV_SURF(KSV_SURF)) - YSV_SURF(1:NSV) = CSV(:) - YSV_SURF(NSV+1:KSV_SURF) = YPBLOWSNOW_2D(:) - - - DO JSV=1,NBLOWSNOW_2D - ZBLOWSNOW_2D(:,:,JSV) = XRSNWCANOS(:,:,JSV)*XTSTEP/XRHODJ(:,:,IKB) - END DO - -ELSE - KSV_SURF = NSV - ALLOCATE(YSV_SURF(KSV_SURF)) - YSV_SURF(:) = CSV(1:NSV) -ENDIF -! -! -!------------------------------------------------------------------------------- -! -!* 2. Call to surface monitor with 2D variables -! ----------------------------------------- -! -! -! initial values: -! -IDIM1 = IIE-IIB+1 -IDIM2 = IJE-IJB+1 -IDIM1D = IDIM1*IDIM2 -! -! -! Transform 2D input fields into 1D: -! -CALL RESHAPE_SURF(IDIM1D) -! -! call to have the cumulated time since beginning of simulation -! -CALL DATETIME_DISTANCE(TDTSEG,TDTCUR,ZTIMEC) - -#ifdef CPLOASIS -IF (LOASIS) THEN - IF ( MOD(ZTIMEC,1.0) .LE. 1E-2 .OR. (1.0 - MOD(ZTIMEC,1.0)) .LE. 1E-2 ) THEN - IF ( NINT(ZTIMEC-(XSEGLEN-DYN_MODEL(1)%XTSTEP)) .LT. 0 ) THEN - WRITE(ILUOUT,*) '----------------------------' - WRITE(ILUOUT,*) ' Reception des champs avec OASIS' - WRITE(ILUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC) - CALL MNH_OASIS_RECV(CPROGRAM,IDIM1D,SIZE(XSW_BANDS),ZTIMEC+XTSTEP,XTSTEP, & - ZP_ZENITH,XSW_BANDS , & - ZP_TSRAD,ZP_DIR_ALB,ZP_SCA_ALB,ZP_EMIS,ZP_TSURF) - WRITE(ILUOUT,*) '----------------------------' - END IF - END IF -END IF -#endif -! -! Call to surface schemes -! -CALL COUPLING_SURF_ATM_MULTI_LEVEL_n(YSURF_CUR,'MESONH', 'E',ZTIMEC, XTSTEP, & - TDTCUR%nyear, TDTCUR%nmonth, TDTCUR%nday, TDTCUR%xtime, & - IDIM1D,KSV_SURF,SIZE(XSW_BANDS), NLEV_COUPLE, ZP_TSUN, ZP_ZENITH,ZP_ZENITH, & - ZP_AZIM, ZP_ZREF, ZP_ZREF, ZP_ZS, ZP_U, ZP_V, ZP_QA, ZP_TA, ZP_RHOA, ZP_SV, & - ZP_CO2, ZP_ZIMPWET, ZP_ZIMPDRY, YSV_SURF, & - ZP_RAIN, ZP_SNOW, ZP_LW, ZP_DIR_SW, ZP_SCA_SW, XSW_BANDS, & - ZP_PS, ZP_PA, ZP_TKE, ZP_SFTQ, ZP_SFTQ_SURF, ZP_SFTQ_WALL, ZP_SFTQ_ROOF, & - ZP_SFTH, ZP_SFTH_SURF, ZP_SFTH_WALL, ZP_SFTH_ROOF, ZP_CD_ROOF, ZP_SFTS, & - ZP_SFCO2, ZP_SFU, ZP_SFV, ZP_TSRAD, ZP_DIR_ALB, ZP_SCA_ALB, ZP_EMIS, ZP_TSURF, & - ZP_Z0, ZP_Z0H, ZP_QSURF, ZP_PEW_A_COEF, ZP_PEW_B_COEF, ZP_PET_A_COEF, & - ZP_PEQ_A_COEF, ZP_PET_B_COEF, ZP_PEQ_B_COEF, ZP_ZWS, 'OK' ) - -! -#ifdef CPLOASIS -IF (LOASIS) THEN - IF ( MOD(ZTIMEC,1.0) .LE. 1E-2 .OR. (1.0 - MOD(ZTIMEC,1.0)) .LE. 1E-2 ) THEN - IF (NINT(ZTIMEC-(XSEGLEN-DYN_MODEL(1)%XTSTEP)) .LT. 0) THEN - WRITE(ILUOUT,*) '----------------------------' - WRITE(ILUOUT,*) ' Envoi des champs avec OASIS' - WRITE(ILUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC) - CALL MNH_OASIS_SEND(CPROGRAM,IDIM1D,ZTIMEC+XTSTEP,XTSTEP) - WRITE(ILUOUT,*) '----------------------------' - END IF - END IF -END IF -#endif -! -IF ( CPROGRAM == 'DIAG' .OR. GSTATPROF_SURF ) THEN - CALL DIAG_SURF_ATM_n( YSURF_CUR, 'MESONH' ) - IF ( CPROGRAM == 'DIAG' ) THEN - CALL MNHGET_SURF_PARAM_n(PZON10M=ZP_ZON10M, PMER10M=ZP_MER10M) - ELSE - CALL MNHGET_SURF_PARAM_n( PRN=ZP_RN, PH=ZP_H, PLE=ZP_LE, PLEI=ZP_LEI, & - PGFLUX=ZP_GFLUX, PT2M=ZP_T2M, PQ2M=ZP_Q2M, PHU2M=ZP_HU2M, & - PZON10M=ZP_ZON10M, PMER10M=ZP_MER10M) - END IF -END IF -! -! Transform 1D output fields into 2D: -! -CALL UNSHAPE_SURF(IDIM1,IDIM2) -#ifdef MNH_FOREFIRE -!------------------------! -! COUPLING WITH FOREFIRE ! -!------------------------! - -IF ( LFOREFIRE ) THEN - CALL FOREFIRE_DUMP_FIELDS_n(XUT, XVT, XWT, XSVT& - , XTHT, XRT(:,:,:,1), XPABST, XTKET& - , IDIM1+2, IDIM2+2, NKMAX+2) -END IF - -IF ( FFCOUPLING ) THEN - - CALL SEND_GROUND_WIND_n(XUT, XVT, IKB, IINFO_ll) - - CALL FOREFIRE_RECEIVE_PARAL_n() - - CALL COUPLING_FOREFIRE_n(XTSTEP, ZSFTH, ZSFTQ, ZSFTS) - - CALL FOREFIRE_SEND_PARAL_n(IINFO_ll) - -END IF - -FF_TIME = FF_TIME + XTSTEP -#endif -! -! Friction of components along slope axes (U: largest local slope axis, V: zero slope axis) -! -PSFU(:,:) = 0. -PSFV(:,:) = 0. -! -WHERE (ZSFU(:,:)/=XUNDEF_SFX .AND. ZWIND(:,:,1)>0.) - PSFU(:,:) = - SQRT(ZSFU**2+ZSFV**2) * ZUA(:,:,1) / ZWIND(:,:,1) / XRHODREF(:,:,IKB) - PSFV(:,:) = - SQRT(ZSFU**2+ZSFV**2) * ZVA(:,:,1) / ZWIND(:,:,1) / XRHODREF(:,:,IKB) -END WHERE -! -PCD_ROOF(:,:) = ZCD_ROOF(:,:) -! - -!* 2.1 Blaze Fire Model -! ---------------- -! -IF (LBLAZE) THEN - ! get start time - CALL SECOND_MNH2( ZFIRETIME1 ) - - !* 2.1.1 Local variables allocation - ! -------------------------- - ! - - ! Parallel fuel - NULLIFY(TZFIELDFIRE_ll) - IF (KTCOUNT <= 1) THEN - ! fuelmap - SELECT CASE (CPROPAG_MODEL) - CASE('SANTONI2011') - ! - ALLOCATE( ZFIREFUELMAP(SIZE(XLSPHI,1), SIZE(XLSPHI,2), SIZE(XLSPHI,3), 22) ); - ! Parallel fuel - CALL ADD4DFIELD_ll( TZFIELDFIRE_ll, ZFIREFUELMAP(:,:,:,1::22), 'MODEL_n::ZFIREFUELMAP' ) - ! Default value - ZFIREFUELMAP(:,:,:,:) = 0. - END SELECT - - !* 2.1.2 Read fuel map file - ! ------------------ - ! - ! Fuel map file name - YFUELMAPFILE = 'FuelMap' - ! - CALL FIRE_READFUEL( TPFILE, ZFIREFUELMAP, XFMIGNITION, XFMWALKIG ) - - !* 2.1.3 Ignition LS function with ignition map - ! -------------------------------------- - ! - SELECT CASE (CFIRE_CPL_MODE) - CASE('2WAYCPL', 'ATM2FIR') - ! force ignition - WHERE (XFMIGNITION <= TDTCUR%XTIME ) XLSPHI = 1. - ! walking ignition - CALL FIRE_LS_RECONSTRUCTION_FROM_BMAP( XLSPHI, XFMWALKIG, 0.) - ! - !* 2.1.4 Update BMAP - ! ----------- - ! - WHERE (XLSPHI >= .5 .AND. XBMAP < 0) XBMAP = TDTCUR%XTIME - ! - CASE('FIR2ATM') - CALL FIRE_READBMAP(TPFILE,XBMAP) - - END SELECT - ! - !* 2.1.5 Compute R0, A, Wf0, R00 - ! ----------------------- - ! - SELECT CASE (CPROPAG_MODEL) - CASE('SANTONI2011') - CALL FIRE_NOWINDROS( ZFIREFUELMAP, XFMR0, XFMRFA, XFMWF0, XFMR00, XFMFUELTYPE, XFIRETAU, XFLUXPARAMH, & - XFLUXPARAMW, XFMASE, XFMAWC ) - END SELECT - ! - !* 2.1.6 Compute orographic gradient - ! --------------------------- - CALL FIRE_GRAD_OROGRAPHY( XZS, XFMGRADOROX, XFMGRADOROY ) - ! - !* 2.1.7 Test halo size - ! -------------- - IF (NHALO < 2 .AND. NFIRE_WENO_ORDER == 3) THEN - CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'GROUND_PARAM_n', 'BLAZE-FIRE: WENO3 fire gradient calculation needs NHALO >= 2' ) - ELSE IF (NHALO < 3 .AND. NFIRE_WENO_ORDER == 5) THEN - CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'GROUND_PARAM_n', 'BLAZE-FIRE: WENO5 fire gradient calculation needs NHALO >= 3' ) - END IF - ! - END IF - ! - !* 2.1.6 Compute grad of level set function phi - ! -------------------------------------- - ! - SELECT CASE (CFIRE_CPL_MODE) - CASE('2WAYCPL', 'ATM2FIR') - ! get time 1 - CALL SECOND_MNH2( ZGRADTIME1 ) - CALL FIRE_GRADPHI( XLSPHI, XGRADLSPHIX, XGRADLSPHIY ) - - ! get time 2 - CALL SECOND_MNH2( ZGRADTIME2 ) - XGRADPERF = XGRADPERF + ZGRADTIME2 - ZGRADTIME1 - ! - !* 2.1.7 Get horizontal wind speed projected on LS gradient direction - ! ------------------------------------------------------------ - ! - CALL FIRE_GETWIND( XUT, XVT, XWT, XGRADLSPHIX, XGRADLSPHIY, XFIREWIND, KTCOUNT, XTSTEP, XFMGRADOROX, XFMGRADOROY ) - ! - !* 2.1.8 Compute ROS XFIRERW with wind - ! ----------------------------- - ! - ! - SELECT CASE (CPROPAG_MODEL) - CASE('SANTONI2011') - CALL FIRE_RATEOFSPREAD( XFMFUELTYPE, XFMR0, XFMRFA, XFMWF0, XFMR00, XFIREWIND, XGRADLSPHIX, XGRADLSPHIY, & - XFMGRADOROX, XFMGRADOROY, XFIRERW ) - END SELECT - CALL SECOND_MNH2( ZROSWINDTIME2 ) - XROSWINDPERF = XROSWINDPERF + ZROSWINDTIME2 - ZGRADTIME2 - ! - !* 2.1.8 Integrate model on atm time step to propagate - ! --------------------------------------------- - ! - SELECT CASE (CPROPAG_MODEL) - CASE('SANTONI2011') - CALL FIRE_PROPAGATE( XLSPHI, XBMAP, XFMIGNITION, XFMWALKIG, XGRADLSPHIX, XGRADLSPHIY, XTSTEP, XFIRERW ) - END SELECT - CALL SECOND_MNH2( ZPROPAGTIME2 ) - XPROPAGPERF = XPROPAGPERF + ZPROPAGTIME2 - ZROSWINDTIME2 - ! - CASE('FIR2ATM') - ! - CALL SECOND_MNH2( ZPROPAGTIME1 ) - CALL FIRE_LS_RECONSTRUCTION_FROM_BMAP( XLSPHI, XBMAP, XTSTEP ) - CALL SECOND_MNH2( ZPROPAGTIME2 ) - XPROPAGPERF = XPROPAGPERF + ZPROPAGTIME2 - ZPROPAGTIME1 - XGRADPERF(:) = 0. - ! - END SELECT - ! - !* 2.1.8 Compute fluxes - ! -------------- - ! - IF (LBUDGET_RV) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RV), 'BLAZE', XRRS(:,:,:,1)) - IF (LBUDGET_TH) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_TH), 'BLAZE', XRTHS(:,:,:)) - ! - SELECT CASE (CFIRE_CPL_MODE) - CASE('2WAYCPL','FIR2ATM') - CALL SECOND_MNH2( ZFLUXTIME1 ) - ! 2 way coupling - CALL FIRE_HEATFLUXES( XLSPHI, XBMAP, XFIRETAU, XTSTEP, XFLUXPARAMH, XFLUXPARAMW, XFMFLUXHDH, XFMFLUXHDW, XFMASE, XFMAWC ) - ! - ! vertical distribution of fire heat fluxes - CALL FIRE_VERTICALFLUXDISTRIB( XFMFLUXHDH, XFMFLUXHDW, XRTHS, XRRS, ZSFTS, XEXNREF, XRHODJ, XRT, XRHODREF ) - ! - CALL SECOND_MNH2( ZFLUXTIME2 ) - XFLUXPERF = XFLUXPERF + ZFLUXTIME2 - ZFLUXTIME1 - CASE DEFAULT - XFLUXPERF(:) = 0. - END SELECT - ! - IF (LBUDGET_RV) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RV), 'BLAZE', XRRS(:,:,:,1)) - IF (LBUDGET_TH) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_TH), 'BLAZE', XRTHS(:,:,:)) - ! - ! get end time - CALL SECOND_MNH2( ZFIRETIME2 ) - ! add to Blaze time - XFIREPERF = XFIREPERF + ZFIRETIME2 - ZFIRETIME1 -END IF -!* conversion from H (W/m2) to w'Theta' -! -! Unit conversions: -! -!* H: (W/m2) to w'Theta' -! -!* Water flux: (kg/m2/s) to w'rv' -! -IF (LFLUXBLDG) THEN - ! - ! Robert: Here the wall and roof fluxes are substracted from the surface fluxes - ! since they will be applied in drag_bld.F90 - ! - PSFTH(:,:) = ( ZSFTH(:,:) - ZSFTH_WALL(:,:) - ZSFTH_ROOF(:,:) ) / XCPD / XRHODREF(:,:,IKB) - PSFRV(:,:) = ( ZSFTQ(:,:) - ZSFTQ_WALL(:,:) - ZSFTQ_ROOF(:,:) ) / XRHODREF(:,:,IKB) - ! - ! Wall and roof fluxes are written on separate variables - ! - PSFTH_WALL(:,:) = ZSFTH_WALL(:,:) / XCPD / XRHODREF(:,:,IKB) - PSFTH_ROOF(:,:) = ZSFTH_ROOF(:,:) / XCPD / XRHODREF(:,:,IKB) - ! - PSFRV_WALL(:,:) = ZSFTQ_WALL(:,:) / XRHODREF(:,:,IKB) - PSFRV_ROOF(:,:) = ZSFTQ_ROOF(:,:) / XRHODREF(:,:,IKB) - ! - ! Test conservation of fluxes - ! - IF (MAXVAL(ABS(ZSFTH(:,:)/XCPD/XRHODREF(:,:,IKB) - PSFTH(:,:) - PSFTH_WALL(:,:)& - - PSFTH_ROOF(:,:))).GT.1.0E-6) STOP ("Wrong H flux partition") - IF (MAXVAL(ABS(ZSFTQ(:,:)/XRHODREF(:,:,IKB) - PSFRV(:,:) - PSFRV_WALL(:,:)& - - PSFRV_ROOF(:,:))).GT.1.0E-6) STOP ("Wrong Q flux partition") - ! -ELSE - ! - ! Otherwise the full surface fluxes are taken - ! - PSFTH(:,:) = ZSFTH(:,:) / XCPD / XRHODREF(:,:,IKB) - PSFRV(:,:) = ZSFTQ(:,:) / XRHODREF(:,:,IKB) - ! - PSFTH_WALL(:,:) = 0.0 - PSFTH_ROOF(:,:) = 0.0 - ! - PSFRV_WALL(:,:) = 0.0 - PSFRV_ROOF(:,:) = 0.0 - ! -ENDIF -! -!* conversion from scalar flux (kg/m2/s) to w'rsv' -! -IF(NSV .GT. 0) THEN - DO JSV=1,NSV - PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) / XRHODREF(:,:,IKB) - END DO -END IF -! -!* conversion from chemistry flux (molec/m2/s) to (ppv.m.s-1) -! -IF (LUSECHEM) THEN - DO JSV=NSV_CHEMBEG,NSV_CHEMEND - PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / ( XAVOGADRO * XRHODREF(:,:,IKB)) - IF ((LCHEMDIAG).AND.(CPROGRAM == 'DIAG ')) XCHFLX(:,:,JSV-NSV_CHEMBEG+1) = PSFSV(:,:,JSV) - END DO -ELSE - PSFSV(:,:,NSV_CHEMBEG:NSV_CHEMEND) = 0. -END IF -! -!* conversion from dust flux (kg/m2/s) to (ppv.m.s-1) -! -IF (LDUST) THEN - DO JSV=NSV_DSTBEG,NSV_DSTEND - PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / (XMOLARWEIGHT_DUST * XRHODREF(:,:,IKB)) - END DO -ELSE - PSFSV(:,:,NSV_DSTBEG:NSV_DSTEND) = 0. -END IF -! -!* conversion from sea salt flux (kg/m2/s) to (ppv.m.s-1) -! -IF (LSALT) THEN - DO JSV=NSV_SLTBEG,NSV_SLTEND - PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / (XMOLARWEIGHT_SALT * XRHODREF(:,:,IKB)) - END DO -ELSE - PSFSV(:,:,NSV_SLTBEG:NSV_SLTEND) = 0. -END IF -! -!* conversion from aerosol flux (molec/m2/s) to (ppv.m.s-1) -! -IF (LORILAM) THEN - DO JSV=NSV_AERBEG,NSV_AEREND - PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / ( XAVOGADRO * XRHODREF(:,:,IKB)) - END DO -ELSE - PSFSV(:,:,NSV_AERBEG:NSV_AEREND) = 0. -END IF -! -!* conversion from blowing snow flux (kg/m2/s) to [kg(snow)/kg(dry air).m.s-1] -! -IF (LBLOWSNOW) THEN - DO JSV=NSV_SNWBEG,NSV_SNWEND - PSFSV(:,:,JSV) = ZSFTS(:,:,JSV)/ (ZRHOA(:,:,1)) - END DO - !* Update tendency for blowing snow 2D fields - DO JSV=1,(NBLOWSNOW_2D) - XRSNWCANOS(:,:,JSV) = ZBLOWSNOW_2D(:,:,JSV)*XRHODJ(:,:,IKB)/(XTSTEP*ZRHOA(:,:,1)) - END DO - -ELSE - PSFSV(:,:,NSV_SNWBEG:NSV_SNWEND) = 0. -END IF -! -!* conversion from CO2 flux (kg/m2/s) to w'CO2' -! -PSFCO2(:,:) = ZSFCO2(:,:) / XRHODREF(:,:,IKB) -! -! Communicate halo values -! -NULLIFY(TZFIELDSURF_ll) -!The commented communications are done in PHYS_PARAM_n -! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFTH, 'GROUND_PARAM_n::PSFTH' ) -! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFRV, 'GROUND_PARAM_n::PSFRV' ) -! DO JSV = 1, NSV -! WRITE( YJSV, '( I6.6 )' ) JSV -! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFSV(:,:,JSV), 'GROUND_PARAM_n::PSFSV'//YJSV ) -! END DO -! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFCO2, 'GROUND_PARAM_n::PSFCO2' ) -! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFU, 'GROUND_PARAM_n::PSFU' ) -! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFV, 'GROUND_PARAM_n::PSFV' ) -DO JLAYER = 1, SIZE( PDIR_ALB, 3 ) - WRITE( YJSV, '( I6.6 )' ) JLAYER - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PDIR_ALB(:,:,JLAYER), 'GROUND_PARAM_n::PDIR_ALB'//YJSV ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSCA_ALB(:,:,JLAYER), 'GROUND_PARAM_n::PSCA_ALB'//YJSV ) -END DO -DO JLAYER = 1, SIZE( PEMIS, 3 ) - WRITE( YJSV, '( I6.6 )' ) JLAYER - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PEMIS(:,:,JLAYER), 'GROUND_PARAM_n::PEMIS'//YJSV ) -END DO -CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PTSRAD, 'GROUND_PARAM_n::PTSRAD' ) - -CALL UPDATE_HALO_ll(TZFIELDSURF_ll,IINFO_ll) -CALL CLEANLIST_ll(TZFIELDSURF_ll) -! -!* Diagnostics -! ----------- -! -! -IF ( CPROGRAM == 'DIAG' .OR. GSTATPROF_SURF ) THEN - XCURRENT_SFCO2(:,:) = ZSFCO2(:,:) - IF ( CRAD /= 'NONE' ) THEN - XCURRENT_LWD (:,:) = XFLALWD(:,:) - XCURRENT_SWD (:,:) = SUM( XDIRSRFSWD(:,:,:) + XSCAFLASWD(:,:,:), DIM=3 ) - XCURRENT_LWU (:,:) = XLWU(:,:,IKB) - XCURRENT_SWU (:,:) = XSWU(:,:,IKB) - IF ( GSTATPROF_SURF .AND. CPROGRAM /= 'DIAG' ) THEN - XCURRENT_SWDIR(:,:) = SUM( XDIRSRFSWD(:,:,:), DIM=3 ) - XCURRENT_SWDIFF(:,:) = SUM( XSCAFLASWD(:,:,:), DIM=3 ) - XCURRENT_DSTAOD(:,:) = 0.0 - XCURRENT_SLTAOD(:,:) = 0.0 - DO JK=IKB,IKE - IKRAD = JK - 1 - DO JJ = IJB, IJE - DO JI = IIB, IIE - XCURRENT_DSTAOD(JI,JJ) = XCURRENT_DSTAOD(JI,JJ) + XAER(JI,JJ,IKRAD,3) - XCURRENT_SLTAOD(JI,JJ) = XCURRENT_SLTAOD(JI,JJ) + XAER(JI,JJ,IKRAD,2) - END DO - END DO - END DO - END IF - END IF - NULLIFY(TZFIELDSURF_ll) - - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SFCO2, 'GROUND_PARAM_n::XCURRENT_SFCO2' ) - IF ( CRAD /= 'NONE' ) THEN - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWD, 'GROUND_PARAM_n::XCURRENT_LWD' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWD, 'GROUND_PARAM_n::XCURRENT_SWD' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWU, 'GROUND_PARAM_n::XCURRENT_LWU' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWU, 'GROUND_PARAM_n::XCURRENT_SWU' ) - IF ( GSTATPROF_SURF .AND. CPROGRAM /= 'DIAG' ) THEN - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWDIR, 'GROUND_PARAM_n::XCURRENT_SWDIR' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWDIFF, 'GROUND_PARAM_n::XCURRENT_SWDIFF' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_DSTAOD, 'GROUND_PARAM_n::XCURRENT_DSTAOD' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SLTAOD, 'GROUND_PARAM_n::XCURRENT_SLTAOD' ) - END IF - END IF - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_ZON10M, 'GROUND_PARAM_n::XCURRENT_ZON10M' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_MER10M, 'GROUND_PARAM_n::XCURRENT_MER10M' ) - IF ( GSTATPROF_SURF .AND. CPROGRAM /= 'DIAG' ) THEN - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_RN, 'GROUND_PARAM_n::XCURRENT_RN' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_H, 'GROUND_PARAM_n::XCURRENT_H' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LE, 'GROUND_PARAM_n::XCURRENT_LE' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LEI, 'GROUND_PARAM_n::XCURRENT_LEI' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_GFLUX, 'GROUND_PARAM_n::XCURRENT_GFLUX' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_T2M, 'GROUND_PARAM_n::XCURRENT_T2M' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_Q2M, 'GROUND_PARAM_n::XCURRENT_Q2M' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_HU2M, 'GROUND_PARAM_n::XCURRENT_HU2M' ) - END IF - ! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_ZWS, 'GROUND_PARAM_n::XCURRENT_ZWS' ) - - CALL UPDATE_HALO_ll(TZFIELDSURF_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDSURF_ll) - ! -END IF -! -IF (LBLAZE) THEN - IF (KTCOUNT <= 1) THEN - DEALLOCATE(ZFIREFUELMAP) - END IF - CALL CLEANLIST_ll(TZFIELDFIRE_ll) -END IF -!================================================================================== -! -CONTAINS -! -!================================================================================== -! -SUBROUTINE RESHAPE_SURF(KDIM1D) -! -INTEGER, INTENT(IN) :: KDIM1D -INTEGER, DIMENSION(1) :: ISHAPE_1 -! -ISHAPE_1 = (/KDIM1D/) -! -! Variables that are coupled at multiple levels -! -ALLOCATE(ZP_ZREF (KDIM1D,NLEV_COUPLE)) -ALLOCATE(ZP_U (KDIM1D,NLEV_COUPLE)) -ALLOCATE(ZP_V (KDIM1D,NLEV_COUPLE)) -ALLOCATE(ZP_QA (KDIM1D,NLEV_COUPLE)) -ALLOCATE(ZP_TA (KDIM1D,NLEV_COUPLE)) -ALLOCATE(ZP_PA (KDIM1D,NLEV_COUPLE)) -ALLOCATE(ZP_RHOA (KDIM1D,NLEV_COUPLE)) -ALLOCATE(ZP_TKE (KDIM1D,NLEV_COUPLE)) -! -! 2D Variables and variables that are coupled at the surface only -! -ALLOCATE(ZP_TSUN (KDIM1D)) -ALLOCATE(ZP_ZENITH (KDIM1D)) -ALLOCATE(ZP_AZIM (KDIM1D)) -ALLOCATE(ZP_ZS (KDIM1D)) -ALLOCATE(ZP_SV (KDIM1D,KSV_SURF)) -ALLOCATE(ZP_CO2 (KDIM1D)) -ALLOCATE(ZP_RAIN (KDIM1D)) -ALLOCATE(ZP_SNOW (KDIM1D)) -ALLOCATE(ZP_LW (KDIM1D)) -ALLOCATE(ZP_DIR_SW (KDIM1D,SIZE(XDIRSRFSWD,3))) -ALLOCATE(ZP_SCA_SW (KDIM1D,SIZE(XSCAFLASWD,3))) -ALLOCATE(ZP_PS (KDIM1D)) -ALLOCATE(ZP_ZWS (KDIM1D)) -! -! 2D SURFEX output fields -! -ALLOCATE(ZP_SFTQ (KDIM1D)) -ALLOCATE(ZP_SFTQ_SURF (KDIM1D)) -ALLOCATE(ZP_SFTQ_WALL (KDIM1D)) -ALLOCATE(ZP_SFTQ_ROOF (KDIM1D)) -ALLOCATE(ZP_SFTH (KDIM1D)) -ALLOCATE(ZP_SFTH_SURF (KDIM1D)) -ALLOCATE(ZP_SFTH_WALL (KDIM1D)) -ALLOCATE(ZP_SFTH_ROOF (KDIM1D)) -ALLOCATE(ZP_CD_ROOF (KDIM1D)) -ALLOCATE(ZP_SFU (KDIM1D)) -ALLOCATE(ZP_SFV (KDIM1D)) -ALLOCATE(ZP_SFTS (KDIM1D,KSV_SURF)) -ALLOCATE(ZP_SFCO2 (KDIM1D)) -ALLOCATE(ZP_TSRAD (KDIM1D)) -ALLOCATE(ZP_DIR_ALB (KDIM1D,SIZE(PDIR_ALB,3))) -ALLOCATE(ZP_SCA_ALB (KDIM1D,SIZE(PSCA_ALB,3))) -ALLOCATE(ZP_EMIS (KDIM1D)) -ALLOCATE(ZP_TSURF (KDIM1D)) -ALLOCATE(ZP_Z0 (KDIM1D)) -ALLOCATE(ZP_Z0H (KDIM1D)) -ALLOCATE(ZP_QSURF (KDIM1D)) -IF ( GSTATPROF_SURF ) THEN - ALLOCATE(ZP_RN (KDIM1D)) - ALLOCATE(ZP_H (KDIM1D)) - ALLOCATE(ZP_LE (KDIM1D)) - ALLOCATE(ZP_LEI (KDIM1D)) - ALLOCATE(ZP_GFLUX (KDIM1D)) - ALLOCATE(ZP_T2M (KDIM1D)) - ALLOCATE(ZP_Q2M (KDIM1D)) - ALLOCATE(ZP_HU2M (KDIM1D)) -END IF -IF ( CPROGRAM == 'DIAG' .OR. GSTATPROF_SURF ) THEN - ALLOCATE(ZP_ZON10M (KDIM1D)) - ALLOCATE(ZP_MER10M (KDIM1D)) -END IF -! -!* explicit coupling only -ALLOCATE(ZP_PEW_A_COEF (KDIM1D)) -ALLOCATE(ZP_PEW_B_COEF (KDIM1D)) -ALLOCATE(ZP_PET_A_COEF (KDIM1D)) -ALLOCATE(ZP_PEQ_A_COEF (KDIM1D)) -ALLOCATE(ZP_PET_B_COEF (KDIM1D)) -ALLOCATE(ZP_PEQ_B_COEF (KDIM1D)) -! -! 2D variables or surface only -! -ZP_TSUN(:) = RESHAPE(ZTSUN(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_PS(:) = RESHAPE(ZPS(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_ZS(:) = RESHAPE(XZS(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_CO2(:) = RESHAPE(ZCO2(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_SNOW(:) = RESHAPE(ZSNOW(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_RAIN(:) = RESHAPE(ZRAIN(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_ZWS(:) = RESHAPE(XZWS(IIB:IIE,IJB:IJE), ISHAPE_1) -! -! Variables that are coupled on multiple levels -! -DO JLAYER=1,NLEV_COUPLE - ZP_ZREF(:,JLAYER) = RESHAPE(ZZREF(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) - ZP_PA(:,JLAYER) = RESHAPE(ZPA(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) - ZP_TA(:,JLAYER) = RESHAPE(ZTA(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) - ZP_QA(:,JLAYER) = RESHAPE(ZQA(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) - ZP_RHOA(:,JLAYER) = RESHAPE(ZRHOA(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) - IF(CTURB/='NONE') ZP_TKE(:,JLAYER) = RESHAPE(ZTKE(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) - ZP_U(:,JLAYER) = RESHAPE(ZU(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) - ZP_V(:,JLAYER) = RESHAPE(ZV(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) -END DO -! -DO JLAYER=1,NSV - ZP_SV(:,JLAYER) = RESHAPE(XSVT(IIB:IIE,IJB:IJE,IKB,JLAYER), ISHAPE_1) -END DO -! -IF(LBLOWSNOW) THEN - DO JLAYER=1,NBLOWSNOW_2D - ZP_SV(:,NSV+JLAYER) = RESHAPE(ZBLOWSNOW_2D(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) - END DO -END IF -! -!chemical conversion : from part/part to molec./m3 -DO JLAYER=NSV_CHEMBEG,NSV_CHEMEND - ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XAVOGADRO * ZP_RHOA(:,1) / XMD -END DO -DO JLAYER=NSV_AERBEG,NSV_AEREND - ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XAVOGADRO * ZP_RHOA(:,1) / XMD -END DO -!dust conversion : from part/part to kg/m3 -DO JLAYER=NSV_DSTBEG,NSV_DSTEND - ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XMOLARWEIGHT_DUST* ZP_RHOA(:,1) / XMD -END DO -!sea salt conversion : from part/part to kg/m3 -DO JLAYER=NSV_SLTBEG,NSV_SLTEND - ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XMOLARWEIGHT_SALT* ZP_RHOA(:,1) / XMD -END DO -! -!blowing snow conversion : from kg(snow)/kg(dry air) to kg(snow)/m3 -DO JLAYER=NSV_SNWBEG,NSV_SNWEND - ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * ZP_RHOA(:,1) -END DO - -IF(LBLOWSNOW) THEN ! Convert 2D blowing snow fields - ! from kg(snow)/kg(dry air) to kg(snow)/m3 - DO JLAYER=(NSV+1),KSV_SURF - ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * ZP_RHOA(:,1) - END DO -END IF -! -ZP_ZENITH(:) = RESHAPE(XZENITH(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_AZIM (:) = RESHAPE(XAZIM (IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_LW(:) = RESHAPE(XFLALWD(IIB:IIE,IJB:IJE), ISHAPE_1) -DO JLAYER=1,SIZE(XDIRSRFSWD,3) - ZP_DIR_SW(:,JLAYER) = RESHAPE(XDIRSRFSWD(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) - ZP_SCA_SW(:,JLAYER) = RESHAPE(XSCAFLASWD(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) -END DO -! -ZP_PEW_A_COEF = 0. -ZP_PEW_B_COEF = 0. -ZP_PET_A_COEF = 0. -ZP_PEQ_A_COEF = 0. -ZP_PET_B_COEF = 0. -ZP_PEQ_B_COEF = 0. -! -END SUBROUTINE RESHAPE_SURF -!================================================i================================= -SUBROUTINE UNSHAPE_SURF(KDIM1,KDIM2) -! -INTEGER, INTENT(IN) :: KDIM1, KDIM2 -INTEGER, DIMENSION(2) :: ISHAPE_2 -! -ISHAPE_2 = (/KDIM1,KDIM2/) -! -! Arguments in call to surface: -! -ZSFTH = XUNDEF_SFX -ZSFTH_SURF = XUNDEF_SFX -ZSFTH_WALL = XUNDEF_SFX -ZSFTH_ROOF = XUNDEF_SFX -ZCD_ROOF = XUNDEF_SFX -ZSFTQ = XUNDEF_SFX -ZSFTQ_SURF = XUNDEF_SFX -ZSFTQ_WALL = XUNDEF_SFX -ZSFTQ_ROOF = XUNDEF_SFX -! -IF (NSV>0) ZSFTS = XUNDEF_SFX -ZSFCO2 = XUNDEF_SFX -ZSFU = XUNDEF_SFX -ZSFV = XUNDEF_SFX -! -ZSFTH (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTH(:), ISHAPE_2) -ZSFTH_SURF (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTH_SURF(:), ISHAPE_2) -ZSFTH_WALL (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTH_WALL(:), ISHAPE_2) -ZSFTH_ROOF (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTH_ROOF(:), ISHAPE_2) -ZCD_ROOF (IIB:IIE,IJB:IJE) = RESHAPE(ZP_CD_ROOF(:), ISHAPE_2) -ZSFTQ (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTQ(:), ISHAPE_2) -ZSFTQ_SURF (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTQ_SURF(:), ISHAPE_2) -ZSFTQ_WALL (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTQ_WALL(:), ISHAPE_2) -ZSFTQ_ROOF (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTQ_ROOF(:), ISHAPE_2) -! -DO JLAYER=1,SIZE(PSFSV,3) - ZSFTS (IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_SFTS(:,JLAYER), ISHAPE_2) -END DO -! -ZSFCO2 (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFCO2(:), ISHAPE_2) -ZSFU (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFU(:), ISHAPE_2) -ZSFV (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFV(:), ISHAPE_2) -DO JLAYER=1,SIZE(PEMIS,3) - PEMIS (IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_EMIS(:), ISHAPE_2) -END DO -PTSRAD (IIB:IIE,IJB:IJE) = RESHAPE(ZP_TSRAD(:), ISHAPE_2) -IF(LBLOWSNOW) THEN - DO JLAYER=1,NBLOWSNOW_2D - ZBLOWSNOW_2D(IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_SFTS(:,NSV+JLAYER), ISHAPE_2) - END DO -END IF -! -IF ( GSTATPROF_SURF .AND. CPROGRAM /= 'DIAG' ) THEN - XCURRENT_RN (IIB:IIE,IJB:IJE) = RESHAPE(ZP_RN(:), ISHAPE_2) - XCURRENT_H (IIB:IIE,IJB:IJE) = RESHAPE(ZP_H (:), ISHAPE_2) - XCURRENT_LE (IIB:IIE,IJB:IJE) = RESHAPE(ZP_LE(:), ISHAPE_2) - XCURRENT_LEI (IIB:IIE,IJB:IJE) = RESHAPE(ZP_LEI(:), ISHAPE_2) - XCURRENT_GFLUX (IIB:IIE,IJB:IJE) = RESHAPE(ZP_GFLUX(:), ISHAPE_2) - XCURRENT_T2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_T2M(:), ISHAPE_2) - XCURRENT_Q2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_Q2M(:), ISHAPE_2) - XCURRENT_HU2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_HU2M(:), ISHAPE_2) -END IF -IF ( GSTATPROF_SURF .OR. CPROGRAM == 'DIAG' ) THEN - XCURRENT_ZON10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZON10M(:), ISHAPE_2) - XCURRENT_MER10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_MER10M(:), ISHAPE_2) - ! XCURRENT_ZWS (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZWS(:), ISHAPE_2) -END IF -! -DO JLAYER=1,SIZE(PDIR_ALB,3) - PDIR_ALB(IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_DIR_ALB(:,JLAYER), ISHAPE_2) - PSCA_ALB(IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_SCA_ALB(:,JLAYER), ISHAPE_2) -END DO -! -DEALLOCATE(ZP_TSUN ) -DEALLOCATE(ZP_ZENITH ) -DEALLOCATE(ZP_AZIM ) -DEALLOCATE(ZP_ZREF ) -DEALLOCATE(ZP_ZS ) -DEALLOCATE(ZP_U ) -DEALLOCATE(ZP_V ) -DEALLOCATE(ZP_QA ) -DEALLOCATE(ZP_TA ) -DEALLOCATE(ZP_RHOA ) -DEALLOCATE(ZP_TKE ) -DEALLOCATE(ZP_SV ) -DEALLOCATE(ZP_CO2 ) -DEALLOCATE(ZP_RAIN ) -DEALLOCATE(ZP_SNOW ) -DEALLOCATE(ZP_LW ) -DEALLOCATE(ZP_DIR_SW ) -DEALLOCATE(ZP_SCA_SW ) -DEALLOCATE(ZP_PS ) -DEALLOCATE(ZP_PA ) -DEALLOCATE(ZP_ZWS ) -! -DEALLOCATE(ZP_SFTQ ) -DEALLOCATE(ZP_SFTQ_SURF) -DEALLOCATE(ZP_SFTQ_WALL) -DEALLOCATE(ZP_SFTQ_ROOF) -DEALLOCATE(ZP_SFTH ) -DEALLOCATE(ZP_SFTH_SURF) -DEALLOCATE(ZP_SFTH_WALL) -DEALLOCATE(ZP_SFTH_ROOF) -DEALLOCATE(ZP_CD_ROOF) -DEALLOCATE(ZP_SFTS ) -DEALLOCATE(ZP_SFCO2 ) -DEALLOCATE(ZP_SFU ) -DEALLOCATE(ZP_SFV ) -DEALLOCATE(ZP_TSRAD ) -DEALLOCATE(ZP_DIR_ALB ) -DEALLOCATE(ZP_SCA_ALB ) -DEALLOCATE(ZP_EMIS ) -IF ( GSTATPROF_SURF ) THEN - DEALLOCATE(ZP_RN ) - DEALLOCATE(ZP_H ) - DEALLOCATE(ZP_LE ) - DEALLOCATE(ZP_LEI ) - DEALLOCATE(ZP_GFLUX ) - DEALLOCATE(ZP_T2M ) - DEALLOCATE(ZP_Q2M ) - DEALLOCATE(ZP_HU2M ) -END IF -IF ( CPROGRAM == 'DIAG' .OR. GSTATPROF_SURF ) THEN - DEALLOCATE(ZP_ZON10M ) - DEALLOCATE(ZP_MER10M ) -END IF - -DEALLOCATE(ZP_PEW_A_COEF ) -DEALLOCATE(ZP_PEW_B_COEF ) -DEALLOCATE(ZP_PET_A_COEF ) -DEALLOCATE(ZP_PEQ_A_COEF ) -DEALLOCATE(ZP_PET_B_COEF ) -DEALLOCATE(ZP_PEQ_B_COEF ) -! -END SUBROUTINE UNSHAPE_SURF -!================================================================================== -! -END SUBROUTINE GROUND_PARAM_n diff --git a/src/PHYEX/ext/ibm_affectv.f90 b/src/PHYEX/ext/ibm_affectv.f90 deleted file mode 100644 index fee54c3e0..000000000 --- a/src/PHYEX/ext/ibm_affectv.f90 +++ /dev/null @@ -1,402 +0,0 @@ -!MNH_LIC Copyright 2019-2022 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! -! ####################### -MODULE MODI_IBM_AFFECTV - ! ####################### - ! - INTERFACE - ! - SUBROUTINE IBM_AFFECTV(PVAR,PVAR2,PVAR3,HVAR,KIBM_LAYER,HIBM_MODE_INTE3,& - HIBM_FORC_BOUNR,PRADIUS,PPOWERS,& - HIBM_MODE_INT1N,HIBM_TYPE_BOUNN,HIBM_MODE_BOUNN,HIBM_FORC_BOUNN,PIBM_FORC_BOUNN,& - HIBM_MODE_INT1T,HIBM_TYPE_BOUNT,HIBM_MODE_BOUNT,HIBM_FORC_BOUNT,PIBM_FORC_BOUNT,& - HIBM_MODE_INT1C,HIBM_TYPE_BOUNC,HIBM_MODE_BOUNC,HIBM_FORC_BOUNC,PIBM_FORC_BOUNC,PXMU,PDIV) - ! - REAL, DIMENSION(:,:,:) ,INTENT(INOUT) :: PVAR - REAL, DIMENSION(:,:,:,:) ,INTENT(IN) :: PVAR2,PVAR3 - CHARACTER(LEN=1) ,INTENT(IN) :: HVAR - INTEGER ,INTENT(IN) :: KIBM_LAYER - REAL ,INTENT(IN) :: PRADIUS - REAL ,INTENT(IN) :: PPOWERS - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNR - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INTE3 - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INT1N - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_TYPE_BOUNN - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_BOUNN - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNN - REAL ,INTENT(IN) :: PIBM_FORC_BOUNN - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INT1T - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_TYPE_BOUNT - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_BOUNT - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNT - REAL ,INTENT(IN) :: PIBM_FORC_BOUNT - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INT1C - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_TYPE_BOUNC - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_BOUNC - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNC - REAL ,INTENT(IN) :: PIBM_FORC_BOUNC - REAL, DIMENSION(:,:,:) ,INTENT(IN) :: PXMU - REAL, DIMENSION(:,:,:) ,INTENT(IN) :: PDIV - ! - END SUBROUTINE IBM_AFFECTV - ! - END INTERFACE - ! -END MODULE MODI_IBM_AFFECTV -! -! ######################################################## -SUBROUTINE IBM_AFFECTV(PVAR,PVAR2,PVAR3,HVAR,KIBM_LAYER,HIBM_MODE_INTE3,& - HIBM_FORC_BOUNR,PRADIUS,PPOWERS,& - HIBM_MODE_INT1N,HIBM_TYPE_BOUNN,HIBM_MODE_BOUNN,HIBM_FORC_BOUNN,PIBM_FORC_BOUNN,& - HIBM_MODE_INT1T,HIBM_TYPE_BOUNT,HIBM_MODE_BOUNT,HIBM_FORC_BOUNT,PIBM_FORC_BOUNT,& - HIBM_MODE_INT1C,HIBM_TYPE_BOUNC,HIBM_MODE_BOUNC,HIBM_FORC_BOUNC,PIBM_FORC_BOUNC,PXMU,PDIV) - ! ######################################################## - ! - ! - !**** IBM_AFFECTV computes the variable PVAR on desired ghost points : - ! - the V type of the ghost/image - ! - the 3D interpolation mode (HIBM_MODE_INTE3) - ! - the 1D interpolation mode (HIBM_MODE_INTE1) - ! - the boundary condition (HIBM_TYPE_BOUND) - ! - the symmetry character (HIBM_MODE_BOUND) - ! - the forcing type (HIBM_FORC_BOUND) - ! - the forcing term (HIBM_FORC_BOUND) - ! Choice of forcing type is depending on - ! the normal, binormal, tangent vectors (N,C,T) - ! - ! - ! PURPOSE - ! ------- - !**** Ghosts (resp. Images) locations are stored in KIBM_STOR_GHOST (resp. KIBM_STOR_IMAGE). - ! Solutions are computed in regard of the symmetry character of the solution: - ! HIBM_MODE_BOUND = 'SYM' (Symmetrical) - ! HIBM_MODE_BOUND = 'ASY' (Anti-symmetrical) - ! The ghost value is depending on the variable value at the interface: - ! HIBM_TYPE_BOUND = "CST" (constant value) - ! HIBM_TYPE_BOUND = "LAW" (wall models) - ! HIBM_TYPE_BOUND = "LIN" (linear evolution, only IMAGE2 type) - ! HIBM_TYPE_BOUND = "LOG" (logarithmic evol, only IMAGE2 type) - ! Three 3D interpolations exists HIBM_MODE_INTE3 = "IDW" (Inverse Distance Weighting) - ! HIBM_MODE_INTE3 = "MDW" (Modified Distance Weighting) - ! HIBM_MODE_INTE3 = "LAG" (Trilinear Lagrange interp. ) - ! Three 1D interpolations exists HIBM_MODE_INTE1 = "CL0" (Lagrange Polynomials - 1 points - MIRROR) - ! HIBM_MODE_INTE1 = "CL1" (Lagrange Polynomials - 2 points - IMAGE1) - ! HIBM_MODE_INTE1 = "CL2" (Lagrange Polynomials - 3 points - IMAGE2) - ! METHOD - ! ------ - ! - loop on ghosts - ! - functions storage - ! - computations of the location of the corners cell containing MIRROR/IMAGE1/IMAGE2 - ! - 3D interpolation (IDW, MDW, CLI) to obtain the MIRROR/IMAGE1/IMAGE2 values - ! - computation of the value at the interface - ! - 1D interpolation (CLI1,CLI2,CLI3) to obtain the GHOSTS values - ! - Affectation - ! - ! EXTERNAL - ! -------- - ! SUBROUTINE ? - ! - ! IMPLICIT ARGUMENTS - ! ------------------ - ! MODD_? - ! - ! REFERENCE - ! --------- - ! - ! AUTHOR - ! ------ - ! Franck Auguste (CERFACS-AE) - ! - ! MODIFICATIONS - ! ------------- - ! Original 01/01/2019 - ! - !------------------------------------------------------------------------------ - ! - !**** 0. DECLARATIONS - ! --------------- - ! module - USE MODE_POS - USE MODE_ll - USE MODE_IO - USE MODD_ARGSLIST_ll, ONLY : LIST_ll - ! - ! declaration - USE MODD_IBM_PARAM_n - USE MODD_FIELD_n - USE MODD_PARAM_n, ONLY: CTURB - USE MODD_GRID_n, ONLY: XDXHAT, XDYHAT - USE MODD_VAR_ll, ONLY: IP - USE MODD_LBC_n - USE MODD_REF_n, ONLY: XRHODJ,XRHODREF - ! - ! interface - USE MODI_IBM_VALUECORN - USE MODI_IBM_LOCATCORN - USE MODI_IBM_3DINT - USE MODI_IBM_1DINT - USE MODI_IBM_0DINT - USE MODI_IBM_VALUEMAT1 - USE MODI_IBM_VALUEMAT2 - USE MODI_SHUMAN - USE MODD_DYN_n - USE MODD_FIELD_n - USE MODD_CST - USE MODD_CTURB - USE MODD_RADIATIONS_n - ! - IMPLICIT NONE - ! - !------------------------------------------------------------------------------ - ! - ! 0.1 declarations of arguments - ! - REAL, DIMENSION(:,:,:) ,INTENT(INOUT) :: PVAR - REAL, DIMENSION(:,:,:,:) ,INTENT(IN) :: PVAR2,PVAR3 - CHARACTER(LEN=1) ,INTENT(IN) :: HVAR - INTEGER ,INTENT(IN) :: KIBM_LAYER - REAL ,INTENT(IN) :: PRADIUS - REAL ,INTENT(IN) :: PPOWERS - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNR - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INTE3 - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INT1N - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_TYPE_BOUNN - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_BOUNN - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNN - REAL ,INTENT(IN) :: PIBM_FORC_BOUNN - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INT1T - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_TYPE_BOUNT - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_BOUNT - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNT - REAL ,INTENT(IN) :: PIBM_FORC_BOUNT - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INT1C - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_TYPE_BOUNC - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_BOUNC - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNC - REAL ,INTENT(IN) :: PIBM_FORC_BOUNC - REAL, DIMENSION(:,:,:) ,INTENT(IN) :: PXMU - REAL, DIMENSION(:,:,:) ,INTENT(IN) :: PDIV - ! - !------------------------------------------------------------------------------ - ! - ! 0.2 declaration of local variables - ! - INTEGER :: JI,JJ,JK,JL,JM,JMM,JN,JNN,JH,JLL ! loop index - INTEGER, DIMENSION(:) , ALLOCATABLE :: I_INDEX_CORN ! reference corner index - INTEGER :: I_GHOST_NUMB ! ghost number per layer - REAL , DIMENSION(:,:), ALLOCATABLE :: Z_LOCAT_CORN,Z_LOCAT_IMAG ! corners coordinates - REAL , DIMENSION(:) , ALLOCATABLE :: Z_TESTS_CORN ! interface distance dependence - REAL , DIMENSION(:) , ALLOCATABLE :: Z_VALUE_CORN ! value variables at corners - REAL , DIMENSION(:,:), ALLOCATABLE :: Z_VALUE_IMAG,Z_VALUE_TEMP,Z_VALUE_ZLKE ! value at mirror/image1/image2 - REAL , DIMENSION(:) , ALLOCATABLE :: Z_LOCAT_BOUN,Z_LOCAT_GHOS,Z_TEMP_ZLKE ! location of bound and ghost - REAL :: Z_DELTA_IMAG,ZIBM_VISC,ZIBM_DIVK - CHARACTER(LEN=3),DIMENSION(:), ALLOCATABLE :: Y_TYPE_BOUND,Y_FORC_BOUND,Y_MODE_BOUND,Y_MODE_INTE1 - REAL , DIMENSION(:) , ALLOCATABLE :: Z_FORC_BOUND,Z_VALUE_GHOS - REAL , DIMENSION(:,:), ALLOCATABLE :: Z_VALUE_MAT1,Z_VALUE_MAT2 - REAL :: ZIBM_HALO - ! - !------------------------------------------------------------------------------ - ! - ! 0.3 Allocation - ! - ALLOCATE(I_INDEX_CORN(3)) - ALLOCATE(Z_LOCAT_CORN(8,3)) - ALLOCATE(Z_VALUE_CORN(8)) - ALLOCATE(Z_TESTS_CORN(8)) - ALLOCATE(Z_LOCAT_IMAG(3,3)) - ALLOCATE(Z_VALUE_IMAG(4,3)) - ALLOCATE(Z_VALUE_TEMP(4,3)) - ALLOCATE(Z_LOCAT_BOUN(3)) - ALLOCATE(Z_LOCAT_GHOS(3)) - ALLOCATE(Z_VALUE_GHOS(3)) - ALLOCATE(Y_TYPE_BOUND(3),Y_FORC_BOUND(3)) - ALLOCATE(Y_MODE_BOUND(3),Y_MODE_INTE1(3)) - ALLOCATE(Z_FORC_BOUND(3)) - ALLOCATE(Z_VALUE_MAT1(3,3)) - ALLOCATE(Z_VALUE_MAT2(3,3)) - ! - !------------------------------------------------------------------------------ - ! - !**** 1. PRELIMINARIES - ! ---------------- - I_INDEX_CORN(:) = 0 - Z_LOCAT_CORN(:,:) = 0. - Z_VALUE_CORN(:) = 0. - Z_TESTS_CORN(:) = 0. - Z_LOCAT_IMAG(:,:) = 0. - Z_VALUE_IMAG(:,:) = 0. - Z_VALUE_TEMP(:,:) = 0. - Z_LOCAT_GHOS(:) = 0. - Z_LOCAT_BOUN(:) = 0. - Z_VALUE_GHOS(:) = 0. - Z_VALUE_MAT1(:,:) = 0. - Z_VALUE_MAT2(:,:) = 0. - IF (HVAR=='U') JH = 1 - IF (HVAR=='V') JH = 2 - IF (HVAR=='W') JH = 3 - Y_TYPE_BOUND(1) = HIBM_TYPE_BOUNN - Y_TYPE_BOUND(2) = HIBM_TYPE_BOUNT - Y_TYPE_BOUND(3) = HIBM_TYPE_BOUNC - Y_FORC_BOUND(1) = HIBM_FORC_BOUNN - Y_FORC_BOUND(2) = HIBM_FORC_BOUNT - Y_FORC_BOUND(3) = HIBM_FORC_BOUNC - Y_MODE_BOUND(1) = HIBM_MODE_BOUNN - Y_MODE_BOUND(2) = HIBM_MODE_BOUNT - Y_MODE_BOUND(3) = HIBM_MODE_BOUNC - Y_MODE_INTE1(1) = HIBM_MODE_INT1N - Y_MODE_INTE1(2) = HIBM_MODE_INT1T - Y_MODE_INTE1(3) = HIBM_MODE_INT1C - Z_FORC_BOUND(1) = PIBM_FORC_BOUNN - Z_FORC_BOUND(2) = PIBM_FORC_BOUNT - Z_FORC_BOUND(3) = PIBM_FORC_BOUNC - ! - ALLOCATE(Z_VALUE_ZLKE(4,3)) - ALLOCATE(Z_TEMP_ZLKE(3)) - Z_VALUE_ZLKE(:,:) = 0. - Z_TEMP_ZLKE(:) = 0. - ! - DO JMM=1,KIBM_LAYER - ! - ! searching number of ghosts - JM = size(NIBM_GHOST_V,1) - JI = 0 - JJ = 0 - JK = 0 - DO WHILE ((JI==0.and.JJ==0.and.JK==0).and.JM>0) - JI = NIBM_GHOST_V(JM,JMM,JH,1) - JJ = NIBM_GHOST_V(JM,JMM,JH,2) - JK = NIBM_GHOST_V(JM,JMM,JH,3) - IF (JI==0.and.JJ==0.and.JK==0) JM = JM - 1 - ENDDO - I_GHOST_NUMB = JM - ! - ! Loop on each P Ghosts - IF (I_GHOST_NUMB<=0) GO TO 666 - DO JM = 1,I_GHOST_NUMB - ! - ! ghost index/ls - JI = NIBM_GHOST_V(JM,JMM,JH,1) - JJ = NIBM_GHOST_V(JM,JMM,JH,2) - JK = NIBM_GHOST_V(JM,JMM,JH,3) - IF (JI==0.or.JJ==0.or.JK==0) GO TO 777 - Z_LOCAT_GHOS(:) = XIBM_GHOST_V(JM,JMM,JH,:) - Z_LOCAT_BOUN(:) = 2.0*XIBM_IMAGE_V(JM,JMM,JH,1,:)-1.0*XIBM_IMAGE_V(JM,JMM,JH,2,:) - ZIBM_HALO = 1. - ! - DO JN = 1,3 - ! - Z_LOCAT_IMAG(JN,:)= XIBM_IMAGE_V(JM,JMM,JH ,JN,:) - Z_DELTA_IMAG = ( XDXHAT(JI) * XDYHAT(JJ) ) ** 0.5 - ! - DO JLL=1,3 - I_INDEX_CORN(:) = NIBM_IMAGE_V(JM,JMM,JH,JLL,JN,:) - IF (I_INDEX_CORN(1)==0.AND.JN==2) ZIBM_HALO=0. - IF (I_INDEX_CORN(2)==0.AND.JN==2) ZIBM_HALO=0. - Z_LOCAT_CORN(:,:) = IBM_LOCATCORN(I_INDEX_CORN,JLL+1) - Z_TESTS_CORN(:) = XIBM_TESTI_V(JM,JMM,JH,JLL,JN,:) - Z_VALUE_CORN(:) = IBM_VALUECORN(PVAR2(:,:,:,JLL),I_INDEX_CORN) - Z_VALUE_IMAG(JN,JLL) = IBM_3DINT(JN,Z_VALUE_IMAG(:,JLL),Z_LOCAT_BOUN,Z_TESTS_CORN,& - Z_LOCAT_CORN,Z_VALUE_CORN,Z_LOCAT_IMAG(JN,:),& - HIBM_MODE_INTE3,PRADIUS,PPOWERS) - ENDDO - ! - ENDDO - ZIBM_VISC = PXMU(JI,JJ,JK) - ZIBM_DIVK = PDIV(JI,JJ,JK) - ! - ! projection step - Z_VALUE_MAT1(:,:) = IBM_VALUEMAT1(Z_LOCAT_IMAG(1,:),Z_LOCAT_BOUN,Z_VALUE_IMAG,HIBM_FORC_BOUNR) - DO JN=1,3 - Z_VALUE_TEMP(JN,:)= Z_VALUE_MAT1(:,1)*Z_VALUE_IMAG(JN,1) +& - Z_VALUE_MAT1(:,2)*Z_VALUE_IMAG(JN,2) +& - Z_VALUE_MAT1(:,3)*Z_VALUE_IMAG(JN,3) - ENDDO - ! - ! === BOUND computation === - ! - JN=4 - DO JLL=1,3 - Z_VALUE_TEMP(JN,JLL) = IBM_0DINT(Z_DELTA_IMAG,Z_VALUE_TEMP(:,JLL),Y_TYPE_BOUND(JLL),Y_FORC_BOUND(JLL), & - Z_FORC_BOUND(JLL),ZIBM_VISC,ZIBM_DIVK) - ENDDO - ! - ! inverse projection step - Z_VALUE_MAT2(:,:) = IBM_VALUEMAT2(Z_VALUE_MAT1) - Z_VALUE_IMAG(JN,:)= Z_VALUE_MAT2(:,1)*Z_VALUE_TEMP(JN,1) +& - Z_VALUE_MAT2(:,2)*Z_VALUE_TEMP(JN,2) +& - Z_VALUE_MAT2(:,3)*Z_VALUE_TEMP(JN,3) - ! - ! === GHOST computation === - ! - ! functions storage - Z_LOCAT_IMAG(1,3) = ((XIBM_GHOST_V(JM,JMM,JH,1)-Z_LOCAT_BOUN(1))**2.+& - (XIBM_GHOST_V(JM,JMM,JH,2)-Z_LOCAT_BOUN(2))**2.+& - (XIBM_GHOST_V(JM,JMM,JH,3)-Z_LOCAT_BOUN(3))**2.)**0.5 - IF (Z_LOCAT_IMAG(1,3)>Z_DELTA_IMAG.AND.ZIBM_HALO>0.5) THEN - Z_LOCAT_IMAG(1,1) = ((XIBM_IMAGE_V(JM,JMM,JH,1,1)-Z_LOCAT_BOUN(1))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,1,2)-Z_LOCAT_BOUN(2))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,1,3)-Z_LOCAT_BOUN(3))**2.)**0.5 - Z_LOCAT_IMAG(1,2) = ((XIBM_IMAGE_V(JM,JMM,JH,2,1)-Z_LOCAT_BOUN(1))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,2,2)-Z_LOCAT_BOUN(2))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,2,3)-Z_LOCAT_BOUN(3))**2.)**0.5 - ELSE - Z_LOCAT_IMAG(1,1) = ((XIBM_IMAGE_V(JM,JMM,JH,3,1)-Z_LOCAT_BOUN(1))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,3,2)-Z_LOCAT_BOUN(2))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,3,3)-Z_LOCAT_BOUN(3))**2.)**0.5 - Z_LOCAT_IMAG(1,2) = ((XIBM_IMAGE_V(JM,JMM,JH,1,1)-Z_LOCAT_BOUN(1))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,1,2)-Z_LOCAT_BOUN(2))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,1,3)-Z_LOCAT_BOUN(3))**2.)**0.5 - Z_VALUE_TEMP(2,:) = Z_VALUE_TEMP(1,:) - Z_VALUE_TEMP(1,:) = Z_VALUE_TEMP(3,:) - ENDIF - ! - DO JLL=1,3 - Z_VALUE_GHOS(JLL) = IBM_1DINT(Z_LOCAT_IMAG(1,:),Z_VALUE_TEMP(:,JLL),Y_MODE_INTE1(JLL)) - IF (Y_MODE_BOUND(JLL)=='SYM') Z_VALUE_GHOS(JLL) = +Z_VALUE_GHOS(JLL) - IF (Y_MODE_BOUND(JLL)=='ASY') Z_VALUE_GHOS(JLL) = -Z_VALUE_GHOS(JLL) + 2.*Z_VALUE_TEMP(4,JLL) - IF (Y_MODE_BOUND(JLL)=='CST') Z_VALUE_GHOS(JLL) = Z_VALUE_TEMP(4,JLL) - ENDDO - ! - PVAR(JI,JJ,JK) = Z_VALUE_MAT2(JH,1)*Z_VALUE_GHOS(1) +& - Z_VALUE_MAT2(JH,2)*Z_VALUE_GHOS(2) +& - Z_VALUE_MAT2(JH,3)*Z_VALUE_GHOS(3) - ! - IF ((JH==3).AND.(JK==2)) THEN - PVAR(JI,JJ,JK) = 0. - ENDIF - ! -777 CONTINUE - ! - ENDDO - ENDDO - ! -666 CONTINUE - ! - !**** X. DEALLOCATIONS/CLOSES - ! ----------------------- - ! - DEALLOCATE(I_INDEX_CORN) - DEALLOCATE(Z_LOCAT_CORN) - DEALLOCATE(Z_VALUE_CORN) - DEALLOCATE(Z_LOCAT_IMAG) - DEALLOCATE(Z_VALUE_IMAG) - DEALLOCATE(Z_VALUE_TEMP) - DEALLOCATE(Z_LOCAT_BOUN) - DEALLOCATE(Z_LOCAT_GHOS) - DEALLOCATE(Z_VALUE_GHOS) - DEALLOCATE(Z_TESTS_CORN) - DEALLOCATE(Y_TYPE_BOUND,Y_FORC_BOUND) - DEALLOCATE(Y_MODE_BOUND,Y_MODE_INTE1) - DEALLOCATE(Z_FORC_BOUND) - DEALLOCATE(Z_VALUE_MAT1) - DEALLOCATE(Z_VALUE_MAT2) - DEALLOCATE(Z_VALUE_ZLKE) - DEALLOCATE(Z_TEMP_ZLKE) - ! - RETURN - ! -END SUBROUTINE IBM_AFFECTV diff --git a/src/PHYEX/ext/ibm_forcing.f90 b/src/PHYEX/ext/ibm_forcing.f90 deleted file mode 100644 index aebf45609..000000000 --- a/src/PHYEX/ext/ibm_forcing.f90 +++ /dev/null @@ -1,314 +0,0 @@ -!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! -! ####################### -MODULE MODI_IBM_FORCING - ! ####################### - ! - INTERFACE - ! - SUBROUTINE IBM_FORCING(PRUS,PRVS,PRWS,PTHS,PRRS,PSVS,PTKS) - ! - REAL, DIMENSION(:,:,:) ,INTENT(INOUT) :: PRUS,PRVS,PRWS - REAL, DIMENSION(:,:,:) ,INTENT(INOUT) :: PTHS - REAL, DIMENSION(:,:,:,:),INTENT(INOUT), OPTIONAL :: PRRS - REAL, DIMENSION(:,:,:,:),INTENT(INOUT), OPTIONAL :: PSVS - REAL, DIMENSION(:,:,:) ,INTENT(INOUT), OPTIONAL :: PTKS - ! - END SUBROUTINE IBM_FORCING - ! - END INTERFACE - ! -END MODULE MODI_IBM_FORCING -! -! ########################################################## -SUBROUTINE IBM_FORCING(PRUS,PRVS,PRWS,PTHS,PRRS,PSVS,PTKS) - ! ########################################################## - ! - !!**** *IBM_FORCING* - routine to force all desired fields - !! - !! PURPOSE - !! ------- - ! The purpose of this routine is to compute variables in the virtual - ! embedded solid region in regard of variables computed in the real - ! fluid region - ! - !! METHOD - !! ------ - !! - !! EXTERNAL - !! -------- - !! NONE - !! - !! IMPLICIT ARGUMENTS - !! ------------------ - !! - !! REFERENCE - !! --------- - !! - !! AUTHOR - !! ------ - !! Franck Auguste * CERFACS(AE) * - !! - !! MODIFICATIONS - !! ------------- - !! Original 01/01/2019 - !! - !----------------------------------------------------------------------------- - ! - !**** 0. DECLARATIONS - ! --------------- - ! - ! module - USE MODE_POS - USE MODE_ll - USE MODE_IO - USE MODD_ARGSLIST_ll, ONLY : LIST_ll - ! - ! declaration - USE MODD_CST - USE MODD_FIELD_n - USE MODD_REF - USE MODD_REF_n, ONLY: XRHODJ,XRHODREF,XTHVREF,XEXNREF,XRVREF - USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT - USE MODD_IBM_PARAM_n - USE MODD_LBC_n - USE MODD_CONF - USE MODD_CONF_n - USE MODD_NSV - USE MODD_TURB_n, ONLY: XTKEMIN - USE MODD_PARAM_n - USE MODD_DYN_n, ONLY: XTSTEP - ! - ! interface - USE MODI_IBM_AFFECTV - USE MODI_IBM_AFFECTP - USE MODI_SHUMAN - ! - IMPLICIT NONE - ! - !----------------------------------------------------------------------------- - ! - ! 0.1 declarations of arguments - ! - REAL, DIMENSION(:,:,:) ,INTENT(INOUT) :: PRUS,PRVS,PRWS - REAL, DIMENSION(:,:,:) ,INTENT(INOUT) :: PTHS - REAL, DIMENSION(:,:,:,:),INTENT(INOUT), OPTIONAL :: PRRS - REAL, DIMENSION(:,:,:,:),INTENT(INOUT), OPTIONAL :: PSVS - REAL, DIMENSION(:,:,:) ,INTENT(INOUT), OPTIONAL :: PTKS - ! - !----------------------------------------------------------------------------- - ! - ! 0.2 declaration of local variables - REAL, DIMENSION(:,:,:) , ALLOCATABLE :: ZTMP,ZXMU,ZDIV,ZTKE - REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTMU,ZTRY - INTEGER :: IIU,IJU,IKU,IKB,IKE - INTEGER :: JRR,JSV - TYPE(LIST_ll), POINTER :: TZFIELDS_ll - INTEGER :: IINFO_ll - ! - !----------------------------------------------------------------------------- - ! - !**** 0. ALLOCATIONS - ! -------------- - ! - IIU = SIZE(PRUS,1) - IJU = SIZE(PRVS,2) - IKU = SIZE(PRWS,3) - ! - ALLOCATE(ZTMU(IIU,IJU,IKU,3),ZTMP(IIU,IJU,IKU),ZTRY(IIU,IJU,IKU,3), & - ZXMU(IIU,IJU,IKU),ZDIV(IIU,IJU,IKU),ZTKE(IIU,IJU,IKU)) - ! - ZTMU=0. - ZXMU=0. - ZDIV=0. - ZTMP=0. - ZTRY=0. - ! - IKB = 1 + JPVEXT - IKE = IKU - JPVEXT - ! - !----------------------------------------------------------------------------- - ! - !**** 1. PRELIMINARIES - ! ---------------- - IF (NSV>=1) THEN - ! - DO JSV=1,NSV - WHERE (XIBM_LS(:,:,:,1).GT.XIBM_EPSI) PSVS(:,:,:,JSV) = XIBM_EPSI**1.5 - ENDDO - ! - ENDIF - ! - WHERE (XIBM_LS(:,:,:,1).GT.XIBM_EPSI) PTHS(:,:,:) = XTHVREF(:,:,:) - ! - IF (NRR>=1) THEN - WHERE (XIBM_LS(:,:,:,1).GT.XIBM_EPSI) - PRRS(:,:,:,1) = XRVREF(:,:,:) - PTHS(:,:,:) = XTHVREF(:,:,:)/(1.+XRD/XRV*XRVREF(:,:,:)) - ENDWHERE - ENDIF - IF (NRR>=2) THEN - DO JRR=2,NRR - WHERE (XIBM_LS(:,:,:,1).GT.XIBM_EPSI) PRRS(:,:,:,JRR) = XIBM_EPSI - ENDDO - ENDIF - ! - WHERE (XIBM_LS(:,:,:,2).GT.XIBM_EPSI) PRUS(:,:,:) = XIBM_EPSI - WHERE (XIBM_LS(:,:,:,3).GT.XIBM_EPSI) PRVS(:,:,:) = XIBM_EPSI - WHERE (XIBM_LS(:,:,:,4).GT.XIBM_EPSI) PRWS(:,:,:) = XIBM_EPSI - IF (CTURB/='NONE') WHERE (XIBM_LS(:,:,:,1).GT.XIBM_EPSI) PTKS(:,:,:) = XTKEMIN - ! - !**** 2. EXECUTIONS - ! ------------- - ! - ! ====================== - ! === SCALAR FORCING === - ! ====================== - ! - IF (CTURB/='NONE') THEN - ZTMP(:,:,:) = PTKS(:,:,:) - ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB) - ZTMP(:,:,IKE+1)=ZTMP(:,:,IKE) - ZXMU(:,:,:) = XIBM_XMUT(:,:,:) - ZDIV(:,:,:) = XIBM_CURV(:,:,:) - CALL IBM_AFFECTP(ZTMP,NIBM_LAYER_E,XIBM_RADIUS_E,XIBM_POWERS_E,& - CIBM_MODE_INTE1_E,CIBM_MODE_INTE3_E,& - CIBM_TYPE_BOUND_E,CIBM_MODE_BOUND_E,& - CIBM_FORC_BOUND_E,XIBM_FORC_BOUND_E,ZXMU,ZDIV) - ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB) - ZTMP(:,:,IKE+1)=XTKEMIN - PTKS(:,:,:)=MAX(XTKEMIN,ZTMP(:,:,:)) - ENDIF - ! - ZTMP(:,:,:) = PTHS(:,:,:) - ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB) - ZTMP(:,:,IKE+1)=ZTMP(:,:,IKE) - CALL IBM_AFFECTP(ZTMP,NIBM_LAYER_T,XIBM_RADIUS_T,XIBM_POWERS_T,& - CIBM_MODE_INTE1_T,CIBM_MODE_INTE3_T,& - CIBM_TYPE_BOUND_T,CIBM_MODE_BOUND_T,& - CIBM_FORC_BOUND_T,XIBM_FORC_BOUND_T,ZXMU,ZDIV) - ZTMP(:,:,:) = ZTMP(:,:,:) - ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB) - ZTMP(:,:,IKE+1)=ZTMP(:,:,IKE) - PTHS(:,:,:) = MAX(ZTMP(:,:,:),250.) - ! - IF (NRR>=1) THEN - DO JRR=1,NRR - ZTMP(:,:,:) = PRRS(:,:,:,JRR) - ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB) - ZTMP(:,:,IKE+1)=ZTMP(:,:,IKE) - CALL IBM_AFFECTP(ZTMP,NIBM_LAYER_R,XIBM_RADIUS_R,XIBM_POWERS_R,& - CIBM_MODE_INTE1_R,CIBM_MODE_INTE3_R,& - CIBM_TYPE_BOUND_R,CIBM_MODE_BOUND_R,& - CIBM_FORC_BOUND_R,XIBM_FORC_BOUND_R,ZXMU,ZDIV) - ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB) - ZTMP(:,:,IKE+1)=ZTMP(:,:,IKE) - PRRS(:,:,:,JRR) = ZTMP(:,:,:) - ENDDO - ENDIF - ! - IF (NSV>=1) THEN - DO JSV=1,NSV - ZTMP(:,:,:) = PSVS(:,:,:,JSV) - ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB) - ZTMP(:,:,IKE+1)=ZTMP(:,:,IKE) - CALL IBM_AFFECTP(ZTMP,NIBM_LAYER_S,XIBM_RADIUS_S,XIBM_POWERS_S,& - CIBM_MODE_INTE1_S,CIBM_MODE_INTE3_S,& - CIBM_TYPE_BOUND_S,CIBM_MODE_BOUND_S,& - CIBM_FORC_BOUND_S,XIBM_FORC_BOUND_S,ZXMU,ZDIV) - ZTMP(:,:,:) = MAX(XIBM_EPSI**1.5,ZTMP(:,:,:)) - ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB) - ZTMP(:,:,IKE+1)=ZTMP(:,:,IKE) - PSVS(:,:,:,JSV) = ZTMP(:,:,:) - ENDDO - ENDIF - ! - !======================= - ! === VECTOR FORCING === - ! ====================== - ! - PRUS(:,:,IKB-1)=PRUS(:,:,IKB) - PRUS(:,:,IKE+1)=PRUS(:,:,IKE) - PRVS(:,:,IKB-1)=PRVS(:,:,IKB) - PRVS(:,:,IKE+1)=PRVS(:,:,IKE) - PRWS(:,:,IKB-1)=0. - PRWS(:,:,IKE+1)=0. - ! - ZTMU(:,:,:,1) = PRUS(:,:,:) - ZTMU(:,:,:,2) = PRVS(:,:,:) - ZTMU(:,:,:,3) = PRWS(:,:,:) - ! - ZTMP(:,:,:) = PRUS(:,:,:) - ZXMU(:,:,:) = MXM(XIBM_XMUT(:,:,:)) - ZDIV(:,:,:) = MXM(XIBM_CURV(:,:,:)) - CALL IBM_AFFECTV(ZTMP,ZTMU,ZTRY,'U',NIBM_LAYER_V,CIBM_MODE_INTE3_V,& - CIBM_FORC_BOUNR_V,XIBM_RADIUS_V,XIBM_POWERS_V,& - CIBM_MODE_INTE1NV,CIBM_TYPE_BOUNN_V,CIBM_MODE_BOUNN_V,CIBM_FORC_BOUNN_V ,XIBM_FORC_BOUNN_V,& - CIBM_MODE_INTE1TV,CIBM_TYPE_BOUNT_V,CIBM_MODE_BOUNT_V,CIBM_FORC_BOUNT_V ,XIBM_FORC_BOUNT_V,& - CIBM_MODE_INTE1CV,CIBM_TYPE_BOUNC_V,CIBM_MODE_BOUNC_V,CIBM_FORC_BOUNC_V ,XIBM_FORC_BOUNC_V,ZXMU,ZDIV) - PRUS(:,:,:) = ZTMP(:,:,:) - ZTMP(:,:,:) = PRVS(:,:,:) - ZXMU(:,:,:) = MYM(XIBM_XMUT(:,:,:)) - ZDIV(:,:,:) = MYM(XIBM_CURV(:,:,:)) - CALL IBM_AFFECTV(ZTMP,ZTMU,ZTRY,'V',NIBM_LAYER_V,CIBM_MODE_INTE3_V,& - CIBM_FORC_BOUNR_V,XIBM_RADIUS_V,XIBM_POWERS_V,& - CIBM_MODE_INTE1NV,CIBM_TYPE_BOUNN_V,CIBM_MODE_BOUNN_V,CIBM_FORC_BOUNN_V ,XIBM_FORC_BOUNN_V,& - CIBM_MODE_INTE1TV,CIBM_TYPE_BOUNT_V,CIBM_MODE_BOUNT_V,CIBM_FORC_BOUNT_V ,XIBM_FORC_BOUNT_V,& - CIBM_MODE_INTE1CV,CIBM_TYPE_BOUNC_V,CIBM_MODE_BOUNC_V,CIBM_FORC_BOUNC_V ,XIBM_FORC_BOUNC_V,ZXMU,ZDIV) - PRVS(:,:,:) = ZTMP(:,:,:) - ZTMP(:,:,:) = PRWS(:,:,:) - ZXMU(:,:,:) = MZM(XIBM_XMUT(:,:,:)) - ZDIV(:,:,:) = MZM(XIBM_CURV(:,:,:)) - CALL IBM_AFFECTV(ZTMP,ZTMU,ZTRY,'W',NIBM_LAYER_V,CIBM_MODE_INTE3_V,& - CIBM_FORC_BOUNR_V,XIBM_RADIUS_V,XIBM_POWERS_V,& - CIBM_MODE_INTE1NV,CIBM_TYPE_BOUNN_V,CIBM_MODE_BOUNN_V,CIBM_FORC_BOUNN_V ,XIBM_FORC_BOUNN_V,& - CIBM_MODE_INTE1TV,CIBM_TYPE_BOUNT_V,CIBM_MODE_BOUNT_V,CIBM_FORC_BOUNT_V ,XIBM_FORC_BOUNT_V,& - CIBM_MODE_INTE1CV,CIBM_TYPE_BOUNC_V,CIBM_MODE_BOUNC_V,CIBM_FORC_BOUNC_V ,XIBM_FORC_BOUNC_V,ZXMU,ZDIV) - PRWS(:,:,:) = ZTMP(:,:,:) - PRUS(:,:,IKB-1)=PRUS(:,:,IKB) - PRUS(:,:,IKE+1)=PRUS(:,:,IKE) - PRVS(:,:,IKB-1)=PRVS(:,:,IKB) - PRVS(:,:,IKE+1)=PRVS(:,:,IKE) - PRWS(:,:,IKB-1)=0. - PRWS(:,:,IKB) =0. - PRWS(:,:,IKE+1)=0. - ! - !**** 3. COMMUNICATIONS - ! ----------------- - ! - IF (.NOT. LIBM_TROUBLE) THEN - ! - NULLIFY(TZFIELDS_ll) - CALL ADD3DFIELD_ll(TZFIELDS_ll,PTHS(:,:,:),'IBM_FORCING::PTHS') - IF (CTURB/='NONE') CALL ADD3DFIELD_ll(TZFIELDS_ll,PTKS(:,:,:),'IBM_FORCING::PTKS') - CALL ADD3DFIELD_ll(TZFIELDS_ll,PRUS(:,:,:),'IBM_FORCING::PRUS') - CALL ADD3DFIELD_ll(TZFIELDS_ll,PRVS(:,:,:),'IBM_FORCING::PRVS') - CALL ADD3DFIELD_ll(TZFIELDS_ll,PRWS(:,:,:),'IBM_FORCING::PRWS') - IF (NRR>=1) THEN - DO JRR=1,NRR - CALL ADD3DFIELD_ll(TZFIELDS_ll,PRRS(:,:,:,JRR),'IBM_FORCING::PRRS') - ENDDO - ENDIF - IF (NSV>=1) THEN - DO JSV=1,NSV - CALL ADD3DFIELD_ll(TZFIELDS_ll,PSVS(:,:,:,JSV),'IBM_FORCING::PSVS') - ENDDO - ENDIF - ! - CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS_ll) - ! - ENDIF - ! - !**** 4. DEALLOCATIONS - ! ---------------- - ! - DEALLOCATE(ZTMP,ZTMU,ZTRY,ZXMU,ZDIV,ZTKE) - ! - RETURN - ! -END SUBROUTINE IBM_FORCING diff --git a/src/PHYEX/ext/ibm_forcing_tr.f90 b/src/PHYEX/ext/ibm_forcing_tr.f90 deleted file mode 100644 index c14ac2aa6..000000000 --- a/src/PHYEX/ext/ibm_forcing_tr.f90 +++ /dev/null @@ -1,410 +0,0 @@ -!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! -! ########################## -MODULE MODI_IBM_FORCING_TR - ! ########################## - ! - INTERFACE - ! - SUBROUTINE IBM_FORCING_TR(PRUS,PRVS,PRWS,PTHS,PRRS,PSVS,PTKS) - ! - REAL, DIMENSION(:,:,:) ,INTENT(INOUT) :: PRUS,PRVS,PRWS - REAL, DIMENSION(:,:,:) ,INTENT(INOUT) :: PTHS - REAL, DIMENSION(:,:,:,:) ,INTENT(INOUT),OPTIONAL :: PRRS - REAL, DIMENSION(:,:,:,:) ,INTENT(INOUT),OPTIONAL :: PSVS - REAL, DIMENSION(:,:,:) ,INTENT(INOUT),OPTIONAL :: PTKS - ! - END SUBROUTINE IBM_FORCING_TR - ! - END INTERFACE - ! -END MODULE MODI_IBM_FORCING_TR -! -! -! ############################################################# -SUBROUTINE IBM_FORCING_TR(PRUS,PRVS,PRWS,PTHS,PRRS,PSVS,PTKS) - ! ############################################################# - ! - !!**** *IBM_FORCING_TR* - routine to force all desired fields - !! - !! PURPOSE - !! ------- - ! The purpose of this routine is to compute variables in the virtual - ! embedded solid region in regard of variables computed in the real - ! fluid region - ! - !! METHOD - !! ------ - !! - !! EXTERNAL - !! -------- - !! NONE - !! - !! IMPLICIT ARGUMENTS - !! ------------------ - !! - !! REFERENCE - !! --------- - !! - !! AUTHOR - !! ------ - !! Franck Auguste * CERFACS(AE) * - !! - !! MODIFICATIONS - !! ------------- - !! Original 01/01/2019 - !! - !------------------------------------------------------------------------------ - ! - !**** 0. DECLARATIONS - ! --------------- - ! - ! module - USE MODE_POS - USE MODE_ll - USE MODE_IO - USE MODD_ARGSLIST_ll, ONLY: LIST_ll - ! - ! declaration - USE MODD_CST, ONLY: XRD,XRV - USE MODD_REF_n, ONLY: XRHODJ,XRHODREF,XTHVREF,XRVREF - USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT - USE MODD_IBM_PARAM_n - USE MODD_LBC_n - USE MODD_CONF - USE MODD_CONF_n - USE MODD_NSV - USE MODD_TURB_n, ONLY: XTKEMIN - USE MODD_PARAM_n - ! - ! interface - ! - IMPLICIT NONE - ! - !----------------------------------------------------------------------------- - ! - ! 0.1 declarations of arguments - ! - REAL, DIMENSION(:,:,:) ,INTENT(INOUT) :: PRUS,PRVS,PRWS - REAL, DIMENSION(:,:,:) ,INTENT(INOUT) :: PTHS - REAL, DIMENSION(:,:,:,:),INTENT(INOUT),OPTIONAL :: PRRS - REAL, DIMENSION(:,:,:,:),INTENT(INOUT),OPTIONAL :: PSVS - REAL, DIMENSION(:,:,:) ,INTENT(INOUT),OPTIONAL :: PTKS - ! - !----------------------------------------------------------------------------- - ! - ! 0.2 declaration of local variables - INTEGER :: JI,JJ,JK,JI2,JJ2,JK2,IIU,IJU,IKU,JL - INTEGER :: JIM1,JJM1,JKM1,JIP1,JJP1,JKP1 - INTEGER :: IIE,IIB,IJE,IJB,IKB,IKE - REAL :: ZSUM1,ZSUM2,ZSUM4 - REAL, DIMENSION(:), ALLOCATABLE :: ZSUM3,ZSUM5 - TYPE(LIST_ll), POINTER :: TZFIELDS_ll - INTEGER :: IINFO_ll - ! - !----------------------------------------------------------------------------- - ! - !**** 0. ALLOCATIONS - ! -------------- - CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) - IIU = SIZE(PRUS,1) - IJU = SIZE(PRUS,2) - IKU = SIZE(PRUS,3) - IKB = 1 + JPVEXT - IKE = SIZE(PRUS,3) - JPVEXT - ! - !----------------------------------------------------------------------------- - ! - ! Problems in GCT ? => imposition of the adjacent value - DO JI=IIB,IIE - DO JJ=IJB,IJE - DO JK=IKB,IKE - ! - IF (XIBM_SUTR(JI,JJ,JK,1).LT.0.5) THEN - ! - JIM1 = JI-1 - JJM1 = JJ-1 - JKM1 = JK-1 - JIP1 = JI+1 - JJP1 = JJ+1 - JKP1 = JK+1 - ZSUM1 = 0. - ZSUM2 = 0. - IF (NSV>=1) ALLOCATE(ZSUM3(NSV)) - ZSUM3 = 0. - ZSUM4 = 0. - IF (NRR>=1) ALLOCATE(ZSUM5(NRR)) - ZSUM5 = 0. - ! - DO JI2=JIM1,JIP1 - DO JJ2=JJM1,JJP1 - DO JK2=JKM1,JKP1 - ! - ZSUM1 = ZSUM1 + (XIBM_SUTR(JI2,JJ2,JK2,1)) - ZSUM2 = ZSUM2 + (XIBM_SUTR(JI2,JJ2,JK2,1))*PTHS(JI2,JJ2,JK2) - IF (NRR>=1) THEN - DO JL = 1,NRR - ZSUM5(JL) = ZSUM5(JL) + (XIBM_SUTR(JI2,JJ2,JK2,1))*PRRS(JI2,JJ2,JK2,JL) - ENDDO - ENDIF - IF (NSV>=1) THEN - DO JL = 1,NSV - ZSUM3(JL) = ZSUM3(JL) + (XIBM_SUTR(JI2,JJ2,JK2,1))*PSVS(JI2,JJ2,JK2,JL) - ENDDO - ENDIF - IF (CTURB/='NONE') ZSUM4 = ZSUM4 + (XIBM_SUTR(JI2,JJ2,JK2,1))*PTKS(JI2,JJ2,JK2) - ! - ENDDO - ENDDO - ENDDO - ! - PTHS(JI,JJ,JK) = XTHVREF(JI,JJ,JK) - IF (NRR>=1) PTHS(JI,JJ,JK) = XTHVREF(JI,JJ,JK)/(1.+XRD/XRV*XRVREF(JI,JJ,JK)) - IF (ZSUM1.GT.XIBM_EPSI) PTHS(JI,JJ,JK) = ZSUM2/ZSUM1 - IF (NRR>=1) THEN - PRRS(JI,JJ,JK,1) = XRVREF(JI,JJ,JK) - IF (ZSUM1.GT.XIBM_EPSI) PRRS(JI,JJ,JK,1) = ZSUM5(1)/ZSUM1 - IF (NRR>=2) THEN - DO JL = 2,NRR - PRRS(JI,JJ,JK,JL) = 0. - IF (ZSUM1.GT.XIBM_EPSI) PRRS(JI,JJ,JK,JL) = ZSUM5(JL)/ZSUM1 - ENDDO - ENDIF - ENDIF - ! - IF (NSV>=1) THEN - DO JL = 1,NSV - PSVS(JI,JJ,JK,JL) = 0. - IF (ZSUM1.GT.XIBM_EPSI) PSVS(JI,JJ,JK,JL) = ZSUM3(JL)/ZSUM1 - ENDDO - ENDIF - ! - IF (CTURB/='NONE') PTKS(JI,JJ,JK) = XTKEMIN - IF (ZSUM1.GT.XIBM_EPSI.AND.(CTURB/='NONE')) PTKS(JI,JJ,JK) = ZSUM4/ZSUM1 - IF (NSV>=1) DEALLOCATE(ZSUM3) - IF (NRR>=1) DEALLOCATE(ZSUM5) - ! - ENDIF - ! - IF (XIBM_SUTR(JI,JJ,JK,2).LT.0.5) THEN - ! - JIM1 = JI-1 - JJM1 = JJ-1 - JKM1 = JK-1 - JIP1 = JI+1 - JJP1 = JJ+1 - JKP1 = JK+1 - ZSUM1 = 0. - ZSUM2 = 0. - ! - DO JI2=JIM1,JIP1 - DO JJ2=JJM1,JJP1 - DO JK2=JKM1,JKP1 - ZSUM1 = ZSUM1 + (XIBM_SUTR(JI2,JJ2,JK2,2)) - ZSUM2 = ZSUM2 + (XIBM_SUTR(JI2,JJ2,JK2,2))*PRUS(JI2,JJ2,JK2) - ENDDO - ENDDO - ENDDO - ! - PRUS(JI,JJ,JK) = 0. - IF (ZSUM1.GT.XIBM_EPSI) PRUS(JI,JJ,JK) = ZSUM2/ZSUM1 - ! - ENDIF - ! - IF (XIBM_SUTR(JI,JJ,JK,3).LT.0.5) THEN - ! - JIM1 = JI-1 - JJM1 = JJ-1 - JKM1 = JK-1 - JIP1 = JI+1 - JJP1 = JJ+1 - JKP1 = JK+1 - ZSUM1 = 0. - ZSUM2 = 0. - ! - DO JI2=JIM1,JIP1 - DO JJ2=JJM1,JJP1 - DO JK2=JKM1,JKP1 - ZSUM1 = ZSUM1 + (XIBM_SUTR(JI2,JJ2,JK2,3)) - ZSUM2 = ZSUM2 + (XIBM_SUTR(JI2,JJ2,JK2,3))*PRVS(JI2,JJ2,JK2) - ENDDO - ENDDO - ENDDO - ! - PRVS(JI,JJ,JK) = 0. - IF (ZSUM1.GT.XIBM_EPSI) PRVS(JI,JJ,JK) = ZSUM2/ZSUM1 - ! - ENDIF - ! - IF (XIBM_SUTR(JI,JJ,JK,4).LT.0.5) THEN - ! - JIM1 = JI-1 - JJM1 = JJ-1 - JKM1 = JK-1 - JIP1 = JI+1 - JJP1 = JJ+1 - JKP1 = JK+1 - ZSUM1 = 0. - ZSUM2 = 0. - ! - DO JI2=JIM1,JIP1 - DO JJ2=JJM1,JJP1 - DO JK2=JKM1,JKP1 - ZSUM1 = ZSUM1 + (XIBM_SUTR(JI2,JJ2,JK2,4)) - ZSUM2 = ZSUM2 + (XIBM_SUTR(JI2,JJ2,JK2,4))*PRWS(JI2,JJ2,JK2) - ENDDO - ENDDO - ENDDO - ! - PRWS(JI,JJ,JK) = 0. - IF (ZSUM1.GT.XIBM_EPSI) PRWS(JI,JJ,JK) = ZSUM2/ZSUM1 - ! - ENDIF - ENDDO - ENDDO - ENDDO - ! - PTHS(:,:,IKB-1)=PTHS(:,:,IKB) - PTHS(:,:,IKE+1)=PTHS(:,:,IKE) - IF (CTURB/='NONE') PTKS(:,:,IKB-1)=PTKS(:,:,IKB) - IF (CTURB/='NONE') PTKS(:,:,IKE+1)=PTKS(:,:,IKE) - IF (NSV>=1) PSVS(:,:,IKB-1,:)=PSVS(:,:,IKB,:) - IF (NSV>=1) PSVS(:,:,IKE+1,:)=PSVS(:,:,IKE,:) - IF (NRR>=1) PRRS(:,:,IKB-1,:)=PRRS(:,:,IKB,:) - IF (NRR>=1) PRRS(:,:,IKE+1,:)=PRRS(:,:,IKE,:) - PRUS(:,:,IKB-1)=PRUS(:,:,IKB) - PRUS(:,:,IKE+1)=PRUS(:,:,IKE) - PRVS(:,:,IKB-1)=PRVS(:,:,IKB) - PRVS(:,:,IKE+1)=PRVS(:,:,IKE) - PRWS(:,:,IKB-1)=0. - PRWS(:,:,IKB) =0. - PRWS(:,:,IKE+1)=0. - ! - NULLIFY(TZFIELDS_ll) - CALL ADD3DFIELD_ll(TZFIELDS_ll,PTHS(:,:,:),'IBM_FORCING_TR::PTHS') - IF (CTURB/='NONE') CALL ADD3DFIELD_ll(TZFIELDS_ll,PTKS(:,:,:),'IBM_FORCING_TR::PTKS') - CALL ADD3DFIELD_ll(TZFIELDS_ll,PRUS(:,:,:),'IBM_FORCING_TR::PRUS') - CALL ADD3DFIELD_ll(TZFIELDS_ll,PRVS(:,:,:),'IBM_FORCING_TR::PRVS') - CALL ADD3DFIELD_ll(TZFIELDS_ll,PRWS(:,:,:),'IBM_FORCING_TR::PRWS') - IF (NSV>=1) THEN - DO JL=1,NSV - CALL ADD3DFIELD_ll(TZFIELDS_ll,PSVS(:,:,:,JL),'IBM_FORCING_TR::PSVS') - ENDDO - ENDIF - IF (NRR>=1) THEN - DO JL=1,NRR - CALL ADD3DFIELD_ll(TZFIELDS_ll,PRRS(:,:,:,JL),'IBM_FORCING_TR::PRRS') - ENDDO - ENDIF - CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS_ll) - ! - ! Problems on corners ? => imposition of the adjacent value - ! - DO JI=IIB,IIE - DO JJ=IJB,IJE - DO JK=IKB,IKE - ! - IF (XIBM_LS(JI,JJ,JK,2).GT.XIBM_EPSI) THEN - ! - ZSUM1 = (XIBM_CURV(JI,JJ,JK)+XIBM_CURV(JI-1,JJ,JK))/2. - ZSUM1 = ABS(ZSUM1) - ZSUM1 = MIN(1.,ZSUM1) - ! - JIM1 = JI-1 - JJM1 = JJ-1 - JKM1 = JK-1 - JIP1 = JI+1 - JJP1 = JJ+1 - JKP1 = JK+1 - ZSUM2 = 0. - ! - DO JI2=JIM1,JIP1 - DO JJ2=JJM1,JJP1 - DO JK2=JKM1,JKP1 - ZSUM2 = ZSUM2 + PRUS(JI2,JJ2,JK2) - ENDDO - ENDDO - ENDDO - ! - PRUS(JI,JJ,JK) = (1.-ZSUM1)*PRUS(JI,JJ,JK)+ZSUM1*ZSUM2/27. - ! - ENDIF - ! - IF (XIBM_LS(JI,JJ,JK,3).GT.XIBM_EPSI) THEN - ! - ZSUM1 = (XIBM_CURV(JI,JJ,JK)+XIBM_CURV(JI,JJ-1,JK))/2. - ZSUM1 = ABS(ZSUM1) - ZSUM1 = MIN(1.,ZSUM1) - ! - JIM1 = JI-1 - JJM1 = JJ-1 - JKM1 = JK-1 - JIP1 = JI+1 - JJP1 = JJ+1 - JKP1 = JK+1 - ZSUM2 = 0. - ! - DO JI2=JIM1,JIP1 - DO JJ2=JJM1,JJP1 - DO JK2=JKM1,JKP1 - ZSUM2 = ZSUM2 + PRVS(JI2,JJ2,JK2) - ENDDO - ENDDO - ENDDO - ! - PRVS(JI,JJ,JK) = (1.-ZSUM1)*PRVS(JI,JJ,JK)+ZSUM1*ZSUM2/27. - ! - ENDIF - ! - IF (XIBM_LS(JI,JJ,JK,4).GT.XIBM_EPSI) THEN - ! - ZSUM1 = (XIBM_CURV(JI,JJ,JK)+XIBM_CURV(JI,JJ,JK-1))/2. - ZSUM1 = ABS(ZSUM1) - ZSUM1 = MIN(1.,ZSUM1) - ! - JIM1 = JI-1 - JJM1 = JJ-1 - JKM1 = JK-1 - JIP1 = JI+1 - JJP1 = JJ+1 - JKP1 = JK+1 - ZSUM2 = 0. - ! - DO JI2=JIM1,JIP1 - DO JJ2=JJM1,JJP1 - DO JK2=JKM1,JKP1 - ZSUM2 = ZSUM2 + PRWS(JI2,JJ2,JK2) - ENDDO - ENDDO - ENDDO - ! - PRWS(JI,JJ,JK) = (1.-ZSUM1)*PRWS(JI,JJ,JK)+ZSUM1*ZSUM2/27. - ! - ENDIF - ENDDO - ENDDO - ENDDO - ! - PRUS(:,:,IKB-1)=PRUS(:,:,IKB) - PRUS(:,:,IKE+1)=PRUS(:,:,IKE) - PRVS(:,:,IKB-1)=PRVS(:,:,IKB) - PRVS(:,:,IKE+1)=PRVS(:,:,IKE) - PRWS(:,:,IKB-1)=0. - PRWS(:,:,IKB) =0. - PRWS(:,:,IKE+1)=0. - ! - NULLIFY(TZFIELDS_ll) - CALL ADD3DFIELD_ll(TZFIELDS_ll,PRUS(:,:,:),'IBM_FORCING_TR::PRUS') - CALL ADD3DFIELD_ll(TZFIELDS_ll,PRVS(:,:,:),'IBM_FORCING_TR::PRVS') - CALL ADD3DFIELD_ll(TZFIELDS_ll,PRWS(:,:,:),'IBM_FORCING_TR::PRWS') - CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS_ll) - ! - RETURN - ! -END SUBROUTINE IBM_FORCING_TR diff --git a/src/PHYEX/ext/ibm_generls.f90 b/src/PHYEX/ext/ibm_generls.f90 deleted file mode 100644 index f8d7f9d7f..000000000 --- a/src/PHYEX/ext/ibm_generls.f90 +++ /dev/null @@ -1,541 +0,0 @@ -!MNH_LIC Copyright 2021-2022 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! -! ####################### -MODULE MODI_IBM_GENERLS - ! ####################### - ! - INTERFACE - ! - SUBROUTINE IBM_GENERLS(PIBM_FACES,PNORM_FACES,PV1,PV2,PV3,PX_MIN,PY_MIN,PX_MAX,PY_MAX,PPHI) - ! - REAL, DIMENSION(:,:,:) ,INTENT(IN) :: PIBM_FACES - REAL, DIMENSION(:,:) ,INTENT(IN) :: PNORM_FACES,PV1,PV2,PV3 - REAL, DIMENSION(:,:,:,:) ,INTENT(INOUT) :: PPHI - REAL ,INTENT(IN) :: PX_MIN,PY_MIN,PX_MAX,PY_MAX - ! - END SUBROUTINE IBM_GENERLS - ! - END INTERFACE - ! -END MODULE MODI_IBM_GENERLS -! -! ##################################### -SUBROUTINE IBM_GENERLS(PIBM_FACES,PNORM_FACES,PV1,PV2,PV3,PX_MIN,PY_MIN,PX_MAX,PY_MAX,PPHI) - ! ##################################### - ! - ! - !**** IBM_GENERLS computes the Level Set function for any surface - ! - ! PURPOSE - ! ------- - !**** The purpose of this routine is to estimate the level set - ! containing XYZ minimalisation interface locations - - ! METHOD - ! ------ - !**** Iterative system and minimization of the interface distance - ! - ! EXTERNAL - ! -------- - ! SUBROUTINE ? - ! - ! IMPLICIT ARGUMENTS - ! ------------------ - ! MODD_? - ! - ! REFERENCE - ! --------- - ! The method is based on '3D Distance from a Point to a Triangle' - ! a technical report from Mark W. Jones, University of Wales Swansea - ! - ! AUTHORS - ! ------ - ! Tim Nagel, Valéry Masson & Robert Schoetter - ! - ! MODIFICATIONS - ! ------------- - ! Original 01/06/2021 - ! - !------------------------------------------------------------------------------ - ! - !**** 0. DECLARATIONS - ! --------------- - ! - ! module - USE MODE_POS - USE MODE_ll - USE MODE_IO - USE MODD_ARGSLIST_ll, ONLY : LIST_ll - ! - ! declaration - USE MODD_IBM_PARAM_n - USE MODD_IBM_LSF - USE MODD_DIM_n, ONLY: NIMAX,NJMAX,NKMAX - USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT,XUNDEF - USE MODD_METRICS_n, ONLY: XDXX,XDYY,XDZZ - USE MODD_VAR_ll, ONLY: IP - USE MODD_CST, ONLY: XMNH_EPSILON - ! - ! interface - USE MODI_SHUMAN - USE MODI_IBM_INTERPOS - USE MODI_IBM_DETECT - ! - IMPLICIT NONE - ! - ! 0.1 declarations of arguments - ! - REAL, DIMENSION(:,:,:) ,INTENT(IN) :: PIBM_FACES !faces coordinates - REAL, DIMENSION(:,:) ,INTENT(IN) :: PNORM_FACES !normal - REAL, DIMENSION(:,:) ,INTENT(IN) :: PV1,PV2,PV3 - REAL, DIMENSION(:,:,:,:) ,INTENT(INOUT) :: PPHI ! LS functions - REAL ,INTENT(IN) :: PX_MIN,PY_MIN,PX_MAX,PY_MAX - ! - !------------------------------------------------------------------------------ - ! - ! 0.2 declaration of local variables - ! - INTEGER :: JI,JJ,JK,JN,JM,JI2,JJ2,JK2 ! loop index - INTEGER :: JI_MIN,JI_MAX,JJ_MIN,JJ_MAX,JK_MIN,JK_MAX,IIU,IJU,IKU ! loop boundaries - REAL :: Z_DIST_TEST1,Z_DIST_TEST2 ! saving distances - REAL :: Z_DIST_TEST3,Z_DIST_TEST4,ZDIST_REF0 - INTEGER :: INUMB_FACES ! number of faces - REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZXHATM,ZYHATM,ZZHATM,ZDP0PP0PAST - CHARACTER(LEN=1) :: YPOS - REAL, DIMENSION(3) :: ZP1P0,ZP1P2,ZP0PP0,ZP1PP0,ZP2PP0,ZP3PP0,ZPP0P1,ZPP0P2,ZPP0P3 - REAL, DIMENSION(3) :: ZPP0PPP0,ZPPP0P1,ZPPP0P2,ZP2P1,ZP2P0,ZP2P3,ZP3P2,ZP3P1 - REAL, DIMENSION(3) :: ZPP0,ZFT1,ZFT2,ZFT3,ZFT1B,ZFT2B,ZFT3B,ZR,ZPPP0,ZP3P0,ZP0P1 - REAL, DIMENSION(3) :: ZPPP0P3,ZP1P3,ZPCP0,ZR0 - REAL, DIMENSION(:), ALLOCATABLE :: ZSTEMP,ZRDIR,ZVECTDISTPLUS,ZVECTDISTMOINS,ZVECTDIST!,ZFACE - REAL, DIMENSION(:,:), ALLOCATABLE :: ZC - REAL :: ZF1,ZF2,ZF3,ZF1B,ZF2B,ZF3B,ZDPP0PPP0 - REAL :: ZT,ZSIGN,ZS,ZDIST,ZDP0PP0,ZNNORM,ZRN,ZPHI_OLD - TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange - INTEGER :: IINFO_ll,IMI ! return code of parallel routine - INTEGER :: IIE,IIB,IJB,IJE,IKE,IKB,ZBPLUS - LOGICAL :: GABOVE_ROOF,LFACE,LDZ - LOGICAL, DIMENSION(:), ALLOCATABLE :: ZFACE - INTEGER :: ZCOUNT,ZIDX,ZII,ZCHANGE,ZCHANGE1 - REAL :: ZDIFF,ZMIN_DIFF,ZDX - ! - !------------------------------------------------------------------------------ - ! - ! 0.3 allocation - ! - NULLIFY(TZFIELDS_ll) - IIU = SIZE(PPHI,1) - IJU = SIZE(PPHI,2) - IKU = SIZE(PPHI,3) - IIB=1+JPHEXT - IIE=IIU-JPHEXT - IJB=1+JPHEXT - IJE=IJU-JPHEXT - IKB=1+JPVEXT - IKE=IKU-JPVEXT - ! - JK_MIN = 1 + JPVEXT - JK_MAX = IKU - JPVEXT - ! - CALL GET_INDICE_ll (JI_MIN,JJ_MIN,JI_MAX,JJ_MAX) - ! - ALLOCATE(ZXHATM(IIU,IJU,IKU)) - ALLOCATE(ZYHATM(IIU,IJU,IKU)) - ALLOCATE(ZZHATM(IIU,IJU,IKU)) - ! - !------------------------------------------------------------------------------- - ! - !**** 1. PRELIMINARIES - ! ---------------- - ! - INUMB_FACES = SIZE(PIBM_FACES,1) - ALLOCATE(ZC(INUMB_FACES,3)) - ALLOCATE(ZSTEMP(1)) - ALLOCATE(ZRDIR(1)) - PPHI = -XUNDEF - ALLOCATE(ZDP0PP0PAST(IIU,IJU,IKU)) - ZDP0PP0PAST = 0. - ALLOCATE(ZVECTDIST(10000)) - ALLOCATE(ZVECTDISTPLUS(10000)) - ALLOCATE(ZVECTDISTMOINS(10000)) - ALLOCATE(ZFACE(10000)) - ZFACE=.FALSE. - ! - !------------------------------------------------------------------------------- - ! - !**** 2. EXECUTIONS - ! ------------- - ! - JM=1 - YPOS = 'P' - ! - CALL IBM_INTERPOS(ZXHATM,ZYHATM,ZZHATM,YPOS) - ZDX = ZXHATM(JI_MIN+1,JJ_MIN,JK_MIN)-ZXHATM(JI_MIN,JJ_MIN,JK_MIN) - ! - DO JK = JK_MIN,JK_MAX - DO JJ = JJ_MIN,JJ_MAX - DO JI = JI_MIN,JI_MAX - ZCOUNT = 1 - ZVECTDIST = -999. - DO JN = 1,INUMB_FACES - LFACE=.FALSE. - !***Calcul of the face center - ZC(JN,1)=(PIBM_FACES(JN,1,1)+PIBM_FACES(JN,2,1)+PIBM_FACES(JN,3,1))/3. - ZC(JN,2)=(PIBM_FACES(JN,1,2)+PIBM_FACES(JN,2,2)+PIBM_FACES(JN,3,2))/3. - ZC(JN,3)=(PIBM_FACES(JN,1,3)+PIBM_FACES(JN,2,3)+PIBM_FACES(JN,3,3))/3. - !***Norm normalization - ZNNORM = SQRT(PNORM_FACES(JN,1)**2+PNORM_FACES(JN,2)**2+PNORM_FACES(JN,3)**2) - !***Vector between the face center and the current grid point - ZPCP0(1) = ZXHATM(JI,JJ,JK)-ZC(JN,1) - ZPCP0(2) = ZYHATM(JI,JJ,JK)-ZC(JN,2) - ZPCP0(3) = ZZHATM(JI,JJ,JK)-ZC(JN,3) - ZSIGN = ZPCP0(1)*PNORM_FACES(JN,1)+ & - ZPCP0(2)*PNORM_FACES(JN,2)+ & - ZPCP0(3)*PNORM_FACES(JN,3) - !***Various vectors - ZP1P0(1) = ZXHATM(JI,JJ,JK)-PIBM_FACES(JN,1,1) - ZP1P0(2) = ZYHATM(JI,JJ,JK)-PIBM_FACES(JN,1,2) - ZP1P0(3) = ZZHATM(JI,JJ,JK)-PIBM_FACES(JN,1,3) - ZP3P0(1) = ZXHATM(JI,JJ,JK)-PIBM_FACES(JN,3,1) - ZP3P0(2) = ZYHATM(JI,JJ,JK)-PIBM_FACES(JN,3,2) - ZP3P0(3) = ZZHATM(JI,JJ,JK)-PIBM_FACES(JN,3,3) - ZP0P1(1) = PIBM_FACES(JN,1,1)-ZXHATM(JI,JJ,JK) - ZP0P1(2) = PIBM_FACES(JN,1,2)-ZYHATM(JI,JJ,JK) - ZP0P1(3) = PIBM_FACES(JN,1,3)-ZZHATM(JI,JJ,JK) - ZP2P0(1) = ZXHATM(JI,JJ,JK)-PIBM_FACES(JN,2,1) - ZP2P0(2) = ZYHATM(JI,JJ,JK)-PIBM_FACES(JN,2,2) - ZP2P0(3) = ZZHATM(JI,JJ,JK)-PIBM_FACES(JN,2,3) - !***Equation (3) of Jones (1995) - IF(ZP1P0(1)==0.AND.ZP1P0(2)==0.AND.ZP1P0(3)==0) THEN - WRITE(*,*) 'ZP1P0(1,2,3)',ZP1P0(1),ZP1P0(2),ZP1P0(3) - ZDP0PP0 = 0. - ELSE - ZDP0PP0 = SQRT(ZP0P1(1)**2+ZP0P1(2)**2+ZP0P1(3)**2)* & - ((ZP1P0(1)*PNORM_FACES(JN,1)+ZP1P0(2)*PNORM_FACES(JN,2)+& - ZP1P0(3)*PNORM_FACES(JN,3))/( & - SQRT((ZP1P0(1))**2+(ZP1P0(2))**2+(ZP1P0(3))**2)*ZNNORM)) - END IF - !***Equation (4) of Jones (1995) - ZP0PP0(1) = -ZDP0PP0*(PNORM_FACES(JN,1)/ZNNORM) - ZP0PP0(2) = -ZDP0PP0*(PNORM_FACES(JN,2)/ZNNORM) - ZP0PP0(3) = -ZDP0PP0*(PNORM_FACES(JN,3)/ZNNORM) - !***Equation (5) of Jones (1995) - ZPP0(1) = ZXHATM(JI,JJ,JK)+ZP0PP0(1) - ZPP0(2) = ZYHATM(JI,JJ,JK)+ZP0PP0(2) - ZPP0(3) = ZZHATM(JI,JJ,JK)+ZP0PP0(3) - ! - ZP1PP0(1)=ZPP0(1)-PIBM_FACES(JN,1,1) - ZP1PP0(2)=ZPP0(2)-PIBM_FACES(JN,1,2) - ZP1PP0(3)=ZPP0(3)-PIBM_FACES(JN,1,3) - ! - ZP2PP0(1)=ZPP0(1)-PIBM_FACES(JN,2,1) - ZP2PP0(2)=ZPP0(2)-PIBM_FACES(JN,2,2) - ZP2PP0(3)=ZPP0(3)-PIBM_FACES(JN,2,3) - ! - ZP3PP0(1)=ZPP0(1)-PIBM_FACES(JN,3,1) - ZP3PP0(2)=ZPP0(2)-PIBM_FACES(JN,3,2) - ZP3PP0(3)=ZPP0(3)-PIBM_FACES(JN,3,3) - ! - ZPP0P1(1)=PIBM_FACES(JN,1,1)-ZPP0(1) - ZPP0P1(2)=PIBM_FACES(JN,1,2)-ZPP0(2) - ZPP0P1(3)=PIBM_FACES(JN,1,3)-ZPP0(3) - ! - ZPP0P2(1)=PIBM_FACES(JN,2,1)-ZPP0(1) - ZPP0P2(2)=PIBM_FACES(JN,2,2)-ZPP0(2) - ZPP0P2(3)=PIBM_FACES(JN,2,3)-ZPP0(3) - ! - ZPP0P3(1)=PIBM_FACES(JN,3,1)-ZPP0(1) - ZPP0P3(2)=PIBM_FACES(JN,3,2)-ZPP0(2) - ZPP0P3(3)=PIBM_FACES(JN,3,3)-ZPP0(3) - ! - !***Calculation of f1,f2,f3 (Jones (1995)) - ZFT1= CROSSPRODUCT(PV1(JN,:),ZP1PP0) - ZFT2= CROSSPRODUCT(PV2(JN,:),ZP2PP0) - ZFT3= CROSSPRODUCT(PV3(JN,:),ZP3PP0) - - ZF1 =ZFT1(1)*PNORM_FACES(JN,1)+ & - ZFT1(2)*PNORM_FACES(JN,2)+ & - ZFT1(3)*PNORM_FACES(JN,3) - - ZF2 =ZFT2(1)*PNORM_FACES(JN,1)+ & - ZFT2(2)*PNORM_FACES(JN,2)+ & - ZFT2(3)*PNORM_FACES(JN,3) - - ZF3 =ZFT3(1)*PNORM_FACES(JN,1)+ & - ZFT3(2)*PNORM_FACES(JN,2)+ & - ZFT3(3)*PNORM_FACES(JN,3) - !***Point anticlockwise of V1 and clockwise of V2 - IF (ZF1.GE.0.AND.ZF2.LE.0) THEN - ZFT1B = CROSSPRODUCT(ZPP0P1,ZPP0P2) - ZF1B = ZFT1B(1)*PNORM_FACES(JN,1)+ & - ZFT1B(2)*PNORM_FACES(JN,2)+ & - ZFT1B(3)*PNORM_FACES(JN,3) - IF (ZF1B<0) THEN - ZP1P2(:) = PIBM_FACES(JN,2,:)-PIBM_FACES(JN,1,:) - ZR = CROSSPRODUCT(CROSSPRODUCT(ZPP0P2,ZPP0P1),ZP1P2) - ZRN = SQRT(ZR(1)**2+ZR(2)**2+ZR(3)**2) - !***Eq. (10) of Jones(1995) - ZDPP0PPP0 = SQRT(ZPP0P1(1)**2+ZPP0P1(2)**2+ZPP0P1(3)**2)* & - ((ZPP0P1(1)*ZR(1)+ZPP0P1(2)*ZR(2)+ZPP0P1(3)*ZR(3))/( & - SQRT(ZPP0P1(1)**2+ZPP0P1(2)**2+ZPP0P1(3)**2)*ZRN))! & - ZPP0PPP0 = ZDPP0PPP0*(ZR/ZRN) - ZPPP0 = ZPP0+ZPP0PPP0 - ZPPP0P1 = PIBM_FACES(JN,1,:)-ZPPP0 - ZP2P1 = PIBM_FACES(JN,1,:)-PIBM_FACES(JN,2,:) - ZRDIR = SIGN(1.,SCALPRODUCT(ZPPP0P1,ZP2P1)) - ZT = SQRT(ZPPP0P1(1)**2+ZPPP0P1(2)**2+ZPPP0P1(3)**2)/ & - SQRT(ZP2P1(1)**2+ZP2P1(2)**2+ZP2P1(3)**2)*ZRDIR(1) - IF (ZT.GE.0.AND.ZT.LE.1) THEN - ZDIST =SQRT(ZDPP0PPP0**2+ZDP0PP0**2) - ELSEIF (ZT<0.) THEN - ZDIST = SQRT(ZP1P0(1)**2+ZP1P0(2)**2+ZP1P0(3)**2) - ELSEIF (ZT>1.) THEN - ZDIST = SQRT(ZP2P0(1)**2+ZP2P0(2)**2+ZP2P0(3)**2) - ELSE - call Print_msg( NVERB_FATAL, 'GEN', 'IBM_PREP_LS', 'Error in ZT calculation' ) - ENDIF - ELSE - ZDIST = ZDP0PP0 - LFACE = .TRUE. - ENDIF - !***Point anticlockwise of V2 and clockwise of V3 - ELSEIF (ZF2.GE.0.AND.ZF3.LE.0) THEN - ZFT2B = CROSSPRODUCT(ZPP0P2,ZPP0P3) - ZF2B = ZFT2B(1)*PNORM_FACES(JN,1)+ & - ZFT2B(2)*PNORM_FACES(JN,2)+ & - ZFT2B(3)*PNORM_FACES(JN,3) - IF (ZF2B<0) THEN - ZP2P3(:) = PIBM_FACES(JN,3,:)-PIBM_FACES(JN,2,:) - ZR = CROSSPRODUCT(CROSSPRODUCT(ZPP0P3,ZPP0P2),ZP2P3) - ZRN = SQRT(ZR(1)**2+ZR(2)**2+ZR(3)**2) - ZDPP0PPP0 = SQRT(ZPP0P2(1)**2+ZPP0P2(2)**2+ZPP0P2(3)**2)* & - ((ZPP0P2(1)*ZR(1)+ZPP0P2(2)*ZR(2)+ZPP0P2(3)*ZR(3))/( & - SQRT(ZPP0P2(1)**2+ZPP0P2(2)**2+ZPP0P2(3)**2)*ZRN))! & - ZPP0PPP0 = ZDPP0PPP0*(ZR/ZRN) - ZPPP0 = ZPP0+ZPP0PPP0 - ZPPP0P2 = PIBM_FACES(JN,2,:)-ZPPP0 - ZP3P2 = PIBM_FACES(JN,2,:)-PIBM_FACES(JN,3,:) - ZRDIR = SIGN(1.,SCALPRODUCT(ZPPP0P2,ZP3P2)) - ZT = SQRT(ZPPP0P2(1)**2+ZPPP0P2(2)**2+ZPPP0P2(3)**2)/ & - SQRT(ZP3P2(1)**2+ZP3P2(2)**2+ZP3P2(3)**2)*ZRDIR(1) - IF (ZT.GE.0.AND.ZT.LE.1) THEN - ZDIST = SQRT(ZDPP0PPP0**2+ZDP0PP0**2) - ELSEIF (ZT<0.) THEN - ZDIST = SQRT(ZP2P0(1)**2+ZP2P0(2)**2+ZP2P0(3)**2) - ELSEIF (ZT>1.) THEN - ZDIST = SQRT(ZP3P0(1)**2+ZP3P0(2)**2+ZP3P0(3)**2) - ELSE - call Print_msg( NVERB_FATAL, 'GEN', 'IBM_PREP_LS', 'Error in ZT calculation' ) - ENDIF - ELSE - ZDIST = ZDP0PP0 - LFACE = .TRUE. - ENDIF - !***Point anticlockwise of V3 and clockwise of V1 - ELSEIF (ZF3.GE.0.AND.ZF1.LE.0) THEN - ZFT3B = CROSSPRODUCT(ZPP0P3,ZPP0P1) - ZF3B = ZFT3B(1)*PNORM_FACES(JN,1)+ & - ZFT3B(2)*PNORM_FACES(JN,2)+ & - ZFT3B(3)*PNORM_FACES(JN,3) - IF (ZF3B<0) THEN - ZP3P1(:) = PIBM_FACES(JN,1,:)-PIBM_FACES(JN,3,:) - ZR = CROSSPRODUCT(CROSSPRODUCT(ZPP0P1,ZPP0P3),ZP3P1) - ZRN = SQRT(ZR(1)**2+ZR(2)**2+ZR(3)**2) - ZDPP0PPP0 = SQRT(ZPP0P3(1)**2+ZPP0P3(2)**2+ZPP0P3(3)**2)* & - ((ZPP0P3(1)*ZR(1)+ZPP0P3(2)*ZR(2)+ZPP0P3(3)*ZR(3))/( & - SQRT((ZPP0P3(1))**2+(ZPP0P3(2))**2+(ZPP0P3(3))**2)*ZRN))! & - ZPP0PPP0 = ZDPP0PPP0*(ZR/ZRN) - ZPPP0 = ZPP0+ZPP0PPP0 - ZPPP0P3 = PIBM_FACES(JN,3,:)-ZPPP0 - ZP1P3 = PIBM_FACES(JN,3,:)-PIBM_FACES(JN,1,:) - ZRDIR = SIGN(1.,SCALPRODUCT(ZPPP0P3,ZP1P3)) - ZT = SQRT(ZPPP0P3(1)**2+ZPPP0P3(2)**2+ZPPP0P3(3)**2)/ & - SQRT(ZP1P3(1)**2+ZP1P3(2)**2+ZP1P3(3)**2)*ZRDIR(1) - IF (ZT.GE.0.AND.ZT.LE.1) THEN - ZDIST = SQRT(ZDPP0PPP0**2+ZDP0PP0**2) - ELSEIF (ZT<0.) THEN - ZDIST = SQRT(ZP3P0(1)**2+ZP3P0(2)**2+ZP3P0(3)**2) - ELSEIF (ZT>1.) THEN - ZDIST = SQRT(ZP1P0(1)**2+ZP1P0(2)**2+ZP1P0(3)**2) - ELSE - call Print_msg( NVERB_FATAL, 'GEN', 'IBM_PREP_LS', 'Error in ZT calculation' ) - ENDIF - ELSE - ZDIST = ZDP0PP0 - LFACE = .TRUE. - ENDIF - ELSE - call Print_msg( NVERB_FATAL, 'GEN', 'IBM_PREP_LS', 'Error in ZF instruction' ) - ENDIF - ZDIST = SIGN(ZDIST,-ZSIGN) - ZDIST = ANINT(ZDIST*10.E5) / 10.E5 - PPHI(JI,JJ,JK,JM) = ANINT(PPHI(JI,JJ,JK,JM)*10.E5) / 10.E5 - IF (ABS(ZDIST).LE.ABS(PPHI(JI,JJ,JK,JM))) THEN - ZPHI_OLD = PPHI(JI,JJ,JK,JM) - IF (ABS(ZDIST)==ABS(PPHI(JI,JJ,JK,JM))) THEN - IF (ABS(ZDP0PP0).GT.ABS(ZDP0PP0PAST(JI,JJ,JK))) THEN - PPHI(JI,JJ,JK,JM) = ZDIST - ZDP0PP0PAST(JI,JJ,JK) = ZDP0PP0 - ENDIF - ELSE - PPHI(JI,JJ,JK,JM) = ZDIST - ENDIF - IF (ABS(ZDIST).LT.ABS(ZPHI_OLD)) THEN - ZDP0PP0PAST(JI,JJ,JK) = ZDP0PP0 - ENDIF - ENDIF - IF (ABS(PPHI(JI,JJ,JK,JM)).GT.(SQRT(3.)*4.)) THEN - PPHI(JI,JJ,JK,JM) = -999. - ENDIF - IF (ABS(ZDIST).LT.(SQRT(3.)*4.)) THEN - ZVECTDIST(ZCOUNT)=ZDIST - ZFACE(ZCOUNT)=LFACE - ZCOUNT = ZCOUNT +1 - ENDIF - ENDDO - ZVECTDISTPLUS=ZVECTDIST - ZVECTDISTMOINS=ZVECTDIST - WHERE (ZVECTDIST.GT.0) - ZVECTDISTMOINS=-999. - ENDWHERE - WHERE (ZVECTDIST.LT.0) - ZVECTDISTPLUS=999. - ENDWHERE - IF (ANY(ZVECTDIST.GT.0.).AND.(ABS(ABS(MINVAL(ZVECTDISTPLUS))-ABS(MAXVAL(ZVECTDISTMOINS))).LT.10.E-6)) THEN - ZMIN_DIFF = 1. - ZIDX = 0 - DO ZII = 1, SIZE(ZVECTDIST) - ZDIFF = ABS(ZVECTDIST(ZII)-MINVAL(ZVECTDISTPLUS)) - IF ( ZDIFF < ZMIN_DIFF) THEN - ZIDX = ZII - ZMIN_DIFF = ZDIFF - ENDIF - ENDDO - IF (ZFACE(ZIDX)) THEN - PPHI(JI,JJ,JK,JM) = MINVAL(ZVECTDISTPLUS) - ENDIF - ENDIF - ENDDO - ENDDO - ENDDO - -DO JJ=JJ_MIN,JJ_MAX -DO JI=JI_MIN,JI_MAX -GABOVE_ROOF=.FALSE. -DO JK=IKB, IKE - ! check if point is flagged as not calculated - IF (PPHI(JI,JJ,JK,JM)==-999.) THEN - ! check if point is already above a point that encountered a point near the - ! surface (that can be outside or inside a building) - ! check if that point was inside (if outside, the value of the levelset - ! stays at -999.) - IF (GABOVE_ROOF .AND. PPHI(JI,JJ,JK-1,JM) > XIBM_EPSI) THEN - PPHI(JI,JJ,JK,JM) = 999. - CYCLE - END IF - ! check if the point of the column have not encoutered a near-building - ! surface point with a physical value of the level set - IF (.NOT. GABOVE_ROOF) THEN - ! if the point above has a physical value for the level set, then the - ! status inside (999) or outside (-999) is given to all points below, - ! depending if this point above (that needs not to be the point at the top - ! of the model!) is inside or outside - ! checks if the point above has a physical value for the levelset - IF (JK<IKE .AND. ABS (PPHI(JI,JJ,JK+1,JM)) < 900.) THEN - ! if the point above is inside, all points below are set inside - IF (PPHI(JI,JJ,JK+1,JM)>XIBM_EPSI) PPHI(JI,JJ,IKB:JK,JM) = 999. - ! indicate for further processing of points above the current point - ! that we have encountered a physical value of the level set, near the - ! surface building - GABOVE_ROOF = .TRUE. - END IF - CYCLE - ENDIF - END IF - ! if we have never encoutered a roof or point near a building form above, - ! then, we are outside, and nothing is changed (value -999 kept) - END DO - PPHI(JI,JJ,IKB-1,JM) = PPHI(JI,JJ,IKB,JM) - PPHI(JI,JJ,IKE+1,JM) = PPHI(JI,JJ,IKE,JM) -END DO -END DO - - -JN=1 -PPHI(:,:,IKB-1,JN)=2*PPHI(:,:,IKB,JN)-PPHI(:,:,IKB+1,JN) -PPHI(:,:,IKE+1,JN)=2*PPHI(:,:,IKE,JN)-PPHI(:,:,IKE-1,JN) -PPHI(IIB-1,:,:,JN) = PPHI( IIB ,:,:,JN) -PPHI(IIE+1,:,:,JN) = PPHI( IIE ,:,:,JN) -PPHI(:,IJB-1,:,JN) = PPHI(:, IJB ,:,JN) -PPHI(:,IJE+1,:,JN) = PPHI(:, IJE ,:,JN) - -PPHI(:,:,:,2)=MXM(PPHI(:,:,:,1)) -PPHI(:,:,:,3)=MYM(PPHI(:,:,:,1)) -PPHI(:,:,:,4)=MZM(PPHI(:,:,:,1)) - -NULLIFY(TZFIELDS_ll) -DO JN=2,4 - PPHI(:,:,IKB-1,JN)=2*PPHI(:,:,IKB,JN)-PPHI(:,:,IKB+1,JN) - PPHI(:,:,IKE+1,JN)=2*PPHI(:,:,IKE,JN)-PPHI(:,:,IKE-1,JN) - PPHI(IIB-1,:,:,JN) = PPHI( IIB ,:,:,JN) - PPHI(IIE+1,:,:,JN) = PPHI( IIE ,:,:,JN) - PPHI(:,IJB-1,:,JN) = PPHI(:, IJB ,:,JN) - PPHI(:,IJE+1,:,JN) = PPHI(:, IJE ,:,JN) -ENDDO - -PPHI(:,:,:,5)=MYM(PPHI(:,:,:,2)) -PPHI(:,:,:,6)=MXM(PPHI(:,:,:,4)) -PPHI(:,:,:,7)=MYM(PPHI(:,:,:,4)) -NULLIFY(TZFIELDS_ll) -DO JN=5,7 - PPHI(:,:,IKB-1,JN)=2*PPHI(:,:,IKB,JN)-PPHI(:,:,IKB+1,JN) - PPHI(:,:,IKE+1,JN)=2*PPHI(:,:,IKE,JN)-PPHI(:,:,IKE-1,JN) - PPHI(IIB-1,:,:,JN) = PPHI( IIB ,:,:,JN) - PPHI(IIE+1,:,:,JN) = PPHI( IIE ,:,:,JN) - PPHI(:,IJB-1,:,JN) = PPHI(:, IJB ,:,JN) - PPHI(:,IJE+1,:,JN) = PPHI(:, IJE ,:,JN) -ENDDO -WHERE (ABS(PPHI(:,:,:,:)).LT.XIBM_EPSI) PPHI(:,:,:,:)=2.*XIBM_EPSI - - - !COMPLETE PPHI ON THE HALO OF EACH SUBDOMAINS - DO JN=1,7 - CALL ADD3DFIELD_ll(TZFIELDS_ll,PPHI(:,:,:,JN),'IBM_GENERLS::PPHI') - ENDDO - CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS_ll) - - ! - !------------------------------------------------------------------------------- - ! - !**** X. DEALLOCATIONS/CLOSES - ! ----------------------- - ! - !DEALLOCATE(ZDP0PP0,ZDIST,ZC,ZSTEMP) - DEALLOCATE(ZC,ZSTEMP) - DEALLOCATE(ZXHATM,ZYHATM,ZZHATM) - ! - RETURN - ! -CONTAINS - ! - FUNCTION CROSSPRODUCT(PA,PB) RESULT(CROSS) - ! - REAL, DIMENSION(3) :: CROSS - REAL, DIMENSION(3), INTENT(IN) :: PA, PB - CROSS(1) = PA(2) * PB(3) - PA(3) * PB(2) - CROSS(2) = PA(3) * PB(1) - PA(1) * PB(3) - CROSS(3) = PA(1) * PB(2) - PA(2) * PB(1) - END FUNCTION CROSSPRODUCT - - FUNCTION SCALPRODUCT(PA,PB) RESULT(SCAL) - ! - REAL :: SCAL - REAL, DIMENSION(3), INTENT(IN) :: PA, PB - SCAL = PA(1)*PB(1)+PA(2)*PB(2)+PA(3)*PB(3) - END FUNCTION SCALPRODUCT - -END SUBROUTINE IBM_GENERLS diff --git a/src/PHYEX/ext/ice_adjust_bis.f90 b/src/PHYEX/ext/ice_adjust_bis.f90 deleted file mode 100644 index e530d5c21..000000000 --- a/src/PHYEX/ext/ice_adjust_bis.f90 +++ /dev/null @@ -1,160 +0,0 @@ -!MNH_LIC Copyright 2012-2019 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ######spl - MODULE MODI_ICE_ADJUST_BIS -! ############################### -! -INTERFACE -! -! ################################################################# - SUBROUTINE ICE_ADJUST_BIS(PP,PTH,PR) -! ################################################################# -! -!! -!* 1.1 Declaration of Arguments -!! - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! Pressure -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTH ! thetal to transform into th -REAL, DIMENSION(:,:,:,:),INTENT(INOUT) :: PR ! Total mixing ratios to transform into rv,rc and ri -! -END SUBROUTINE ICE_ADJUST_BIS - -END INTERFACE -! -END MODULE MODI_ICE_ADJUST_BIS -! ######spl - SUBROUTINE ICE_ADJUST_BIS(PP,PTH,PR) -! ################################################################# -! -! -!!**** *ICE_ADJUST_BIS* - computes an adjusted state of thermodynamical variables -!! -!! PURPOSE -!! ------- -!! -!!** METHOD -!! ------ -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! Valery Masson & C. Lac * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 09/2012 -!! M.Moge 08/2015 UPDATE_HALO_ll on PTH, ZRV, ZRC, ZRI -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY : XCPD, XRD, XP00, CST -USE MODD_NEB_n, ONLY : NEBN -! -USE MODI_COMPUTE_FUNCTION_THERMO -USE MODI_THLRT_FROM_THRVRCRI -! -USE MODE_ll -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! Pressure -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTH ! thetal to transform into th -REAL, DIMENSION(:,:,:,:),INTENT(INOUT) :: PR ! Total mixing ratios to transform into rv,rc and ri -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZTHL, ZRW, ZRV, ZRC, & - ZRI, ZWORK -REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZFRAC_ICE, ZRSATW, ZRSATI -REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZT, ZEXN, ZLVOCPEXN,ZLSOCPEXN -REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3), 16) :: ZBUF -INTEGER :: IRR -CHARACTER(LEN=1) :: YFRAC_ICE -! -INTEGER :: IINFO_ll -TYPE(LIST_ll), POINTER :: TZFIELDS_ll=>NULL() ! list of fields to exchange -!---------------------------------------------------------------------------- -! -!* 1 Initialisation -! -------------- -! -IRR = SIZE(PR,4) -! -ZRV(:,:,:)=0. -IF (IRR>=1) & -ZRV(:,:,:)=PR(:,:,:,1) -ZRC(:,:,:)=0. -IF (IRR>=2) & -ZRC(:,:,:)=PR(:,:,:,2) -ZRI(:,:,:)=0. -IF (IRR>=4) & -ZRI(:,:,:)=PR(:,:,:,4) -! -YFRAC_ICE='T' -ZFRAC_ICE(:,:,:) = 0. -! -!* 2 Computation -! ----------- -! -ZEXN(:,:,:)=(PP(:,:,:)/XP00)**(XRD/XCPD) -! -CALL COMPUTE_FUNCTION_THERMO( IRR, & - PTH, PR, ZEXN, PP, & - ZT,ZLVOCPEXN,ZLSOCPEXN ) - -! -CALL THLRT_FROM_THRVRCRI( IRR, PTH, PR, ZLVOCPEXN, ZLSOCPEXN,& - ZTHL, ZRW ) -! -CALL TH_R_FROM_THL_RT(CST, NEBN, SIZE(ZFRAC_ICE), YFRAC_ICE,ZFRAC_ICE(:,:,:),PP(:,:,:), & - ZTHL(:,:,:), ZRW(:,:,:), PTH(:,:,:), & - ZRV(:,:,:), ZRC(:,:,:), ZRI(:,:,:), & - ZRSATW(:,:,:), ZRSATI(:,:,:),OOCEAN=.FALSE.,& - PBUF=ZBUF) -CALL ADD3DFIELD_ll( TZFIELDS_ll, PTH, 'ICE_ADJUST_BIS::PTH') -IF (IRR>=1) THEN - CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRV, 'ICE_ADJUST_BIS::ZRV' ) -ENDIF -IF (IRR>=2) THEN - CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRC, 'ICE_ADJUST_BIS::ZRC' ) -ENDIF -IF (IRR>=4) THEN - CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRI, 'ICE_ADJUST_BIS::ZRI' ) -ENDIF -CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) -CALL CLEANLIST_ll(TZFIELDS_ll) -! - -IF (IRR>=1) & -PR(:,:,:,1) = ZRV(:,:,:) -IF (IRR>=2) & -PR(:,:,:,2) = ZRC(:,:,:) -IF (IRR>=4) & -PR(:,:,:,4) = ZRI(:,:,:) -! -CONTAINS -INCLUDE "th_r_from_thl_rt.func.h" -INCLUDE "compute_frac_ice.func.h" -END SUBROUTINE ICE_ADJUST_BIS diff --git a/src/PHYEX/ext/ini_budget.f90 b/src/PHYEX/ext/ini_budget.f90 deleted file mode 100644 index 6e8895afc..000000000 --- a/src/PHYEX/ext/ini_budget.f90 +++ /dev/null @@ -1,4898 +0,0 @@ -!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! Modifications: -! P. Wautelet 17/08/2020: add Budget_preallocate subroutine -!----------------------------------------------------------------- -module mode_ini_budget - - use mode_msg - - implicit none - - private - - public :: Budget_preallocate, Ini_budget - - integer, parameter :: NSOURCESMAX = 60 !Maximum number of sources in a budget - -contains - -subroutine Budget_preallocate() - -use modd_budget, only: nbudgets, tbudgets, & - NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_TKE, & - NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, & - NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1 -use modd_nsv, only: nsv, tsvlist - -integer :: ibudget -integer :: jsv - -call Print_msg( NVERB_DEBUG, 'BUD', 'Budget_preallocate', 'called' ) - -if ( allocated( tbudgets ) ) then - call Print_msg( NVERB_WARNING, 'BUD', 'Budget_preallocate', 'tbudgets already allocated' ) - return -end if - -nbudgets = NBUDGET_SV1 - 1 + nsv -allocate( tbudgets( nbudgets ) ) - -tbudgets(NBUDGET_U)%cname = "UU" -tbudgets(NBUDGET_U)%ccomment = "Budget for U" -tbudgets(NBUDGET_U)%nid = NBUDGET_U - -tbudgets(NBUDGET_V)%cname = "VV" -tbudgets(NBUDGET_V)%ccomment = "Budget for V" -tbudgets(NBUDGET_V)%nid = NBUDGET_V - -tbudgets(NBUDGET_W)%cname = "WW" -tbudgets(NBUDGET_W)%ccomment = "Budget for W" -tbudgets(NBUDGET_W)%nid = NBUDGET_W - -tbudgets(NBUDGET_TH)%cname = "TH" -tbudgets(NBUDGET_TH)%ccomment = "Budget for potential temperature" -tbudgets(NBUDGET_TH)%nid = NBUDGET_TH - -tbudgets(NBUDGET_TKE)%cname = "TK" -tbudgets(NBUDGET_TKE)%ccomment = "Budget for turbulent kinetic energy" -tbudgets(NBUDGET_TKE)%nid = NBUDGET_TKE - -tbudgets(NBUDGET_RV)%cname = "RV" -tbudgets(NBUDGET_RV)%ccomment = "Budget for water vapor mixing ratio" -tbudgets(NBUDGET_RV)%nid = NBUDGET_RV - -tbudgets(NBUDGET_RC)%cname = "RC" -tbudgets(NBUDGET_RC)%ccomment = "Budget for cloud water mixing ratio" -tbudgets(NBUDGET_RC)%nid = NBUDGET_RC - -tbudgets(NBUDGET_RR)%cname = "RR" -tbudgets(NBUDGET_RR)%ccomment = "Budget for rain water mixing ratio" -tbudgets(NBUDGET_RR)%nid = NBUDGET_RR - -tbudgets(NBUDGET_RI)%cname = "RI" -tbudgets(NBUDGET_RI)%ccomment = "Budget for cloud ice mixing ratio" -tbudgets(NBUDGET_RI)%nid = NBUDGET_RI - -tbudgets(NBUDGET_RS)%cname = "RS" -tbudgets(NBUDGET_RS)%ccomment = "Budget for snow/aggregate mixing ratio" -tbudgets(NBUDGET_RS)%nid = NBUDGET_RS - -tbudgets(NBUDGET_RG)%cname = "RG" -tbudgets(NBUDGET_RG)%ccomment = "Budget for graupel mixing ratio" -tbudgets(NBUDGET_RG)%nid = NBUDGET_RG - -tbudgets(NBUDGET_RH)%cname = "RH" -tbudgets(NBUDGET_RH)%ccomment = "Budget for hail mixing ratio" -tbudgets(NBUDGET_RH)%nid = NBUDGET_RH - -do jsv = 1, nsv - ibudget = NBUDGET_SV1 - 1 + jsv - tbudgets(ibudget)%cname = Trim( tsvlist(jsv)%cmnhname ) - tbudgets(ibudget)%ccomment = 'Budget for scalar variable ' // Trim( tsvlist(jsv)%cmnhname ) - tbudgets(ibudget)%nid = ibudget -end do - - -end subroutine Budget_preallocate - - -! ################################################################# - SUBROUTINE Ini_budget(KLUOUT,PTSTEP,KSV,KRR, & - ONUMDIFU,ONUMDIFTH,ONUMDIFSV, & - OHORELAX_UVWTH,OHORELAX_RV,OHORELAX_RC,OHORELAX_RR, & - OHORELAX_RI,OHORELAX_RS, OHORELAX_RG, OHORELAX_RH,OHORELAX_TKE, & - OHORELAX_SV, OVE_RELAX, ove_relax_grd, OCHTRANS, & - ONUDGING,ODRAGTREE,ODEPOTREE, ODRAGBLDG, OAERO_EOL, & - HRAD,HDCONV,HSCONV,HTURB,HTURBDIM,HCLOUD ) -! ################################################################# -! -!!**** *INI_BUDGET* - routine to initialize the parameters for the budgets -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to set or compute the parameters used -! by the MESONH budgets. Names of files for budget recording are processed -! and storage arrays are initialized. -! -!!** METHOD -!! ------ -!! The essential of information is passed by modules. The choice of budgets -!! and processes set by the user as integers is converted in "actions" -!! readable by the subroutine BUDGET under the form of string characters. -!! For each complete process composed of several elementary processes, names -!! of elementary processes are concatenated in order to have an explicit name -!! in the comment of the recording file for budget. -!! -!! -!! EXTERNAL -!! -------- -!! None -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Modules MODD_* -!! -!! REFERENCE -!! --------- -!! Book2 of documentation (routine INI_BUDGET) -!! -!! -!! AUTHOR -!! ------ -!! P. Hereil * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 01/03/95 -!! J. Stein 25/06/95 put the sources in phase with the code -!! J. Stein 20/07/95 reset to FALSE of all the switches when -!! CBUTYPE /= MASK or CART -!! J. Stein 26/06/96 add the new sources + add the increment between -!! 2 active processes -!! J.-P. Pinty 13/12/96 Allowance of multiple SVs -!! J.-P. Pinty 11/01/97 Includes deep convection ice and forcing processes -!! J.-P. Lafore 10/02/98 Allocation of the RHODJs for budget -!! V. Ducrocq 04/06/99 // -!! N. Asencio 18/06/99 // MASK case : delete KIMAX and KJMAX arguments, -!! GET_DIM_EXT_ll initializes the dimensions of the -!! extended local domain. -!! LBU_MASK and NBUSURF are allocated on the extended -!! local domain. -!! add 3 local variables IBUDIM1,IBUDIM2,IBUDIM3 -!! to define the dimensions of the budget arrays -!! in the different cases CART and MASK -!! J.-P. Pinty 23/09/00 add budget for C2R2 -!! V. Masson 18/11/02 add budget for 2way nesting -!! O.Geoffroy 03/2006 Add KHKO scheme -!! J.-P. Pinty 22/04/97 add the explicit hail processes -!! C.Lac 10/08/07 Add ADV for PPM without contribution -!! of each direction -!! C. Barthe 19/11/09 Add atmospheric electricity -!! C.Lac 01/07/11 Add vegetation drag -!! P. Peyrille, M. Tomasini : include in the forcing term the 2D forcing -!! terms in term 2DFRC search for modif PP . but Not very clean! -!! C .Lac 27/05/14 add negativity corrections for chemical species -!! C.Lac 29/01/15 Correction for NSV_USER -!! J.Escobar 02/10/2015 modif for JPHEXT(JPVEXT) variable -!! C.Lac 04/12/15 Correction for LSUPSAT -! C. Lac 04/2016: negative contribution to the budget split between advection, turbulence and microphysics for KHKO/C2R2 -! C. Barthe 01/2016: add budget for LIMA -! C. Lac 10/2016: add budget for droplet deposition -! S. Riette 11/2016: new budgets for ICE3/ICE4 -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 15/11/2019: remove unused CBURECORD variable -! P. Wautelet 24/02/2020: bugfix: corrected condition for budget NCDEPITH -! P. Wautelet 26/02/2020: bugfix: rename CEVA->REVA for budget for raindrop evaporation in C2R2 (necessary after commit 4ed805fc) -! P. Wautelet 26/02/2020: bugfix: add missing condition on OCOLD for NSEDIRH budget in LIMA case -! P. Wautelet 02-03/2020: use the new data structures and subroutines for budgets -! B. Vie 02/03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets -! P .Wautelet 09/03/2020: add missing budgets for electricity -! P. Wautelet 25/03/2020: add missing ove_relax_grd -! P. Wautelet 23/04/2020: add nid in tbudgetdata datatype -! P. Wautelet + Benoit Vié 11/06/2020: improve removal of negative scalar variables + adapt the corresponding budgets -! P. Wautelet 30/06/2020: use NADVSV when possible -! P. Wautelet 30/06/2020: add NNETURSV, NNEADVSV and NNECONSV variables -! P. Wautelet 06/07/2020: bugfix: add condition on HTURB for NETUR sources for SV budgets -! P. Wautelet 08/12/2020: add nbusubwrite and nbutotwrite -! P. Wautelet 11/01/2021: ignore xbuwri for cartesian boxes (write at every xbulen interval) -! P. Wautelet 01/02/2021: bugfix: add missing CEDS source terms for SV budgets -! P. Wautelet 02/02/2021: budgets: add missing source terms for SV budgets in LIMA -! P. Wautelet 03/02/2021: budgets: add new source if LIMA splitting: CORR2 -! P. Wautelet 10/02/2021: budgets: add missing sources for NSV_C2R2BEG+3 budget -! P. Wautelet 11/02/2021: budgets: add missing term SCAV for NSV_LIMA_SCAVMASS budget -! P. Wautelet 02/03/2021: budgets: add terms for blowing snow -! P. Wautelet 04/03/2021: budgets: add terms for drag due to buildings -! P. Wautelet 17/03/2021: choose source terms for budgets with character strings instead of multiple integer variables -! R. Schoetter 12/2021 multi-level coupling between MesoNH and SURFEX -! C. Barthe 14/03/2022: budgets: add terms for CIBU and RDSF in LIMA -! M. Taufour 01/07/2022: budgets: add concentration for snow, graupel, hail -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -use modd_2d_frc, only: l2d_adv_frc, l2d_rel_frc -use modd_blowsnow, only: lblowsnow -use modd_blowsnow_n, only: lsnowsubl -use modd_budget -use modd_ch_aerosol, only: lorilam -use modd_conf, only: l1d, lcartesian, lforcing, lthinshell, nmodel -use modd_dim_n, only: nimax_ll, njmax_ll, nkmax -use modd_dragbldg_n, only: ldragbldg -use modd_dust, only: ldust -use modd_dyn, only: lcorio, xseglen -use modd_dyn_n, only: xtstep, locean -use modd_elec_descr, only: linductive, lrelax2fw_ion -use modd_field, only: TYPEREAL -use modd_fire_n, only: lblaze -use modd_nsv, only: nsv_aerbeg, nsv_aerend, nsv_aerdepbeg, nsv_aerdepend, nsv_c2r2beg, nsv_c2r2end, & - nsv_chembeg, nsv_chemend, nsv_chicbeg, nsv_chicend, nsv_csbeg, nsv_csend, & - nsv_dstbeg, nsv_dstend, nsv_dstdepbeg, nsv_dstdepend, nsv_elecbeg, nsv_elecend, & -#ifdef MNH_FOREFIRE - nsv_ffbeg, nsv_ffend, & -#endif - nsv_lgbeg, nsv_lgend, & - nsv_lima_beg, nsv_lima_end, nsv_lima_ccn_acti, nsv_lima_ccn_free, nsv_lima_hom_haze, & - nsv_lima_ifn_free, nsv_lima_ifn_nucl, nsv_lima_imm_nucl, & - nsv_lima_nc, nsv_lima_nr, nsv_lima_ni, nsv_lima_ns, nsv_lima_ng, nsv_lima_nh, & - nsv_lima_scavmass, nsv_lima_spro, & - nsv_lnoxbeg, nsv_lnoxend, nsv_ppbeg, nsv_ppend, & - nsv_sltbeg, nsv_sltend, nsv_sltdepbeg, nsv_sltdepend, nsv_snwbeg, nsv_snwend, & - nsv_user, tsvlist -use modd_parameters, only: jphext -use modd_param_c2r2, only: ldepoc_c2r2 => ldepoc, lrain_c2r2 => lrain, lsedc_c2r2 => lsedc, lsupsat_c2r2 => lsupsat -use modd_param_ice_n, only: ladj_after, ladj_before, ldeposc_ice => ldeposc, lred, lsedic_ice => lsedic, lwarm_ice => lwarm -use modd_param_n, only: cactccn, celec -use modd_param_lima, only: laero_mass_lima => laero_mass, lacti_lima => lacti, ldepoc_lima => ldepoc, & - lhhoni_lima => lhhoni, lmeyers_lima => lmeyers, lnucl_lima => lnucl, & - lptsplit, & - lscav_lima => lscav, lsedc_lima => lsedc, lsedi_lima => lsedi, & - lspro_lima => lspro, lcibu, lrdsf, & - nmom_c, nmom_r, nmom_i, nmom_s, nmom_g, nmom_h, nmod_ccn, nmod_ifn, nmod_imm -use modd_ref, only: lcouples -use modd_salt, only: lsalt -use modd_neb_n, only: lsubg_cond -use modd_viscosity, only: lvisc, lvisc_r, lvisc_sv, lvisc_th, lvisc_uvw - -USE MODE_ll - -IMPLICIT NONE -! -!* 0.1 declarations of argument -! -! -INTEGER, INTENT(IN) :: KLUOUT ! Logical unit number for prints -REAL, INTENT(IN) :: PTSTEP ! time step -INTEGER, INTENT(IN) :: KSV ! number of scalar variables -INTEGER, INTENT(IN) :: KRR ! number of moist variables -LOGICAL, INTENT(IN) :: ONUMDIFU ! switch to activate the numerical - ! diffusion for momentum -LOGICAL, INTENT(IN) :: ONUMDIFTH ! for meteorological scalar variables -LOGICAL, INTENT(IN) :: ONUMDIFSV ! for tracer scalar variables -LOGICAL, INTENT(IN) :: OHORELAX_UVWTH ! switch for the - ! horizontal relaxation for U,V,W,TH -LOGICAL, INTENT(IN) :: OHORELAX_RV ! switch for the - ! horizontal relaxation for Rv -LOGICAL, INTENT(IN) :: OHORELAX_RC ! switch for the - ! horizontal relaxation for Rc -LOGICAL, INTENT(IN) :: OHORELAX_RR ! switch for the - ! horizontal relaxation for Rr -LOGICAL, INTENT(IN) :: OHORELAX_RI ! switch for the - ! horizontal relaxation for Ri -LOGICAL, INTENT(IN) :: OHORELAX_RS ! switch for the - ! horizontal relaxation for Rs -LOGICAL, INTENT(IN) :: OHORELAX_RG ! switch for the - ! horizontal relaxation for Rg -LOGICAL, INTENT(IN) :: OHORELAX_RH ! switch for the - ! horizontal relaxation for Rh -LOGICAL, INTENT(IN) :: OHORELAX_TKE ! switch for the - ! horizontal relaxation for tke -LOGICAL,DIMENSION(:),INTENT(IN):: OHORELAX_SV ! switch for the - ! horizontal relaxation for scalar variables -LOGICAL, INTENT(IN) :: OVE_RELAX ! switch to activate the vertical - ! relaxation -logical, intent(in) :: ove_relax_grd ! switch to activate the vertical - ! relaxation to the lowest verticals -LOGICAL, INTENT(IN) :: OCHTRANS ! switch to activate convective - !transport for SV -LOGICAL, INTENT(IN) :: ONUDGING ! switch to activate nudging -LOGICAL, INTENT(IN) :: ODRAGTREE ! switch to activate vegetation drag -LOGICAL, INTENT(IN) :: ODEPOTREE ! switch to activate droplet deposition on tree -LOGICAL, INTENT(IN) :: ODRAGBLDG ! switch to activate building drag -LOGICAL, INTENT(IN) :: OAERO_EOL ! switch to activate wind turbine wake -CHARACTER (LEN=*), INTENT(IN) :: HRAD ! type of the radiation scheme -CHARACTER (LEN=*), INTENT(IN) :: HDCONV ! type of the deep convection scheme -CHARACTER (LEN=*), INTENT(IN) :: HSCONV ! type of the shallow convection scheme -CHARACTER (LEN=*), INTENT(IN) :: HTURB ! type of the turbulence scheme -CHARACTER (LEN=*), INTENT(IN) :: HTURBDIM! dimensionnality of the turbulence - ! scheme -CHARACTER (LEN=*), INTENT(IN) :: HCLOUD ! type of microphysical scheme -! -!* 0.2 declarations of local variables -! -real, parameter :: ITOL = 1e-6 - -INTEGER :: JI, JJ ! loop indices -INTEGER :: IIMAX_ll, IJMAX_ll ! size of the physical global domain -INTEGER :: IIU, IJU ! size along x and y directions - ! of the extended subdomain -INTEGER :: IBUDIM1 ! first dimension of the budget arrays - ! = NBUIMAX in CART case - ! = NBUKMAX in MASK case -INTEGER :: IBUDIM2 ! second dimension of the budget arrays - ! = NBUJMAX in CART case - ! = nbusubwrite in MASK case -INTEGER :: IBUDIM3 ! third dimension of the budget arrays - ! = NBUKMAX in CART case - ! = NBUMASK in MASK case -INTEGER :: JSV ! loop indice for the SVs -INTEGER :: IINFO_ll ! return status of the interface routine -integer :: ibudget -logical :: gtmp -type(tbusourcedata) :: tzsource ! Used to prepare metadate of source terms - -call Print_msg( NVERB_DEBUG, 'BUD', 'Ini_budget', 'called' ) -! -!* 1. COMPUTE BUDGET VARIABLES -! ------------------------ -! -NBUSTEP = NINT (XBULEN / PTSTEP) -NBUTSHIFT=0 -! -! common dimension for all CBUTYPE values -! -IF (LBU_KCP) THEN - NBUKMAX = 1 -ELSE - NBUKMAX = NBUKH - NBUKL +1 -END IF -! -if ( cbutype == 'CART' .or. cbutype == 'MASK' ) then - !Check if xbulen is a multiple of xtstep (within tolerance) - if ( Abs( Nint( xbulen / xtstep ) * xtstep - xbulen ) > ( ITOL * xtstep ) ) & - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xbulen is not a multiple of xtstep' ) - - if ( cbutype == 'CART' ) then - !Check if xseglen is a multiple of xbulen (within tolerance) - if ( Abs( Nint( xseglen / xbulen ) * xbulen - xseglen ) > ( ITOL * xseglen ) ) & - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xseglen is not a multiple of xbulen' ) - - !Write cartesian budgets every xbulen time period (do not take xbuwri into account) - xbuwri = xbulen - - nbusubwrite = 1 !Number of budget time average periods for each write - nbutotwrite = nbusubwrite * Nint( xseglen / xbulen ) !Total number of budget time average periods - else if ( cbutype == 'MASK' ) then - !Check if xbuwri is a multiple of xtstep (within tolerance) - if ( Abs( Nint( xbuwri / xtstep ) * xtstep - xbuwri ) > ( ITOL * xtstep ) ) & - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xbuwri is not a multiple of xtstep' ) - - !Check if xbuwri is a multiple of xbulen (within tolerance) - if ( Abs( Nint( xbuwri / xbulen ) * xbulen - xbuwri ) > ( ITOL * xbulen ) ) & - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xbuwri is not a multiple of xbulen' ) - - !Check if xseglen is a multiple of xbuwri (within tolerance) - if ( Abs( Nint( xseglen / xbuwri ) * xbuwri - xseglen ) > ( ITOL * xseglen ) ) & - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xseglen is not a multiple of xbuwri' ) - - nbusubwrite = Nint ( xbuwri / xbulen ) !Number of budget time average periods for each write - nbutotwrite = nbusubwrite * Nint( xseglen / xbuwri ) !Total number of budget time average periods - end if -end if - -IF (CBUTYPE=='CART') THEN ! cartesian case only -! - IF ( NBUIL < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIL too small (<1)' ) - IF ( NBUIL > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIL too large (>NIMAX)' ) - IF ( NBUIH < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH too small (<1)' ) - IF ( NBUIH > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH too large (>NIMAX)' ) - IF ( NBUIH < NBUIL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH < NBUIL' ) - IF (LBU_ICP) THEN - NBUIMAX_ll = 1 - ELSE - NBUIMAX_ll = NBUIH - NBUIL +1 - END IF - - IF ( NBUJL < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJL too small (<1)' ) - IF ( NBUJL > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJL too large (>NJMAX)' ) - IF ( NBUJH < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH too small (<1)' ) - IF ( NBUJH > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH too large (>NJMAX)' ) - IF ( NBUJH < NBUJL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH < NBUJL' ) - IF (LBU_JCP) THEN - NBUJMAX_ll = 1 - ELSE - NBUJMAX_ll = NBUJH - NBUJL +1 - END IF - - IF ( NBUKL < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKL too small (<1)' ) - IF ( NBUKL > NKMAX ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKL too large (>NKMAX)' ) - IF ( NBUKH < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH too small (<1)' ) - IF ( NBUKH > NKMAX ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH too large (>NKMAX)' ) - IF ( NBUKH < NBUKL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH < NBUKL' ) - - CALL GET_INTERSECTION_ll(NBUIL+JPHEXT,NBUJL+JPHEXT,NBUIH+JPHEXT,NBUJH+JPHEXT, & - NBUSIL,NBUSJL,NBUSIH,NBUSJH,"PHYS",IINFO_ll) - IF ( IINFO_ll /= 1 ) THEN ! - IF (LBU_ICP) THEN - NBUIMAX = 1 - ELSE - NBUIMAX = NBUSIH - NBUSIL +1 - END IF - IF (LBU_JCP) THEN - NBUJMAX = 1 - ELSE - NBUJMAX = NBUSJH - NBUSJL +1 - END IF - ELSE ! the intersection is void - CBUTYPE='SKIP' ! no budget on this processor - NBUIMAX = 0 ! in order to allocate void arrays - NBUJMAX = 0 - ENDIF -! three first dimensions of budget arrays in cart and skip cases - IBUDIM1=NBUIMAX - IBUDIM2=NBUJMAX - IBUDIM3=NBUKMAX -! these variables are not be used - NBUMASK=-1 -! -ELSEIF (CBUTYPE=='MASK') THEN ! mask case only -! - LBU_ENABLE=.TRUE. - ! result on the FM_FILE - NBUTIME = 1 - - CALL GET_DIM_EXT_ll ('B', IIU,IJU) - ALLOCATE( LBU_MASK( IIU ,IJU, NBUMASK) ) - LBU_MASK(:,:,:)=.FALSE. - ALLOCATE( NBUSURF( IIU, IJU, NBUMASK, nbusubwrite) ) - NBUSURF(:,:,:,:) = 0 -! -! three first dimensions of budget arrays in mask case -! the order of the dimensions are the order expected in WRITE_DIACHRO routine: -! x,y,z,time,mask,processus and in this case x and y are missing -! first dimension of the arrays : dimension along K -! second dimension of the arrays : number of the budget time period -! third dimension of the arrays : number of the budget masks zones - IBUDIM1=NBUKMAX - IBUDIM2=nbusubwrite - IBUDIM3=NBUMASK -! these variables are not used in this case - NBUIMAX=-1 - NBUJMAX=-1 -! the beginning and the end along x and y direction : global extended domain - ! get dimensions of the physical global domain - CALL GET_GLOBALDIMS_ll (IIMAX_ll,IJMAX_ll) - NBUIL=1 - NBUIH=IIMAX_ll + 2 * JPHEXT - NBUJL=1 - NBUJH=IJMAX_ll + 2 * JPHEXT -! -ELSE ! default case -! - LBU_ENABLE=.FALSE. - NBUIMAX = -1 - NBUJMAX = -1 - LBU_RU = .FALSE. - LBU_RV = .FALSE. - LBU_RW = .FALSE. - LBU_RTH= .FALSE. - LBU_RTKE= .FALSE. - LBU_RRV= .FALSE. - LBU_RRC= .FALSE. - LBU_RRR= .FALSE. - LBU_RRI= .FALSE. - LBU_RRS= .FALSE. - LBU_RRG= .FALSE. - LBU_RRH= .FALSE. - LBU_RSV= .FALSE. -! -! three first dimensions of budget arrays in default case - IBUDIM1=0 - IBUDIM2=0 - IBUDIM3=0 -! -END IF -! -! -!------------------------------------------------------------------------------- -! -!* 2. ALLOCATE MEMORY FOR BUDGET ARRAYS AND INITIALIZE -! ------------------------------------------------ -! -LBU_BEG =.TRUE. -! -!------------------------------------------------------------------------------- -! -!* 3. INITALIZE VARIABLES -! ------------------- -! -!Create intermediate variable to store rhodj for scalar variables -if ( lbu_rth .or. lbu_rtke .or. lbu_rrv .or. lbu_rrc .or. lbu_rrr .or. & - lbu_rri .or. lbu_rrs .or. lbu_rrg .or. lbu_rrh .or. lbu_rsv ) then - allocate( tburhodj ) - - tburhodj%cmnhname = 'RhodJS' - tburhodj%cstdname = '' - tburhodj%clongname = 'RhodJS' - tburhodj%cunits = 'kg' - tburhodj%ccomment = 'RhodJ for Scalars variables' - tburhodj%ngrid = 1 - tburhodj%ntype = TYPEREAL - tburhodj%ndims = 3 - - allocate( tburhodj%xdata(ibudim1, ibudim2, ibudim3) ) - tburhodj%xdata(:, :, :) = 0. -end if - - -tzsource%ntype = TYPEREAL -tzsource%ndims = 3 - -! Budget of RU -tbudgets(NBUDGET_U)%lenabled = lbu_ru - -if ( lbu_ru ) then - allocate( tbudgets(NBUDGET_U)%trhodj ) - - tbudgets(NBUDGET_U)%trhodj%cmnhname = 'RhodJX' - tbudgets(NBUDGET_U)%trhodj%cstdname = '' - tbudgets(NBUDGET_U)%trhodj%clongname = 'RhodJX' - tbudgets(NBUDGET_U)%trhodj%cunits = 'kg' - tbudgets(NBUDGET_U)%trhodj%ccomment = 'RhodJ for momentum along X axis' - tbudgets(NBUDGET_U)%trhodj%ngrid = 2 - tbudgets(NBUDGET_U)%trhodj%ntype = TYPEREAL - tbudgets(NBUDGET_U)%trhodj%ndims = 3 - - allocate( tbudgets(NBUDGET_U)%trhodj%xdata(ibudim1, ibudim2, ibudim3) ) - tbudgets(NBUDGET_U)%trhodj%xdata(:, :, :) = 0. - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_U)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_U)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_U)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_U)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of momentum along X axis' - tzsource%ngrid = 2 - - tzsource%cunits = 'm s-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_U), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_U), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_U), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 'm s-2' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'NUD' - tzsource%clongname = 'nudging' - tzsource%lavailable = onudging - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'CURV' - tzsource%clongname = 'curvature' - tzsource%lavailable = .not.l1d .and. .not.lcartesian - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'COR' - tzsource%clongname = 'Coriolis' - tzsource%lavailable = lcorio - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifu - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'DRAG' - tzsource%clongname = 'drag force due to trees' - tzsource%lavailable = odragtree - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'DRAGEOL' - tzsource%clongname = 'drag force due to wind turbine' - tzsource%lavailable = OAERO_EOL - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'DRAGB' - tzsource%clongname = 'drag force due to buildings' - tzsource%lavailable = ldragbldg - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'MAFL' - tzsource%clongname = 'mass flux' - tzsource%lavailable = hsconv == 'EDKF' - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_uvw - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - tzsource%cmnhname = 'PRES' - tzsource%clongname = 'pressure' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_U), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_U) ) - - call Sourcelist_scan( tbudgets(NBUDGET_U), cbulist_ru ) -end if - -! Budget of RV -tbudgets(NBUDGET_V)%lenabled = lbu_rv - -if ( lbu_rv ) then - allocate( tbudgets(NBUDGET_V)%trhodj ) - - tbudgets(NBUDGET_V)%trhodj%cmnhname = 'RhodJY' - tbudgets(NBUDGET_V)%trhodj%cstdname = '' - tbudgets(NBUDGET_V)%trhodj%clongname = 'RhodJY' - tbudgets(NBUDGET_V)%trhodj%cunits = 'kg' - tbudgets(NBUDGET_V)%trhodj%ccomment = 'RhodJ for momentum along Y axis' - tbudgets(NBUDGET_V)%trhodj%ngrid = 3 - tbudgets(NBUDGET_V)%trhodj%ntype = TYPEREAL - tbudgets(NBUDGET_V)%trhodj%ndims = 3 - - allocate( tbudgets(NBUDGET_V)%trhodj%xdata(ibudim1, ibudim2, ibudim3) ) - tbudgets(NBUDGET_V)%trhodj%xdata(:, :, :) = 0. - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_V)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_V)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_V)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_V)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of momentum along Y axis' - tzsource%ngrid = 3 - - tzsource%cunits = 'm s-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_V), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_V), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_V), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 'm s-2' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'NUD' - tzsource%clongname = 'nudging' - tzsource%lavailable = onudging - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'CURV' - tzsource%clongname = 'curvature' - tzsource%lavailable = .not.l1d .and. .not.lcartesian - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'COR' - tzsource%clongname = 'Coriolis' - tzsource%lavailable = lcorio - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifu - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'DRAG' - tzsource%clongname = 'drag force due to trees' - tzsource%lavailable = odragtree - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'DRAGEOL' - tzsource%clongname = 'drag force due to wind turbine' - tzsource%lavailable = OAERO_EOL - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'DRAGB' - tzsource%clongname = 'drag force due to buildings' - tzsource%lavailable = ldragbldg - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'MAFL' - tzsource%clongname = 'mass flux' - tzsource%lavailable = hsconv == 'EDKF' - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_uvw - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - tzsource%cmnhname = 'PRES' - tzsource%clongname = 'pressure' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_V), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_V) ) - - call Sourcelist_scan( tbudgets(NBUDGET_V), cbulist_rv ) -end if - -! Budget of RW -tbudgets(NBUDGET_W)%lenabled = lbu_rw - -if ( lbu_rw ) then - allocate( tbudgets(NBUDGET_W)%trhodj ) - - tbudgets(NBUDGET_W)%trhodj%cmnhname = 'RhodJZ' - tbudgets(NBUDGET_W)%trhodj%cstdname = '' - tbudgets(NBUDGET_W)%trhodj%clongname = 'RhodJZ' - tbudgets(NBUDGET_W)%trhodj%cunits = 'kg' - tbudgets(NBUDGET_W)%trhodj%ccomment = 'RhodJ for momentum along Z axis' - tbudgets(NBUDGET_W)%trhodj%ngrid = 4 - tbudgets(NBUDGET_W)%trhodj%ntype = TYPEREAL - tbudgets(NBUDGET_W)%trhodj%ndims = 3 - - allocate( tbudgets(NBUDGET_W)%trhodj%xdata(ibudim1, ibudim2, ibudim3) ) - tbudgets(NBUDGET_W)%trhodj%xdata(:, :, :) = 0. - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_W)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_W)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_W)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_W)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of momentum along Z axis' - tzsource%ngrid = 4 - - tzsource%cunits = 'm s-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_W), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_W), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_W), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 'm s-2' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'NUD' - tzsource%clongname = 'nudging' - tzsource%lavailable = onudging - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'CURV' - tzsource%clongname = 'curvature' - tzsource%lavailable = .not.l1d .and. .not.lcartesian .and. .not.lthinshell - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'COR' - tzsource%clongname = 'Coriolis' - tzsource%lavailable = lcorio .and. .not.l1d .and. .not.lthinshell - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifu - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_uvw - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'GRAV' - tzsource%clongname = 'gravity' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'PRES' - tzsource%clongname = 'pressure' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - tzsource%cmnhname = 'DRAGEOL' - tzsource%clongname = 'drag force due to wind turbine' - tzsource%lavailable = OAERO_EOL - call Budget_source_add( tbudgets(NBUDGET_W), tzsource ) - - call Sourcelist_sort_compact( tbudgets(NBUDGET_W) ) - - call Sourcelist_scan( tbudgets(NBUDGET_W), cbulist_rw ) -end if - -! Budget of RTH -tbudgets(NBUDGET_TH)%lenabled = lbu_rth - -if ( lbu_rth ) then - tbudgets(NBUDGET_TH)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_TH)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_TH)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_TH)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_TH)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of potential temperature' - tzsource%ngrid = 1 - - tzsource%cunits = 'K' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 'K s-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = '2DADV' - tzsource%clongname = 'advective forcing' - tzsource%lavailable = l2d_adv_frc - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = '2DREL' - tzsource%clongname = 'relaxation forcing' - tzsource%lavailable = l2d_rel_frc - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'NUD' - tzsource%clongname = 'nudging' - tzsource%lavailable = onudging - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'PREF' - tzsource%clongname = 'reference pressure' - tzsource%lavailable = krr > 0 .and. .not.l1d - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'RAD' - tzsource%clongname = 'radiation' - tzsource%lavailable = hrad /= 'NONE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DCONV' - tzsource%clongname = 'KAFR convection' - tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR' - - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'BLAZE' - tzsource%clongname = 'blaze fire model contribution' - tzsource%lavailable = lblaze - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DRAGB' - tzsource%clongname = 'heat released by buildings' - tzsource%lavailable = ldragbldg - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DISSH' - tzsource%clongname = 'dissipation' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'NETUR' - tzsource%clongname = 'negativity correction induced by turbulence' - tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'MAFL' - tzsource%clongname = 'mass flux' - tzsource%lavailable = hsconv == 'EDKF' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'SNSUB' - tzsource%clongname = 'blowing snow sublimation' - tzsource%lavailable = lblowsnow .and. lsnowsubl - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_th - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'OCEAN' - tzsource%clongname = 'radiative tendency due to SW penetrating ocean' - tzsource%lavailable = locean .and. (.not. lcouples) - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'heat transport by hydrometeors sedimentation' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'heterogeneous nucleation' - gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt ) - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1 & - .and. ( .not.lptsplit .or. .not.lsubg_cond ) ) & - .or. ( hcloud == 'C2R2' .and. ( gtmp .or. .not.lsupsat_c2r2 ) ) & - .or. ( hcloud == 'KHKO' .and. ( gtmp .or. .not.lsupsat_c2r2 ) ) - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( ( .not. lptsplit .and. nmom_r.ge.1 ) .or. lptsplit ) ) & - .or. ( hcloud(1:3) == 'ICE' .and. lwarm_ice ) & - .or. ( hcloud == 'C2R2' .and. lrain_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lrain_c2r2 ) & - .or. hcloud == 'KESS' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HIN' - tzsource%clongname = 'heterogeneous ice nucleation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .or. (hcloud == 'LIMA' .and. nmom_i == 1) - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HIND' - tzsource%clongname = 'heterogeneous nucleation by deposition' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HON' - tzsource%clongname = 'homogeneous nucleation' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HONH' - tzsource%clongname = 'haze homogeneous nucleation' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1 - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HONC' - tzsource%clongname = 'droplet homogeneous freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. lnucl_lima ) ) - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HONR' - tzsource%clongname = 'raindrop homogeneous freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. lnucl_lima .and. nmom_r.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'SFR' - tzsource%clongname = 'spontaneous freezing' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DEPS' - tzsource%clongname = 'deposition on snow' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DEPG' - tzsource%clongname = 'deposition on graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DEPH' - tzsource%clongname = 'deposition on hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. nmom_h.ge.1 ) ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'BERFI' - tzsource%clongname = 'Bergeron-Findeisen' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on aggregates' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit & - .or. ( nmom_s.ge.1 .and. nmom_r.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'GMLT' - tzsource%clongname = 'graupel melting' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DRYH' - tzsource%clongname = 'dry growth of hail' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'HMLT' - tzsource%clongname = 'melting of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'ADJU' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'deposition on ice' - tzsource%lavailable = ( hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE') ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'COND' - tzsource%clongname = 'vapor condensation or cloud water evaporation' - tzsource%lavailable = hcloud == 'C2R2' .or. hcloud == 'KHKO' .or. hcloud == 'KESS' .or. hcloud == 'REVE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_TH) ) - - call Sourcelist_scan( tbudgets(NBUDGET_TH), cbulist_rth ) -end if - -! Budget of RTKE -tbudgets(NBUDGET_TKE)%lenabled = lbu_rtke - -if ( lbu_rtke ) then - tbudgets(NBUDGET_TKE)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_TKE)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_TKE)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_TKE)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_TKE)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of turbulent kinetic energy' - tzsource%ngrid = 1 - - tzsource%cunits = 'm2 s-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 'm2 s-3' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_tke - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'DRAG' - tzsource%clongname = 'drag force' - tzsource%lavailable = odragtree - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'DRAGB' - tzsource%clongname = 'drag force due to buildings' - tzsource%lavailable = ldragbldg - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'DP' - tzsource%clongname = 'dynamic production' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'TP' - tzsource%clongname = 'thermal production' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'DISS' - tzsource%clongname = 'dissipation of TKE' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'TR' - tzsource%clongname = 'turbulent transport' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_TKE) ) - - call Sourcelist_scan( tbudgets(NBUDGET_TKE), cbulist_rtke ) -end if - -! Budget of RRV -tbudgets(NBUDGET_RV)%lenabled = lbu_rrv .and. krr >= 1 - -if ( tbudgets(NBUDGET_RV)%lenabled ) then - tbudgets(NBUDGET_RV)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_RV)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_RV)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_RV)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_RV)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of water vapor mixing ratio' - tzsource%ngrid = 1 - - tzsource%cunits = 'kg kg-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = '2DADV' - tzsource%clongname = 'advective forcing' - tzsource%lavailable = l2d_adv_frc - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = '2DREL' - tzsource%clongname = 'relaxation forcing' - tzsource%lavailable = l2d_rel_frc - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'NUD' - tzsource%clongname = 'nudging' - tzsource%lavailable = onudging - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_rv - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'DCONV' - tzsource%clongname = 'KAFR convection' - tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'DRAGB' - tzsource%clongname = 'vapor released by buildings' - tzsource%lavailable = ldragbldg - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'BLAZE' - tzsource%clongname = 'blaze fire model contribution' - tzsource%lavailable = lblaze - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'NETUR' - tzsource%clongname = 'negativity correction induced by turbulence' - tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'MAFL' - tzsource%clongname = 'mass flux' - tzsource%lavailable = hsconv == 'EDKF' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'SNSUB' - tzsource%clongname = 'blowing snow sublimation' - tzsource%lavailable = lblowsnow .and. lsnowsubl - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_r - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'heterogeneous nucleation' - gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt ) - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1 & - .and. ( .not.lptsplit .or. .not.lsubg_cond ) ) & - .or. ( hcloud == 'C2R2' .and. ( gtmp .or. .not.lsupsat_c2r2 ) ) & - .or. ( hcloud == 'KHKO' .and. ( gtmp .or. .not.lsupsat_c2r2 ) ) - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( ( .not. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 ) & - .or. lptsplit ) ) & - .or. ( hcloud(1:3) == 'ICE' .and. lwarm_ice ) & - .or. ( hcloud == 'C2R2' .and. lrain_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lrain_c2r2 ) & - .or. hcloud == 'KESS' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'HIN' - tzsource%clongname = 'heterogeneous ice nucleation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .or. ( hcloud == 'LIMA' .and. nmom_i == 1 ) - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'HIND' - tzsource%clongname = 'heterogeneous nucleation by deposition' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'HONH' - tzsource%clongname = 'haze homogeneous nucleation' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1 - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'DEPS' - tzsource%clongname = 'deposition on snow' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'DEPG' - tzsource%clongname = 'deposition on graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'DEPH' - tzsource%clongname = 'deposition on HAIL' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. nmom_h.ge.1 ) & - .or. hcloud == 'ICE4' ) - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'ADJU' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'COND' - tzsource%clongname = 'vapor condensation or cloud water evaporation' - tzsource%lavailable = hcloud == 'C2R2' .or. hcloud == 'KHKO' .or. hcloud == 'KESS' .or. hcloud == 'REVE' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'deposition on ice' - tzsource%lavailable = ( hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE') ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'CORR2' - tzsource%clongname = 'supplementary correction inside LIMA splitting' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_RV) ) - - call Sourcelist_scan( tbudgets(NBUDGET_RV), cbulist_rrv ) -end if - -! Budget of RRC -tbudgets(NBUDGET_RC)%lenabled = lbu_rrc .and. krr >= 2 - -if ( tbudgets(NBUDGET_RC)%lenabled ) then - if ( hcloud(1:3) == 'ICE' .and. lred .and. lsedic_ice .and. ldeposc_ice ) & - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'lred=T + lsedic=T + ldeposc=T:'// & - 'DEPO and SEDI source terms are mixed and stored in SEDI' ) - - tbudgets(NBUDGET_RC)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_RC)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_RC)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_RC)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_RC)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of cloud water mixing ratio' - tzsource%ngrid = 1 - - tzsource%cunits = 'kg kg-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_rc - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'DCONV' - tzsource%clongname = 'KAFR convection' - tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'DEPOTR' - tzsource%clongname = 'tree droplet deposition' - tzsource%lavailable = odragtree .and. odepotree - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'NETUR' - tzsource%clongname = 'negativity correction induced by turbulence' - tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_r - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' -! tzsource%lavailable = ( hcloud == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 ) & -! .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' ) - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation of cloud' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_c.ge.1 .and. lsedc_lima ) & - .or. ( hcloud(1:3) == 'ICE' .and. lsedic_ice ) & - .or. ( hcloud == 'C2R2' .and. lsedc_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lsedc_c2r2 ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'DEPO' - tzsource%clongname = 'surface droplet deposition' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_c.ge.1 .and. ldepoc_lima ) & - .or. ( hcloud == 'C2R2' .and. ldepoc_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. ldepoc_c2r2 ) & - .or. ( hcloud(1:3) == 'ICE' .and. ldeposc_ice .and. celec == 'NONE' ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'R2C1' - tzsource%clongname = 'rain to cloud change after sedimentation' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'CCN activation' - gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt ) - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1 & - .and. ( .not.lptsplit .or. .not.lsubg_cond ) ) & - .or. ( hcloud == 'C2R2' .and. ( gtmp .or. .not.lsupsat_c2r2 ) ) & - .or. ( hcloud == 'KHKO' .and. ( gtmp .or. .not.lsupsat_c2r2 ) ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'ADJU' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'HON' - tzsource%clongname = 'homogeneous nucleation' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'AUTO' - tzsource%clongname = 'autoconversion into rain' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) & - .or. hcloud == 'KESS' & - .or. ( hcloud(1:3) == 'ICE' .and. lwarm_ice ) & - .or. ( hcloud == 'C2R2' .and. lrain_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lrain_c2r2 ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'ACCR' - tzsource%clongname = 'accretion of cloud droplets' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) & - .or. hcloud == 'KESS' & - .or. ( hcloud(1:3) == 'ICE' .and. lwarm_ice ) & - .or. ( hcloud == 'C2R2' .and. lrain_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lrain_c2r2 ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'HONC' - tzsource%clongname = 'droplet homogeneous freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. lnucl_lima ) ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'BERFI' - tzsource%clongname = 'Bergeron-Findeisen' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'collection by snow and conversion into rain with T>XTT on ice' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'CVRC' - tzsource%clongname = 'rain to cloud change after other microphysical processes' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'DRYH' - tzsource%clongname = 'dry growth of hail' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE' ) - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'COND' - tzsource%clongname = 'vapor condensation or cloud water evaporation' - tzsource%lavailable = hcloud == 'C2R2' .or. hcloud == 'KHKO' .or. hcloud == 'KESS' .or. hcloud == 'REVE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'CORR2' - tzsource%clongname = 'supplementary correction inside LIMA splitting' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_RC) ) - - call Sourcelist_scan( tbudgets(NBUDGET_RC), cbulist_rrc ) -end if - -! Budget of RRR -tbudgets(NBUDGET_RR)%lenabled = lbu_rrr .and. krr >= 3 - -if ( tbudgets(NBUDGET_RR)%lenabled ) then - tbudgets(NBUDGET_RR)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_RR)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_RR)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_RR)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_RR)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of rain water mixing ratio' - tzsource%ngrid = 1 - - tzsource%cunits = 'kg kg-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_rr - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'NETUR' - tzsource%clongname = 'negativity correction induced by turbulence' - tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_r - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' -! tzsource%lavailable = ( hcloud == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 ) & -! .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' ) - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation of rain drops' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_c.ge.1 .and. nmom_r.ge.1 ) & - .or. hcloud == 'KESS' & - .or. hcloud(1:3) == 'ICE' & - .or. hcloud == 'C2R2' & - .or. hcloud == 'KHKO' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'R2C1' - tzsource%clongname = 'rain to cloud change after sedimentation' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'AUTO' - tzsource%clongname = 'autoconversion into rain' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) & - .or. hcloud == 'KESS' & - .or. ( hcloud(1:3) == 'ICE' .and. lwarm_ice ) & - .or. ( hcloud == 'C2R2' .and. lrain_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lrain_c2r2 ) - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'ACCR' - tzsource%clongname = 'accretion of cloud droplets' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) & - .or. hcloud == 'KESS' & - .or. ( hcloud(1:3) == 'ICE' .and. lwarm_ice ) & - .or. ( hcloud == 'C2R2' .and. lrain_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lrain_c2r2 ) - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) & - .or. hcloud == 'KESS' & - .or. ( hcloud(1:3) == 'ICE' .and. lwarm_ice ) & - .or. ( hcloud == 'C2R2' .and. lrain_c2r2 ) & - .or. ( hcloud == 'KHKO' .and. lrain_c2r2 ) - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'HONR' - tzsource%clongname = 'rain homogeneous freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. lnucl_lima .and. nmom_r.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on aggregates' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 & - .and. nmom_s.ge.1 .and. nmom_r.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'collection of droplets by snow and conversion into rain' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'GMLT' - tzsource%clongname = 'graupel melting' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'CVRC' - tzsource%clongname = 'rain to cloud change after other microphysical processes' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'DRYH' - tzsource%clongname = 'dry growth of hail' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'HMLT' - tzsource%clongname = 'melting of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'SFR' - tzsource%clongname = 'spontaneous freezing' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - -!PW: a documenter - tzsource%cmnhname = 'CORR2' - tzsource%clongname = 'supplementary correction inside LIMA splitting' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_RR) ) - - call Sourcelist_scan( tbudgets(NBUDGET_RR), cbulist_rrr ) -end if - -! Budget of RRI -tbudgets(NBUDGET_RI)%lenabled = lbu_rri .and. krr >= 4 - -if ( tbudgets(NBUDGET_RI)%lenabled ) then - tbudgets(NBUDGET_RI)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_RI)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_RI)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_RI)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_RI)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of cloud ice mixing ratio' - tzsource%ngrid = 1 - - tzsource%cunits = 'kg kg-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_ri - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'DCONV' - tzsource%clongname = 'KAFR convection' - tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'NETUR' - tzsource%clongname = 'negativity correction induced by turbulence' - tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA' ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_r - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' -! tzsource%lavailable = ( hcloud == 'LIMA' .and. lptsplit .and. nmom_i.ge.1 .and. nmom_s.ge.1 ) & -! .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' ) - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'ADJU' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation of rain drops' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lsedi_lima ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HIN' - tzsource%clongname = 'heterogeneous ice nucleation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .or. ( hcloud == 'LIMA' .and. nmom_i == 1) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HIND' - tzsource%clongname = 'heterogeneous nucleation by deposition' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HON' - tzsource%clongname = 'homogeneous nucleation' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HONH' - tzsource%clongname = 'haze homogeneous nucleation' - tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1 - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HONC' - tzsource%clongname = 'droplet homogeneous freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. lnucl_lima ) ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'CNVI' - tzsource%clongname = 'conversion of snow to cloud ice' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'CNVS' - tzsource%clongname = 'conversion of pristine ice to snow' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'AGGS' - tzsource%clongname = 'aggregation of snow' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'AUTS' - tzsource%clongname = 'autoconversion of ice' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'BERFI' - tzsource%clongname = 'Bergeron-Findeisen' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HMS' - tzsource%clongname = 'Hallett-Mossop ice multiplication process due to snow riming' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'CIBU' - tzsource%clongname = 'ice multiplication process due to ice collisional breakup' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lcibu ) ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'RDSF' - tzsource%clongname = 'ice multiplication process following rain contact freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lrdsf ) ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'HMG' - tzsource%clongname = 'Hallett-Mossop ice multiplication process due to graupel riming' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'DRYH' - tzsource%clongname = 'dry growth of hail' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = ( hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE') ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'CORR2' - tzsource%clongname = 'supplementary correction inside LIMA splitting' - tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_RI) ) - - call Sourcelist_scan( tbudgets(NBUDGET_RI), cbulist_rri ) -end if - -! Budget of RRS -tbudgets(NBUDGET_RS)%lenabled = lbu_rrs .and. krr >= 5 - -if ( tbudgets(NBUDGET_RS)%lenabled ) then - tbudgets(NBUDGET_RS)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_RS)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_RS)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_RS)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_RS)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of snow/aggregate mixing ratio' - tzsource%ngrid = 1 - - tzsource%cunits = 'kg kg-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_rs - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - -! tzsource%cmnhname = 'NETUR' -! tzsource%clongname = 'negativity correction induced by turbulence' -! tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & -! .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) -! call Budget_source_add( tbudgets(NBUDGET_RS), tzsource nneturrs ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_r - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' -! tzsource%lavailable = ( hcloud == 'LIMA' .and. lptsplit .and. nmom_i.ge.1 .and. nmom_s.ge.1 ) & -! .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' ) - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_i.ge.1 .and. nmom_s.ge.1 ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'CNVI' - tzsource%clongname = 'conversion of snow to cloud ice' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'DEPS' - tzsource%clongname = 'deposition on snow' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'CNVS' - tzsource%clongname = 'conversion of pristine ice to snow' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'AGGS' - tzsource%clongname = 'aggregation of snow' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'AUTS' - tzsource%clongname = 'autoconversion of ice' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'HMS' - tzsource%clongname = 'Hallett-Mossop ice multiplication process due to snow riming' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'CIBU' - tzsource%clongname = 'ice multiplication process due to ice collisional breakup' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lcibu ) ) - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on snow' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 & - .and. nmom_s.ge.1 .and. nmom_r.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'conversion melting' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'DRYH' - tzsource%clongname = 'dry growth of hail' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_RS) ) - - call Sourcelist_scan( tbudgets(NBUDGET_RS), cbulist_rrs ) -end if - -! Budget of RRG -tbudgets(NBUDGET_RG)%lenabled = lbu_rrg .and. krr >= 6 - -if ( tbudgets(NBUDGET_RG)%lenabled ) then - tbudgets(NBUDGET_RG)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_RG)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_RG)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_RG)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_RG)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of graupel mixing ratio' - tzsource%ngrid = 1 - - tzsource%cunits = 'kg kg-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_rg - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - -! tzsource%cmnhname = 'NETUR' -! tzsource%clongname = 'negativity correction induced by turbulence' -! tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & -! .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) -! call Budget_source_add( tbudgets(NBUDGET_RG), tzsource nneturrg ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_r - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_i.ge.1 .and. nmom_s.ge.1 ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'HONR' - tzsource%clongname = 'rain homogeneous freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. lnucl_lima .and. nmom_r.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'SFR' - tzsource%clongname = 'spontaneous freezing' - tzsource%lavailable = hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'DEPG' - tzsource%clongname = 'deposition on graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 & - .and. nmom_s.ge.1 .and. nmom_r.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'conversion melting of snow' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'RDSF' - tzsource%clongname = 'ice multiplication process following rain contact freezing' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lrdsf ) ) - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'GHCV' - tzsource%clongname = 'graupel to hail conversion' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'HMG' - tzsource%clongname = 'Hallett-Mossop ice multiplication process due to graupel riming' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'GMLT' - tzsource%clongname = 'graupel melting' - tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) & - .or. hcloud(1:3) == 'ICE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'COHG' - tzsource%clongname = 'conversion of hail to graupel' - tzsource%lavailable = hcloud == 'LIMA' .and. (lptsplit .or. (nmom_h.ge.1 .and. nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'HGCV' - tzsource%clongname = 'hail to graupel conversion' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'DRYH' - tzsource%clongname = 'dry growth of hail' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_RG) ) - - call Sourcelist_scan( tbudgets(NBUDGET_RG), cbulist_rrg ) -end if - -! Budget of RRH -tbudgets(NBUDGET_RH)%lenabled = lbu_rrh .and. krr >= 7 - -if ( tbudgets(NBUDGET_RH)%lenabled ) then - tbudgets(NBUDGET_RH)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(NBUDGET_RH)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(NBUDGET_RH)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(NBUDGET_RH)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(NBUDGET_RH)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of hail mixing ratio' - tzsource%ngrid = 1 - - tzsource%cunits = 'kg kg-1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifth - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_rh - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - -! tzsource%cmnhname = 'NETUR' -! tzsource%clongname = 'negativity correction induced by turbulence' -! tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' & -! .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) -! call Budget_source_add( tbudgets(NBUDGET_RH), tzsource nneturrh ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_r - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_i.ge.1 .and. nmom_h.ge.1 ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'DEPH' - tzsource%clongname = 'deposition on hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_h.ge.1 ) - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - - tzsource%cmnhname = 'GHCV' - tzsource%clongname = 'graupel to hail conversion' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( hcloud == 'LIMA' .and. nmom_h.ge.1 & - .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) & - .or. ( hcloud == 'ICE4' .and. ( .not. lred .or. celec /= 'NONE' ) ) - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'COHG' - tzsource%clongname = 'conversion from hail to graupel' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'HGCV' - tzsource%clongname = 'hail to graupel conversion' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'DRYH' - tzsource%clongname = 'dry growth of hail' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'HMLT' - tzsource%clongname = 'melting of hail' - tzsource%lavailable = ( hcloud == 'LIMA' .and. .not. lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 & - .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) & - .or. ( hcloud == 'LIMA' .and. lptsplit ) & - .or. hcloud == 'ICE4' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'CORR' - tzsource%clongname = 'correction' - tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = celec == 'NONE' - call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) - - - call Sourcelist_sort_compact( tbudgets(NBUDGET_RH) ) - - call Sourcelist_scan( tbudgets(NBUDGET_RH), cbulist_rrh ) -end if - -! Budgets of RSV (scalar variables) - -if ( ksv > 999 ) call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', 'number of scalar variables > 999' ) - -SV_BUDGETS: do jsv = 1, ksv - ibudget = NBUDGET_SV1 - 1 + jsv - - tbudgets(ibudget)%lenabled = lbu_rsv - - if ( lbu_rsv ) then - tbudgets(ibudget)%trhodj => tburhodj - - !Allocate all basic source terms (used or not) - !The size should be large enough (bigger than necessary is OK) - tbudgets(ibudget)%nsourcesmax = NSOURCESMAX - allocate( tbudgets(ibudget)%tsources(NSOURCESMAX) ) - - allocate( tbudgets(ibudget)%xtmpstore(ibudim1, ibudim2, ibudim3) ) - - tbudgets(ibudget)%tsources(:)%ngroup = 0 - - tzsource%ccomment = 'Budget of scalar variable ' // tsvlist(jsv)%cmnhname - tzsource%ngrid = 1 - - tzsource%cunits = '1' - - tzsource%cmnhname = 'INIF' - tzsource%clongname = 'initial state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'ENDF' - tzsource%clongname = 'final state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource, odonotinit = .true., ooverwrite = .true. ) - - tzsource%cmnhname = 'AVEF' - tzsource%clongname = 'averaged state' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource, odonotinit = .true., ooverwrite = .false. ) - - tzsource%cunits = 's-1' - - tzsource%cmnhname = 'ASSE' - tzsource%clongname = 'time filter (Asselin)' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEST' - tzsource%clongname = 'nesting' - tzsource%lavailable = nmodel > 1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'FRC' - tzsource%clongname = 'forcing' - tzsource%lavailable = lforcing - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DIF' - tzsource%clongname = 'numerical diffusion' - tzsource%lavailable = onumdifsv - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'REL' - tzsource%clongname = 'relaxation' - tzsource%lavailable = ohorelax_sv( jsv ) .or. ( celec /= 'NONE' .and. lrelax2fw_ion & - .and. (jsv == nsv_elecbeg .or. jsv == nsv_elecend ) ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DCONV' - tzsource%clongname = 'KAFR convection' - tzsource%lavailable = ( hdconv == 'KAFR' .or. hsconv == 'KAFR' ) .and. ochtrans - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'VTURB' - tzsource%clongname = 'vertical turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HTURB' - tzsource%clongname = 'horizontal turbulent diffusion' - tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'MAFL' - tzsource%clongname = 'mass flux' - tzsource%lavailable = hsconv == 'EDKF' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'VISC' - tzsource%clongname = 'viscosity' - tzsource%lavailable = lvisc .and. lvisc_sv - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ADV' - tzsource%clongname = 'total advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEGA2' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - ! Add specific source terms to different scalar variables - SV_VAR: if ( jsv <= nsv_user ) then - ! nsv_user case - ! Nothing to do - - else if ( jsv >= nsv_c2r2beg .and. jsv <= nsv_c2r2end ) then SV_VAR - ! C2R2 or KHKO Case - - ! Source terms in common for all C2R2/KHKO budgets - tzsource%cmnhname = 'NETUR' - tzsource%clongname = 'negativity correction induced by turbulence' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - ! Source terms specific to each budget - SV_C2R2: select case( jsv - nsv_c2r2beg + 1 ) - case ( 1 ) SV_C2R2 - ! Concentration of activated nuclei - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'CCN activation' - gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt ) - tzsource%lavailable = gtmp .or. ( .not.gtmp .and. .not.lsupsat_c2r2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEVA' - tzsource%clongname = 'evaporation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 2 ) SV_C2R2 - ! Concentration of cloud droplets - tzsource%cmnhname = 'DEPOTR' - tzsource%clongname = 'tree droplet deposition' - tzsource%lavailable = odragtree .and. odepotree - call Budget_source_add( tbudgets(ibudget), tzsource) - - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'CCN activation' - gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt ) - tzsource%lavailable = gtmp .or. ( .not.gtmp .and. .not.lsupsat_c2r2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SELF' - tzsource%clongname = 'self-collection of cloud droplets' - tzsource%lavailable = lrain_c2r2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACCR' - tzsource%clongname = 'accretion of cloud droplets' - tzsource%lavailable = lrain_c2r2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = lsedc_c2r2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPO' - tzsource%clongname = 'surface droplet deposition' - tzsource%lavailable = ldepoc_c2r2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEVA' - tzsource%clongname = 'evaporation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 3 ) SV_C2R2 - ! Concentration of raindrops - tzsource%cmnhname = 'AUTO' - tzsource%clongname = 'autoconversion into rain' - tzsource%lavailable = lrain_c2r2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SCBU' - tzsource%clongname = 'self collection - coalescence/break-up' - tzsource%lavailable = hcloud /= 'KHKO' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = lrain_c2r2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'BRKU' - tzsource%clongname = 'spontaneous break-up' - tzsource%lavailable = lrain_c2r2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 4 ) SV_C2R2 - ! Supersaturation - tzsource%cmnhname = 'CEVA' - tzsource%clongname = 'evaporation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - end select SV_C2R2 - - - else if ( jsv >= nsv_lima_beg .and. jsv <= nsv_lima_end ) then SV_VAR - ! LIMA case - - ! Source terms in common for all LIMA budgets (except supersaturation) - if ( jsv /= nsv_lima_spro ) then - tzsource%cmnhname = 'NETUR' - tzsource%clongname = 'negativity correction induced by turbulence' - tzsource%lavailable = hturb == 'TKEL' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEADV' - tzsource%clongname = 'negativity correction induced by advection' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NECON' - tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - end if - - - ! Source terms specific to each budget - SV_LIMA: if ( jsv == nsv_lima_nc ) then - ! Cloud droplets concentration - tzsource%cmnhname = 'DEPOTR' - tzsource%clongname = 'tree droplet deposition' - tzsource%lavailable = odragtree .and. odepotree - call Budget_source_add( tbudgets(ibudget), tzsource ) - -! tzsource%cmnhname = 'CORR' -! tzsource%clongname = 'correction' -! tzsource%lavailable = lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 -! call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = nmom_c.ge.1 .and. lsedc_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPO' - tzsource%clongname = 'surface droplet deposition' - tzsource%lavailable = nmom_c.ge.1 .and. ldepoc_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'R2C1' - tzsource%clongname = 'rain to cloud change after sedimentation' - tzsource%lavailable = lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'CCN activation' - tzsource%lavailable = nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1 .and. ( .not.lptsplit .or. .not.lsubg_cond ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SELF' - tzsource%clongname = 'self-collection of cloud droplets' - tzsource%lavailable = lptsplit .or. (nmom_c.ge.1 .and. nmom_r.ge.1) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AUTO' - tzsource%clongname = 'autoconversion into rain' - tzsource%lavailable = lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACCR' - tzsource%clongname = 'accretion of cloud droplets' - tzsource%lavailable = lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HONC' - tzsource%clongname = 'droplet homogeneous freezing' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. lnucl_lima ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CVRC' - tzsource%clongname = 'rain to cloud change after other microphysical processes' - tzsource%lavailable = lptsplit - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = lptsplit .or. nmom_h.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CORR2' - tzsource%clongname = 'supplementary correction inside LIMA splitting' - tzsource%lavailable = lptsplit - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_c.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv == nsv_lima_nr ) then SV_LIMA - ! Rain drops concentration -! tzsource%cmnhname = 'CORR' -! tzsource%clongname = 'correction' -! tzsource%lavailable = lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 -! call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = nmom_c.ge.1 .and. nmom_r.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'R2C1' - tzsource%clongname = 'rain to cloud change after sedimentation' - tzsource%lavailable = lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AUTO' - tzsource%clongname = 'autoconversion into rain' - tzsource%lavailable = lptsplit .or. (nmom_c.ge.1 .and. nmom_r.ge.1) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SCBU' - tzsource%clongname = 'self collection - coalescence/break-up' - tzsource%lavailable = lptsplit .or. (nmom_c.ge.1 .and. nmom_r.ge.1) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = lptsplit .or. (nmom_c.ge.1 .and. nmom_r.ge.1) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'BRKU' - tzsource%clongname = 'spontaneous break-up' - tzsource%lavailable = lptsplit .or. (nmom_c.ge.1 .and. nmom_r.ge.1) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HONR' - tzsource%clongname = 'rain homogeneous freezing' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_r.ge.1 .and. lnucl_lima ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on aggregates' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. nmom_r.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'GMLT' - tzsource%clongname = 'graupel melting' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CVRC' - tzsource%clongname = 'rain to cloud change after other microphysical processes' - tzsource%lavailable = lptsplit - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = lptsplit .or. nmom_h.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HMLT' - tzsource%clongname = 'melting of hail' - tzsource%lavailable = lptsplit .or. nmom_h.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CORR2' - tzsource%clongname = 'supplementary correction inside LIMA splitting' - tzsource%lavailable = lptsplit - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv >= nsv_lima_ccn_free .and. jsv <= nsv_lima_ccn_free + nmod_ccn - 1 ) then SV_LIMA - ! Free CCN concentration - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'CCN activation' - tzsource%lavailable = nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1 .and. ( .not.lptsplit .or. .not.lsubg_cond ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HONH' - tzsource%clongname = 'haze homogeneous nucleation' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_c.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SCAV' - tzsource%clongname = 'scavenging' - tzsource%lavailable = lscav_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv >= nsv_lima_ccn_acti .and. jsv <= nsv_lima_ccn_acti + nmod_ccn - 1 ) then SV_LIMA - ! Activated CCN concentration - tzsource%cmnhname = 'HENU' - tzsource%clongname = 'CCN activation' - tzsource%lavailable = nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1 .and. ( .not.lptsplit .or. .not.lsubg_cond ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. .not. lmeyers_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_c.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv == nsv_lima_scavmass ) then SV_LIMA - ! Scavenged mass variable - tzsource%cmnhname = 'SCAV' - tzsource%clongname = 'scavenging' - tzsource%lavailable = lscav_lima .and. laero_mass_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = lscav_lima .and. laero_mass_lima .and. .not.lspro_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv == nsv_lima_ni ) then SV_LIMA - ! Pristine ice crystals concentration -! tzsource%cmnhname = 'CORR' -! tzsource%clongname = 'correction' -! tzsource%lavailable = lptsplit .and. nmom_i.ge.1 .and. nmom_s.ge.1 -! call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = nmom_i.ge.1 .and. lsedi_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HIND' - tzsource%clongname = 'heterogeneous nucleation by deposition' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HONH' - tzsource%clongname = 'haze homogeneous nucleation' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HONC' - tzsource%clongname = 'droplet homogeneous freezing' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. lnucl_lima ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CNVI' - tzsource%clongname = 'conversion of snow to cloud ice' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CNVS' - tzsource%clongname = 'conversion of pristine ice to snow' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AGGS' - tzsource%clongname = 'aggregation of snow' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HMS' - tzsource%clongname = 'Hallett-Mossop ice multiplication process due to snow riming' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CIBU' - tzsource%clongname = 'ice multiplication process due to ice collisional breakup' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lcibu ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'RDSF' - tzsource%clongname = 'ice multiplication process following rain contact freezing' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lrdsf ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HMG' - tzsource%clongname = 'Hallett-Mossop ice multiplication process due to graupel riming' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = lptsplit .or. nmom_h.ge.1 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CORR2' - tzsource%clongname = 'supplementary correction inside LIMA splitting' - tzsource%lavailable = lptsplit - call Budget_source_add( tbudgets(ibudget), tzsource ) - - else if ( jsv == nsv_lima_ns ) then SV_LIMA - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = ( nmom_s.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CNVI' - tzsource%clongname = 'conversion of snow to cloud ice' - tzsource%lavailable = ( nmom_s.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CNVS' - tzsource%clongname = 'conversion of pristine ice to snow' - tzsource%lavailable = ( nmom_s.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'BRKU' - tzsource%clongname = 'break up of snow' - tzsource%lavailable = ( nmom_s.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'heavy riming of cloud droplet on snow' - tzsource%lavailable = ( nmom_s.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on snow' - tzsource%lavailable = ( nmom_s.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'conversion melting of snow' - tzsource%lavailable = ( nmom_s.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( nmom_s.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = ( nmom_s.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = nmom_s.ge.2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SSC' - tzsource%clongname = 'snow self collection' - tzsource%lavailable = ( nmom_s.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - else if ( jsv == nsv_lima_ng ) then SV_LIMA - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = ( nmom_g.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'heavy riming of cloud droplet on snow' - tzsource%lavailable = ( nmom_g.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on snow' - tzsource%lavailable = ( nmom_g.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'conversion melting of snow' - tzsource%lavailable = ( nmom_g.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of raindrop' - tzsource%lavailable = ( nmom_g.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = ( nmom_g.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'GMLT' - tzsource%clongname = 'graupel melting' - tzsource%lavailable = ( nmom_g.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = nmom_g.ge.2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'COHG' - tzsource%clongname = 'conversion hail graupel' - tzsource%lavailable = nmom_g.ge.2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - else if ( jsv == nsv_lima_nh .and. nmom_h.ge.1) then SV_LIMA - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = ( nmom_h.ge.2 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = nmom_h.ge.2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'COHG' - tzsource%clongname = 'conversion hail graupel' - tzsource%lavailable = nmom_h.ge.2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HMLT' - tzsource%clongname = 'hail melting' - tzsource%lavailable = nmom_h.ge.2 - call Budget_source_add( tbudgets(ibudget), tzsource ) - - else if ( jsv >= nsv_lima_ifn_free .and. jsv <= nsv_lima_ifn_free + nmod_ifn - 1 ) then SV_LIMA - ! Free IFN concentration - tzsource%cmnhname = 'HIND' - tzsource%clongname = 'heterogeneous nucleation by deposition' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. .not. lmeyers_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SCAV' - tzsource%clongname = 'scavenging' - tzsource%lavailable = lscav_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv >= nsv_lima_ifn_nucl .and. jsv <= nsv_lima_ifn_nucl + nmod_ifn - 1 ) then SV_LIMA - ! Nucleated IFN concentration - tzsource%cmnhname = 'HIND' - tzsource%clongname = 'heterogeneous nucleation by deposition' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima & - .and. ( ( lmeyers_lima .and. jsv == nsv_lima_ifn_nucl ) .or. .not. lmeyers_lima ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. lmeyers_lima .and. jsv == nsv_lima_ifn_nucl - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv >= nsv_lima_imm_nucl .and. jsv <= nsv_lima_imm_nucl + nmod_imm - 1 ) then SV_LIMA - ! Nucleated IMM concentration - tzsource%cmnhname = 'HINC' - tzsource%clongname = 'heterogeneous nucleation by contact' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. .not. lmeyers_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv == nsv_lima_hom_haze ) then SV_LIMA - ! Homogeneous freezing of CCN - tzsource%cmnhname = 'HONH' - tzsource%clongname = 'haze homogeneous nucleation' - tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. & - ( ( lhhoni_lima .and. nmod_ccn >= 1 ) .or. ( .not.lptsplit .and. nmom_c.ge.1 ) ) - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv == nsv_lima_spro ) then SV_LIMA - ! Supersaturation - tzsource%cmnhname = 'CEDS' - tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - end if SV_LIMA - - - else if ( jsv >= nsv_elecbeg .and. jsv <= nsv_elecend ) then SV_VAR - ! Electricity case - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - SV_ELEC: select case( jsv - nsv_elecbeg + 1 ) - case ( 1 ) SV_ELEC - ! volumetric charge of water vapor - tzsource%cmnhname = 'DRIFT' - tzsource%clongname = 'ion drift motion' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CORAY' - tzsource%clongname = 'cosmic ray source' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPS' - tzsource%clongname = 'deposition on snow' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPG' - tzsource%clongname = 'deposition on graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = lwarm_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 2 ) SV_ELEC - ! volumetric charge of cloud droplets - tzsource%cmnhname = 'HON' - tzsource%clongname = 'homogeneous nucleation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AUTO' - tzsource%clongname = 'autoconversion into rain' - tzsource%lavailable = lwarm_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACCR' - tzsource%clongname = 'accretion of cloud droplets' - tzsource%lavailable = lwarm_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'INCG' - tzsource%clongname = 'inductive charge transfer between cloud droplets and graupel' - tzsource%lavailable = linductive - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = hcloud == 'ICE4' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'BERFI' - tzsource%clongname = 'Bergeron-Findeisen' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = lsedic_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 3 ) SV_ELEC - ! volumetric charge of rain drops - tzsource%cmnhname = 'SFR' - tzsource%clongname = 'spontaneous freezing' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AUTO' - tzsource%clongname = 'autoconversion into rain' - tzsource%lavailable = lwarm_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACCR' - tzsource%clongname = 'accretion of cloud droplets' - tzsource%lavailable = lwarm_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = lwarm_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on aggregates' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'GMLT' - tzsource%clongname = 'graupel melting' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = hcloud == 'ICE4' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HMLT' - tzsource%clongname = 'melting of hail' - tzsource%lavailable = hcloud == 'ICE4' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - case ( 4 ) SV_ELEC - ! volumetric charge of ice crystals - tzsource%cmnhname = 'HON' - tzsource%clongname = 'homogeneous nucleation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AGGS' - tzsource%clongname = 'aggregation of snow' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AUTS' - tzsource%clongname = 'autoconversion of ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = hcloud == 'ICE4' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'IMLT' - tzsource%clongname = 'melting of ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'BERFI' - tzsource%clongname = 'Bergeron-Findeisen' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NIIS' - tzsource%clongname = 'non-inductive charge separation due to ice-snow collisions' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 5 ) SV_ELEC - ! volumetric charge of snow - tzsource%cmnhname = 'DEPS' - tzsource%clongname = 'deposition on snow' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AGGS' - tzsource%clongname = 'aggregation of snow' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'AUTS' - tzsource%clongname = 'autoconversion of ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on snow' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'conversion melting' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NIIS' - tzsource%clongname = 'non-inductive charge separation due to ice-snow collisions' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = hcloud == 'ICE4' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 6 ) SV_ELEC - ! volumetric charge of graupel - tzsource%cmnhname = 'SFR' - tzsource%clongname = 'spontaneous freezing' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPG' - tzsource%clongname = 'deposition on graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'RIM' - tzsource%clongname = 'riming of cloud water' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'ACC' - tzsource%clongname = 'accretion of rain on graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CMEL' - tzsource%clongname = 'conversion melting' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CFRZ' - tzsource%clongname = 'conversion freezing of rain' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DRYG' - tzsource%clongname = 'dry growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'INCG' - tzsource%clongname = 'inductive charge transfer between cloud droplets and graupel' - tzsource%lavailable = linductive - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'GMLT' - tzsource%clongname = 'graupel melting' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = hcloud == 'ICE4' - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - case ( 7: ) SV_ELEC - if ( ( hcloud == 'ICE4' .and. ( jsv - nsv_elecbeg + 1 ) == 7 ) ) then - ! volumetric charge of hail - tzsource%cmnhname = 'WETG' - tzsource%clongname = 'wet growth of graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'WETH' - tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'HMLT' - tzsource%clongname = 'melting of hail' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SEDI' - tzsource%clongname = 'sedimentation' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - else if ( ( hcloud == 'ICE3' .and. ( jsv - nsv_elecbeg + 1 ) == 7 ) & - .or. ( hcloud == 'ICE4' .and. ( jsv - nsv_elecbeg + 1 ) == 8 ) ) then - ! Negative ions (NSV_ELECEND case) - tzsource%cmnhname = 'DRIFT' - tzsource%clongname = 'ion drift motion' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'CORAY' - tzsource%clongname = 'cosmic ray source' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPS' - tzsource%clongname = 'deposition on snow' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPG' - tzsource%clongname = 'deposition on graupel' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'REVA' - tzsource%clongname = 'rain evaporation' - tzsource%lavailable = lwarm_ice - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'DEPI' - tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEUT' - tzsource%clongname = 'neutralization' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - else - call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', 'unknown electricity budget' ) - end if - - end select SV_ELEC - - - else if ( jsv >= nsv_lgbeg .and. jsv <= nsv_lgend ) then SV_VAR - !Lagrangian variables - - - else if ( jsv >= nsv_ppbeg .and. jsv <= nsv_ppend ) then SV_VAR - !Passive pollutants - - -#ifdef MNH_FOREFIRE - else if ( jsv >= nsv_ffbeg .and. jsv <= nsv_ffend ) then SV_VAR - !Forefire - -#endif - else if ( jsv >= nsv_csbeg .and. jsv <= nsv_csend ) then SV_VAR - !Conditional sampling - - - else if ( jsv >= nsv_chembeg .and. jsv <= nsv_chemend ) then SV_VAR - !Chemical case - tzsource%cmnhname = 'CHEM' - tzsource%clongname = 'chemistry activity' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = .true. - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv >= nsv_chicbeg .and. jsv <= nsv_chicend ) then SV_VAR - !Ice phase chemistry - - - else if ( jsv >= nsv_aerbeg .and. jsv <= nsv_aerend ) then SV_VAR - !Chemical aerosol case - tzsource%cmnhname = 'NEGA' - tzsource%clongname = 'negativity correction' - tzsource%lavailable = lorilam - call Budget_source_add( tbudgets(ibudget), tzsource ) - - else if ( jsv >= nsv_aerdepbeg .and. jsv <= nsv_aerdepend ) then SV_VAR - !Aerosol wet deposition - - else if ( jsv >= nsv_dstbeg .and. jsv <= nsv_dstend ) then SV_VAR - !Dust - - else if ( jsv >= nsv_dstdepbeg .and. jsv <= nsv_dstdepend ) then SV_VAR - !Dust wet deposition - - else if ( jsv >= nsv_sltbeg .and. jsv <= nsv_sltend ) then SV_VAR - !Salt - - else if ( jsv >= nsv_sltdepbeg .and. jsv <= nsv_sltdepend ) then SV_VAR - !Salt wet deposition - - else if ( jsv >= nsv_snwbeg .and. jsv <= nsv_snwend ) then SV_VAR - !Snow - tzsource%cmnhname = 'SNSUB' - tzsource%clongname = 'blowing snow sublimation' - tzsource%lavailable = lblowsnow .and. lsnowsubl - call Budget_source_add( tbudgets(ibudget), tzsource ) - - tzsource%cmnhname = 'SNSED' - tzsource%clongname = 'blowing snow sedimentation' - tzsource%lavailable = lblowsnow - call Budget_source_add( tbudgets(ibudget), tzsource ) - - - else if ( jsv >= nsv_lnoxbeg .and. jsv <= nsv_lnoxend ) then SV_VAR - !LiNOX passive tracer - - else SV_VAR - call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', 'unknown scalar variable' ) - end if SV_VAR - - - call Sourcelist_sort_compact( tbudgets(ibudget) ) - - call Sourcelist_scan( tbudgets(ibudget), cbulist_rsv ) - end if -end do SV_BUDGETS - -call Ini_budget_groups( tbudgets, ibudim1, ibudim2, ibudim3 ) - -if ( tbudgets(NBUDGET_U) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_U), cbulist_ru ) -if ( tbudgets(NBUDGET_V) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_V), cbulist_rv ) -if ( tbudgets(NBUDGET_W) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_W), cbulist_rw ) -if ( tbudgets(NBUDGET_TH) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_TH), cbulist_rth ) -if ( tbudgets(NBUDGET_TKE)%lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_TKE), cbulist_rtke ) -if ( tbudgets(NBUDGET_RV) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RV), cbulist_rrv ) -if ( tbudgets(NBUDGET_RC) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RC), cbulist_rrc ) -if ( tbudgets(NBUDGET_RR) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RR), cbulist_rrr ) -if ( tbudgets(NBUDGET_RI) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RI), cbulist_rri ) -if ( tbudgets(NBUDGET_RS) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RS), cbulist_rrs ) -if ( tbudgets(NBUDGET_RG) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RG), cbulist_rrg ) -if ( tbudgets(NBUDGET_RH) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RH), cbulist_rrh ) -if ( lbu_rsv ) call Sourcelist_sv_nml_compact( cbulist_rsv ) -end subroutine Ini_budget - - -subroutine Budget_source_add( tpbudget, tpsource, odonotinit, ooverwrite ) - use modd_budget, only: tbudgetdata, tbusourcedata - - type(tbudgetdata), intent(inout) :: tpbudget - type(tbusourcedata), intent(in) :: tpsource ! Metadata basis - logical, optional, intent(in) :: odonotinit - logical, optional, intent(in) :: ooverwrite - - character(len=4) :: ynum - integer :: isourcenumber - - call Print_msg( NVERB_DEBUG, 'BUD', 'Budget_source_add', 'called for ' // Trim( tpbudget%cname ) & - // ': ' // Trim( tpsource%cmnhname ) ) - - isourcenumber = tpbudget%nsources + 1 - if ( isourcenumber > tpbudget%nsourcesmax ) then - Write( ynum, '( i4 )' ) tpbudget%nsourcesmax - cmnhmsg(1) = 'Insufficient max number of source terms (' // Trim(ynum) // ') for budget ' // Trim( tpbudget%cname ) - cmnhmsg(2) = 'Please increaze value of parameter NSOURCESMAX' - call Print_msg( NVERB_FATAL, 'BUD', 'Budget_source_add' ) - else - tpbudget%nsources = tpbudget%nsources + 1 - end if - - ! Copy metadata from provided tpsource - ! Modifications to source term metadata done with the other dummy arguments - tpbudget%tsources(isourcenumber) = tpsource - - if ( present( odonotinit ) ) tpbudget%tsources(isourcenumber)%ldonotinit = odonotinit - - if ( present( ooverwrite ) ) tpbudget%tsources(isourcenumber)%loverwrite = ooverwrite -end subroutine Budget_source_add - - -subroutine Ini_budget_groups( tpbudgets, kbudim1, kbudim2, kbudim3 ) - use modd_budget, only: tbudgetdata - use modd_field, only: TYPEINT, TYPEREAL - use modd_parameters, only: NMNHNAMELGTMAX, NSTDNAMELGTMAX, NLONGNAMELGTMAX, NUNITLGTMAX, NCOMMENTLGTMAX - - use mode_tools, only: Quicksort - - type(tbudgetdata), dimension(:), intent(inout) :: tpbudgets - integer, intent(in) :: kbudim1 - integer, intent(in) :: kbudim2 - integer, intent(in) :: kbudim3 - - character(len=NMNHNAMELGTMAX) :: ymnhname - character(len=NSTDNAMELGTMAX) :: ystdname - character(len=NLONGNAMELGTMAX) :: ylongname - character(len=NUNITLGTMAX) :: yunits - character(len=NCOMMENTLGTMAX) :: ycomment - integer :: ji, jj, jk - integer :: isources ! Number of source terms in a budget - integer :: inbgroups ! Number of budget groups - integer :: ival - integer :: icount - integer :: ivalmax, ivalmin - integer :: igrid - integer :: itype - integer :: idims - integer, dimension(:), allocatable :: igroups ! Temporary array to store sorted group numbers - integer, dimension(:), allocatable :: ipos ! Temporary array to store initial position of group numbers - real :: zval - real :: zvalmax, zvalmin - - call Print_msg( NVERB_DEBUG, 'BUD', 'Ini_budget_groups', 'called' ) - - BUDGETS: do ji = 1, size( tpbudgets ) - ENABLED: if ( tpbudgets(ji)%lenabled ) then - isources = size( tpbudgets(ji)%tsources ) - do jj = 1, isources - ! Check if ngroup is an allowed value - if ( tpbudgets(ji)%tsources(jj)%ngroup < 0 ) then - call Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'negative group value is not allowed' ) - tpbudgets(ji)%tsources(jj)%ngroup = 0 - end if - - if ( tpbudgets(ji)%tsources(jj)%ngroup > 0 ) tpbudgets(ji)%tsources(jj)%lenabled = .true. - end do - - !Count the number of groups of source terms - !ngroup=1 is for individual entries, >1 values are groups - allocate( igroups(isources ) ) - allocate( ipos (isources ) ) - igroups(:) = tpbudgets(ji)%tsources(:)%ngroup - ipos(:) = [ ( jj, jj = 1, isources ) ] - - !Sort the group list number - call Quicksort( igroups, 1, isources, ipos ) - - !Count the number of different groups - !and renumber the entries (from 1 to inbgroups) - inbgroups = 0 - ival = igroups(1) - if ( igroups(1) /= 0 ) then - inbgroups = 1 - igroups(1) = inbgroups - end if - do jj = 2, isources - if ( igroups(jj) == 1 ) then - inbgroups = inbgroups + 1 - igroups(jj) = inbgroups - else if ( igroups(jj) > 0 ) then - if ( igroups(jj) /= ival ) then - ival = igroups(jj) - inbgroups = inbgroups + 1 - end if - igroups(jj) = inbgroups - end if - end do - - !Write the igroups values to the budget structure - do jj = 1, isources - tpbudgets(ji)%tsources(ipos(jj))%ngroup = igroups(jj) - end do - - !Allocate the group structure + populate it - tpbudgets(ji)%ngroups = inbgroups - allocate( tpbudgets(ji)%tgroups(inbgroups) ) - - do jj = 1, inbgroups - !Search the list of sources for each group - !not the most efficient algorithm but do the job - icount = 0 - do jk = 1, isources - if ( tpbudgets(ji)%tsources(jk)%ngroup == jj ) then - icount = icount + 1 - ipos(icount) = jk !ipos is reused as a temporary work array - end if - end do - tpbudgets(ji)%tgroups(jj)%nsources = icount - - allocate( tpbudgets(ji)%tgroups(jj)%nsourcelist(icount) ) - tpbudgets(ji)%tgroups(jj)%nsourcelist(:) = ipos(1 : icount) - - ! Set the name of the field - ymnhname = tpbudgets(ji)%tsources(ipos(1))%cmnhname - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - ymnhname = trim( ymnhname ) // '_' // trim( tpbudgets(ji)%tsources(ipos(jk))%cmnhname ) - end do - tpbudgets(ji)%tgroups(jj)%cmnhname = ymnhname - - ! Set the standard name (CF convention) - if ( tpbudgets(ji)%tgroups(jj)%nsources == 1 ) then - ystdname = tpbudgets(ji)%tsources(ipos(1))%cstdname - else - ! The CF standard name is probably wrong if combining several source terms => set to '' - ystdname = '' - end if - tpbudgets(ji)%tgroups(jj)%cstdname = ystdname - - ! Set the long name (CF convention) - ylongname = tpbudgets(ji)%tsources(ipos(1))%clongname - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - ylongname = trim( ylongname ) // ' + ' // tpbudgets(ji)%tsources(ipos(jk))%clongname - end do - tpbudgets(ji)%tgroups(jj)%clongname = ylongname - - ! Set the units - yunits = tpbudgets(ji)%tsources(ipos(1))%cunits - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - if ( trim( yunits ) /= trim( tpbudgets(ji)%tsources(ipos(jk))%cunits ) ) then - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', & - 'incompatible units for the different source terms of the group ' & - //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) ) - yunits = 'unknown' - end if - end do - tpbudgets(ji)%tgroups(jj)%cunits = yunits - - ! Set the comment - ! It is composed of the source comment followed by the clongnames of the different sources - ycomment = trim( tpbudgets(ji)%tsources(ipos(1))%ccomment ) // ': '// trim( tpbudgets(ji)%tsources(ipos(1))%clongname ) - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - ycomment = trim( ycomment ) // ', ' // trim( tpbudgets(ji)%tsources(ipos(jk))%clongname ) - end do - ycomment = trim( ycomment ) // ' source term' - if ( tpbudgets(ji)%tgroups(jj)%nsources > 1 ) ycomment = trim( ycomment ) // 's' - tpbudgets(ji)%tgroups(jj)%ccomment = ycomment - - ! Set the Arakawa grid - igrid = tpbudgets(ji)%tsources(ipos(1))%ngrid - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - if ( igrid /= tpbudgets(ji)%tsources(ipos(jk))%ngrid ) then - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', & - 'different Arakawa grid positions for the different source terms of the group ' & - //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) ) - end if - end do - tpbudgets(ji)%tgroups(jj)%ngrid = igrid - - ! Set the data type - itype = tpbudgets(ji)%tsources(ipos(1))%ntype - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - if ( itype /= tpbudgets(ji)%tsources(ipos(jk))%ntype ) then - call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', & - 'incompatible data types for the different source terms of the group ' & - //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) ) - end if - end do - tpbudgets(ji)%tgroups(jj)%ntype = itype - - ! Set the number of dimensions - idims = tpbudgets(ji)%tsources(ipos(1))%ndims - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - if ( idims /= tpbudgets(ji)%tsources(ipos(jk))%ndims ) then - call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', & - 'incompatible number of dimensions for the different source terms of the group ' & - //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) ) - end if - end do - tpbudgets(ji)%tgroups(jj)%ndims = idims - - ! Set the fill values - if ( tpbudgets(ji)%tgroups(jj)%ntype == TYPEINT ) then - ival = tpbudgets(ji)%tsources(ipos(1))%nfillvalue - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - if ( ival /= tpbudgets(ji)%tsources(ipos(jk))%nfillvalue ) then - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', & - 'different (integer) fill values for the different source terms of the group ' & - //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) ) - end if - end do - tpbudgets(ji)%tgroups(jj)%nfillvalue = ival - end if - - if ( tpbudgets(ji)%tgroups(jj)%ntype == TYPEREAL ) then - zval = tpbudgets(ji)%tsources(ipos(1))%xfillvalue - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - if ( zval /= tpbudgets(ji)%tsources(ipos(jk))%xfillvalue ) then - call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', & - 'different (real) fill values for the different source terms of the group ' & - //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) ) - end if - end do - tpbudgets(ji)%tgroups(jj)%xfillvalue = zval - end if - - ! Set the valid min/max values - ! Take the min or max of all the sources - ! Maybe, it would be better to take the sum? (if same sign, if not already the maximum allowed value for this type) - if ( tpbudgets(ji)%tgroups(jj)%ntype == TYPEINT ) then - ivalmin = tpbudgets(ji)%tsources(ipos(1))%nvalidmin - ivalmax = tpbudgets(ji)%tsources(ipos(1))%nvalidmax - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - ivalmin = min( ivalmin, tpbudgets(ji)%tsources(ipos(jk))%nvalidmin ) - ivalmax = max( ivalmax, tpbudgets(ji)%tsources(ipos(jk))%nvalidmax ) - end do - tpbudgets(ji)%tgroups(jj)%nvalidmin = ivalmin - tpbudgets(ji)%tgroups(jj)%nvalidmax = ivalmax - end if - - if ( tpbudgets(ji)%tgroups(jj)%ntype == TYPEREAL ) then - zvalmin = tpbudgets(ji)%tsources(ipos(1))%xvalidmin - zvalmax = tpbudgets(ji)%tsources(ipos(1))%xvalidmax - do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources - zvalmin = min( zvalmin, tpbudgets(ji)%tsources(ipos(jk))%xvalidmin ) - zvalmax = max( zvalmax, tpbudgets(ji)%tsources(ipos(jk))%xvalidmax ) - end do - tpbudgets(ji)%tgroups(jj)%xvalidmin = zvalmin - tpbudgets(ji)%tgroups(jj)%xvalidmax = zvalmax - end if - - allocate( tpbudgets(ji)%tgroups(jj)%xdata(kbudim1, kbudim2, kbudim3 ) ) - tpbudgets(ji)%tgroups(jj)%xdata(:, :, :) = 0. - end do - - deallocate( igroups ) - deallocate( ipos ) - - !Check that a group does not contain more than 1 source term with ldonotinit=.true. - do jj = 1, inbgroups - if ( tpbudgets(ji)%tgroups(jj)%nsources > 1 ) then - do jk = 1, tpbudgets(ji)%tgroups(jj)%nsources - if ( tpbudgets(ji)%tsources(tpbudgets(ji)%tgroups(jj)%nsourcelist(jk) )%ldonotinit ) & - call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', & - 'a group with more than 1 source term may not contain sources with ldonotinit=true' ) - if ( tpbudgets(ji)%tsources(tpbudgets(ji)%tgroups(jj)%nsourcelist(jk) )%loverwrite ) & - call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', & - 'a group with more than 1 source term may not contain sources with loverwrite=true' ) - end do - end if - end do - - end if ENABLED - end do BUDGETS - -end subroutine Ini_budget_groups - - -subroutine Sourcelist_sort_compact( tpbudget ) - !Sort the list of sources to put the non-available source terms at the end of the list - !and compact the list - use modd_budget, only: tbudgetdata, tbusourcedata - - type(tbudgetdata), intent(inout) :: tpbudget - - integer :: ji - integer :: isrc_avail, isrc_notavail - type(tbusourcedata), dimension(:), allocatable :: tzsources_avail - type(tbusourcedata), dimension(:), allocatable :: tzsources_notavail - - isrc_avail = 0 - isrc_notavail = 0 - - Allocate( tzsources_avail (tpbudget%nsources) ) - Allocate( tzsources_notavail(tpbudget%nsources) ) - - !Separate source terms available or not during the execution - !(based on the criteria provided to Budget_source_add and stored in lavailable field) - do ji = 1, tpbudget%nsources - if ( tpbudget%tsources(ji)%lavailable ) then - isrc_avail = isrc_avail + 1 - tzsources_avail(isrc_avail) = tpbudget%tsources(ji) - else - isrc_notavail = isrc_notavail + 1 - tzsources_notavail(isrc_notavail) = tpbudget%tsources(ji) - end if - end do - - !Reallocate/compact the source list - if ( Allocated( tpbudget%tsources ) ) Deallocate( tpbudget%tsources ) - Allocate( tpbudget%tsources( tpbudget%nsources ) ) - - tpbudget%nsourcesmax = tpbudget%nsources - !Limit the number of sources to the available list - tpbudget%nsources = isrc_avail - - !Fill the source list beginning with the available sources and finishing with the non-available ones - do ji = 1, isrc_avail - tpbudget%tsources(ji) = tzsources_avail(ji) - end do - - do ji = 1, isrc_notavail - tpbudget%tsources(isrc_avail + ji) = tzsources_notavail(ji) - end do - -end subroutine Sourcelist_sort_compact - - -subroutine Sourcelist_scan( tpbudget, hbulist ) - use modd_budget, only: tbudgetdata - - type(tbudgetdata), intent(inout) :: tpbudget - character(len=*), dimension(:), intent(in) :: hbulist - - character(len=:), allocatable :: yline - character(len=:), allocatable :: ysrc - character(len=:), dimension(:), allocatable :: ymsg - integer :: idx - integer :: igroup - integer :: igroup_idx - integer :: ipos - integer :: istart - integer :: ji - - istart = 1 - - ! Case 'LIST_AVAIL': list all the available source terms - if ( Size( hbulist ) > 0 ) then - if ( Trim( hbulist(1) ) == 'LIST_AVAIL' ) then - Allocate( character(len=65) :: ymsg(tpbudget%nsources + 1) ) - ymsg(1) = '---------------------------------------------------------------------' - ymsg(2) = 'Available source terms for budget ' // Trim( tpbudget%cname ) - Write( ymsg(3), '( A32, " ", A32 )' ) 'Name', 'Long name' - idx = 3 - do ji = 1, tpbudget%nsources - if ( All( tpbudget%tsources(ji)%cmnhname /= [ 'INIF' , 'ENDF', 'AVEF' ] ) ) then - idx = idx + 1 - Write( ymsg(idx), '( A32, " ", A32 )' ) tpbudget%tsources(ji)%cmnhname, tpbudget%tsources(ji)%clongname - end if - end do - ymsg(tpbudget%nsources + 1 ) = '---------------------------------------------------------------------' - call Print_msg_multi( NVERB_WARNING, 'BUD', 'Sourcelist_scan', ymsg ) - !To not read the 1st line again - istart = 2 - end if - end if - - ! Case 'LIST_ALL': list all the source terms - if ( Size( hbulist ) > 0 ) then - if ( Trim( hbulist(1) ) == 'LIST_ALL' ) then - Allocate( character(len=65) :: ymsg(tpbudget%nsourcesmax + 1) ) - ymsg(1) = '---------------------------------------------------------------------' - ymsg(2) = 'Source terms for budget ' // Trim( tpbudget%cname ) - Write( ymsg(3), '( A32, " ", A32 )' ) 'Name', 'Long name' - idx = 3 - do ji = 1, tpbudget%nsourcesmax - if ( All( tpbudget%tsources(ji)%cmnhname /= [ 'INIF' , 'ENDF', 'AVEF' ] ) ) then - idx = idx + 1 - Write( ymsg(idx), '( A32, " ", A32 )' ) tpbudget%tsources(ji)%cmnhname, tpbudget%tsources(ji)%clongname - end if - end do - ymsg(tpbudget%nsourcesmax + 1 ) = '---------------------------------------------------------------------' - call Print_msg_multi( NVERB_WARNING, 'BUD', 'Sourcelist_scan', ymsg ) - !To not read the 1st line again - istart = 2 - end if - end if - - ! Case 'ALL': enable all available source terms - if ( Size( hbulist ) > 0 ) then - if ( Trim( hbulist(1) ) == 'ALL' ) then - do ji = 1, tpbudget%nsources - tpbudget%tsources(ji)%ngroup = 1 - end do - return - end if - end if - - !Always enable INIF, ENDF and AVEF terms - ipos = Source_find( tpbudget, 'INIF' ) - if ( ipos < 1 ) call Print_msg( NVERB_FATAL, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) & - // ': INIF not found' ) - tpbudget%tsources(ipos)%ngroup = 1 - - ipos = Source_find( tpbudget, 'ENDF' ) - if ( ipos < 1 ) call Print_msg( NVERB_FATAL, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) & - // ': ENDF not found' ) - tpbudget%tsources(ipos)%ngroup = 1 - - ipos = Source_find( tpbudget, 'AVEF' ) - if ( ipos < 1 ) call Print_msg( NVERB_FATAL, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) & - // ': AVEF not found' ) - tpbudget%tsources(ipos)%ngroup = 1 - - !igroup_idx start at 2 because 1 is reserved for individually stored source terms - igroup_idx = 2 - - do ji = istart, Size( hbulist ) - if ( Len_trim( hbulist(ji) ) > 0 ) then - ! Scan the line and separate the different sources (separated by + signs) - yline = Trim(hbulist(ji)) - - idx = Index( yline, '+' ) - if ( idx < 1 ) then - igroup = 1 - else - igroup = igroup_idx - igroup_idx = igroup_idx + 1 - end if - - do - idx = Index( yline, '+' ) - if ( idx < 1 ) then - ysrc = yline - else - ysrc = yline(1 : idx - 1) - yline = yline(idx + 1 :) - end if - - !Check if the source is known - if ( Len_trim( ysrc ) > 0 ) then - ipos = Source_find( tpbudget, ysrc ) - - if ( ipos > 0 ) then - call Print_msg( NVERB_DEBUG, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) & - // ': ' // ysrc // ' found' ) - - if ( .not. tpbudget%tsources(ipos)%lavailable ) then - call Print_msg( NVERB_WARNING, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) & - // ': ' // ysrc // ' not available' ) - tpbudget%tsources(ipos)%ngroup = 0 - else - tpbudget%tsources(ipos)%ngroup = igroup - end if - else - call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) & - // ': ' // ysrc // ' not found' ) - end if - end if - - if ( idx < 1 ) exit - end do - end if - end do -end subroutine Sourcelist_scan - - -subroutine Sourcelist_nml_compact( tpbudget, hbulist ) - !This subroutine reduce the size of the hbulist to the minimum - !The list is generated from the group list - use modd_budget, only: NBULISTMAXLEN, tbudgetdata - - type(tbudgetdata), intent(in) :: tpbudget - character(len=NBULISTMAXLEN), dimension(:), allocatable, intent(inout) :: hbulist - - integer :: idx - integer :: isource - integer :: jg - integer :: js - - if ( Allocated( hbulist ) ) Deallocate( hbulist ) - - if ( tpbudget%ngroups < 3 ) then - call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_nml_compact', 'ngroups is too small' ) - return - end if - - Allocate( character(len=NBULISTMAXLEN) :: hbulist(tpbudget%ngroups - 3) ) - hbulist(:) = '' - - idx = 0 - do jg = 1, tpbudget%ngroups - if ( tpbudget%tgroups(jg)%nsources < 1 ) then - call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_nml_compact', 'no source for group' ) - cycle - end if - - !Do not put 'INIF', 'ENDF', 'AVEF' in hbulist because their presence is automatic if the corresponding budget is enabled - isource = tpbudget%tgroups(jg)%nsourcelist(1) - if ( Any( tpbudget%tsources(isource)%cmnhname == [ 'INIF', 'ENDF', 'AVEF' ] ) ) cycle - - idx = idx + 1 -#if 0 - !Do not do this way because the group cmnhname may be truncated (NMNHNAMELGTMAX is smaller than NBULISTMAXLEN) - !and the name separator is different ('_') - hbulist(idx) = Trim( tpbudget%tgroups(jg)%cmnhname ) -#else - do js = 1, tpbudget%tgroups(jg)%nsources - isource = tpbudget%tgroups(jg)%nsourcelist(js) - hbulist(idx) = Trim( hbulist(idx) ) // Trim( tpbudget%tsources(isource)%cmnhname ) - if ( js < tpbudget%tgroups(jg)%nsources ) hbulist(idx) = Trim( hbulist(idx) ) // '+' - end do -#endif - end do -end subroutine Sourcelist_nml_compact - - -subroutine Sourcelist_sv_nml_compact( hbulist ) - !This subroutine reduce the size of the hbulist - !For SV variables the reduction is simpler than for other variables - !because it is too complex to do this cleanly (the enabled source terms are different for each scalar variable) - use modd_budget, only: NBULISTMAXLEN, tbudgetdata - - character(len=*), dimension(:), allocatable, intent(inout) :: hbulist - - character(len=NBULISTMAXLEN), dimension(:), allocatable :: ybulist_new - integer :: ilines - integer :: ji - - ilines = 0 - do ji = 1, Size( hbulist ) - if ( Len_trim(hbulist(ji)) > 0 ) ilines = ilines + 1 - end do - - Allocate( ybulist_new(ilines) ) - - ilines = 0 - do ji = 1, Size( hbulist ) - if ( Len_trim(hbulist(ji)) > 0 ) then - ilines = ilines + 1 - ybulist_new(ilines) = Trim( hbulist(ji) ) - end if - end do - - call Move_alloc( from = ybulist_new, to = hbulist ) -end subroutine Sourcelist_sv_nml_compact - - -pure function Source_find( tpbudget, hsource ) result( ipos ) - use modd_budget, only: tbudgetdata - - type(tbudgetdata), intent(in) :: tpbudget - character(len=*), intent(in) :: hsource - integer :: ipos - - integer :: ji - logical :: gfound - - ipos = -1 - gfound = .false. - do ji = 1, tpbudget%nsourcesmax - if ( Trim( hsource ) == Trim ( tpbudget%tsources(ji)%cmnhname ) ) then - gfound = .true. - ipos = ji - exit - end if - end do - -end function Source_find - -end module mode_ini_budget diff --git a/src/PHYEX/ext/ini_elecn.f90 b/src/PHYEX/ext/ini_elecn.f90 deleted file mode 100644 index e00ea14d3..000000000 --- a/src/PHYEX/ext/ini_elecn.f90 +++ /dev/null @@ -1,327 +0,0 @@ -!MNH_LIC Copyright 2009-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ###################### - MODULE MODI_INI_ELEC_n -! ###################### -! -INTERFACE - SUBROUTINE INI_ELEC_n (KLUOUT, HELEC, HCLOUD, TPINIFILE, & - PTSTEP, PZZ, & - PDXX, PDYY, PDZZ, PDZX, PDZY ) -! -USE MODD_IO, ONLY : TFILEDATA -! -INTEGER, INTENT(IN) :: KLUOUT ! Logical unit number for prints -CHARACTER (LEN=4), INTENT(IN) :: HELEC ! atmospheric electricity scheme -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! microphysics scheme -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE! Initial file -REAL, INTENT(IN) :: PTSTEP ! Time STEP -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height z -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! metric coefficient dzx -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! metric coefficient dzy -! -END SUBROUTINE INI_ELEC_n -END INTERFACE -END MODULE MODI_INI_ELEC_n -! -! ######################################################### - SUBROUTINE INI_ELEC_n(KLUOUT, HELEC, HCLOUD, TPINIFILE, & - PTSTEP, PZZ, & - PDXX, PDYY, PDZZ, PDZX, PDZY ) -! ######################################################### -! -!! PURPOSE -!! ------- -! The purpose of this routine is to initialize the variables -! of the atmospheric electricity scheme -! -!! METHOD -!! ------ -!! The initialization of the scheme is performed as follows : -!! -!! EXTERNAL -!! -------- -!! CLEANLIST_ll : deaalocate a list -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! C. Barthe * Laboratoire de l'Atmosphère et des Cyclones * -!! -!! MODIFICATIONS -!! ------------- -!! Original 09/11/09 -!! M. Chong 13/05/11 Add computation of specific parameters for solving -!! the electric field equation (elements of tri-diag -!! matrix) -!! J.-P. Pinty 13/04/12 Add elec_trid to initialise the tridiagonal syst. -!! J.-P. Pinty 01/07/12 Add a non-homogeneous Neuman fair-weather -!! boundary condition at the top -!! J.-P. Pinty 15/11/13 Initialize the flash maps -!! 10/2016 (C.Lac) Add droplet deposition -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CLOUDPAR_n, ONLY : NSPLITR -USE MODD_CONF, ONLY : CEQNSYS,CCONF,CPROGRAM -USE MODD_CONF_n, ONLY : NRR -USE MODD_CST -USE MODD_DIM_n, ONLY : NIMAX_ll, NJMAX_ll -USE MODD_DYN -USE MODD_DYN_n, ONLY : XRHOM, XTRIGSX, XTRIGSY, XAF, XCF, XBFY, XBFB, XDXHATM, & - XDYHATM, NIFAXX, NIFAXY, XBF_SXP2_YP1_Z -USE MODD_ELEC_DESCR -USE MODD_ELEC_FLASH -USE MODD_ELEC_n, ONLY : XRHOM_E, XAF_E, XCF_E, XBFY_E, XBFB_E, XBF_SXP2_YP1_Z_E -USE MODD_GET_n, ONLY : CGETINPRC, CGETINPRR, CGETINPRS, CGETINPRG, CGETINPRH, & - CGETCLOUD, CGETSVT -USE MODD_GRID_n, ONLY : XMAP, XDXHAT, XDYHAT -USE MODD_IO, ONLY : TFILEDATA -USE MODD_LBC_n, ONLY : CLBCX, CLBCY -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_PARAM_C2R2, ONLY : LDEPOC -USE MODD_PARAMETERS, ONLY : JPVEXT, JPHEXT -USE MODD_PARAM_ICE_n, ONLY : LDEPOSC -USE MODD_PRECIP_n, ONLY : XINPRR, XACPRR, XINPRS, XACPRS, XINPRG, XACPRG, & - XINPRH, XACPRH, XINPRC, XACPRC, XINPRR3D, XEVAP3D,& - XINDEP,XACDEP -USE MODD_REF -USE MODD_REF_n, ONLY : XRHODJ, XTHVREF -USE MODD_TIME -! -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODE_ll -use mode_msg -! -USE MODI_ELEC_TRIDZ -USE MODI_INI_CLOUD -USE MODI_INI_FIELD_ELEC -USE MODI_INI_FLASH_GEOM_ELEC -USE MODI_INI_PARAM_ELEC -USE MODI_INI_RAIN_ICE_ELEC -USE MODI_READ_PRECIP_FIELD -! -! -IMPLICIT NONE -! -!* 0.1 declarations of dummy arguments -! -INTEGER, INTENT(IN) :: KLUOUT ! Logical unit number for prints -CHARACTER (LEN=4), INTENT(IN) :: HELEC ! atmospheric electricity scheme -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! microphysics scheme -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE! Initial file -REAL, INTENT(IN) :: PTSTEP ! Time STEP -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height z -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! metric coefficient dzx -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! metric coefficient dzy -! -!* 0.2 declarations of local variables -! -INTEGER :: ILUOUT ! Logical unit number of output-listing -! -INTEGER :: IIU ! Upper dimension in x direction (local) -INTEGER :: IJU ! Upper dimension in y direction (local) -INTEGER :: IKU ! Upper dimension in z direction -INTEGER :: IKB, IKE -INTEGER :: JK ! Loop vertical index -INTEGER :: IINFO_ll ! Return code of // routines -INTEGER :: IINTVL ! Number of intervals to integrate the kernels -REAL :: ZFDINFTY ! Factor used to define the "infinite" diameter -! -REAL :: ZRHO00 ! Surface reference air density -REAL :: ZDZMIN -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDZ ! mesh size -CHARACTER (LEN=3) :: YEQNSYS -! -! -!------------------------------------------------------------------------------- -! -!* 0. PROLOGUE -! -------- -! -ILUOUT = TLUOUT%NLU -! -CALL GET_DIM_EXT_ll('B',IIU,IJU) -IKU = SIZE(PZZ,3) -! -!------------------------------------------------------------------------------- -! -!* 1. ALLOCATE Module MODD_PRECIP_n -! ----------------------------- -! -IF (HCLOUD(1:3) == 'ICE') THEN - ALLOCATE( XINPRR(IIU,IJU) ) - ALLOCATE( XINPRR3D(IIU,IJU,IKU) ) - ALLOCATE( XEVAP3D(IIU,IJU,IKU) ) - ALLOCATE( XACPRR(IIU,IJU) ) - XINPRR(:,:) = 0.0 - XACPRR(:,:) = 0.0 - XINPRR3D(:,:,:) = 0.0 - XEVAP3D(:,:,:) = 0.0 - ALLOCATE( XINPRC(IIU,IJU) ) - ALLOCATE( XACPRC(IIU,IJU) ) - XINPRC(:,:) = 0.0 - XACPRC(:,:) = 0.0 - ALLOCATE( XINPRS(IIU,IJU) ) - ALLOCATE( XACPRS(IIU,IJU) ) - XINPRS(:,:) = 0.0 - XACPRS(:,:) = 0.0 - ALLOCATE( XINPRG(IIU,IJU) ) - ALLOCATE( XACPRG(IIU,IJU) ) - XINPRG(:,:) = 0.0 - XACPRG(:,:) = 0.0 -END IF -! -IF (HCLOUD == 'ICE4') THEN - ALLOCATE( XINPRH(IIU,IJU) ) - ALLOCATE( XACPRH(IIU,IJU) ) - XINPRH(:,:) = 0.0 - XACPRH(:,:) = 0.0 -ELSE - ALLOCATE( XINPRH(0,0) ) - ALLOCATE( XACPRH(0,0) ) -END IF -! -IF ( LDEPOSC) THEN - ALLOCATE(XINDEP(IIU,IJU)) - ALLOCATE(XACDEP(IIU,IJU)) - XINDEP(:,:)=0.0 - XACDEP(:,:)=0.0 -ELSE - ALLOCATE(XINDEP(0,0)) - ALLOCATE(XACDEP(0,0)) -END IF -! -IF(SIZE(XINPRR) == 0) RETURN -! -! -!------------------------------------------------------------------------------- -! -!* 2. Initialize MODD_PRECIP_n variables -! ----------------------------------- -! -CALL READ_PRECIP_FIELD (TPINIFILE, CPROGRAM, CCONF, & - CGETINPRC,CGETINPRR,CGETINPRS,CGETINPRG,CGETINPRH, & - XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D, & - XACPRR, XINPRS, XACPRS, XINPRG, XACPRG, XINPRH, XACPRH) -! -! -!------------------------------------------------------------------------------- -! -!* 3. INITIALIZE THE PARAMETERS -!* FOR THE MICROPHYSICS AND THE ELECTRICITY -! ---------------------------------------- -! -!* 3.1 Compute the minimun vertical mesh size -! -ALLOCATE( ZDZ(IIU,IJU,IKU) ) -ZDZ(:,:,:) = 0. -! -IKB = 1 + JPVEXT -IKE = SIZE(PZZ,3) - JPVEXT -! -DO JK = IKB, IKE - ZDZ(:,:,JK) = PZZ(:,:,JK+1) - PZZ(:,:,JK) -END DO -ZDZMIN = MIN_ll (ZDZ,IINFO_ll,1,1,IKB,NIMAX_ll+2*JPHEXT,NJMAX_ll+2*JPHEXT,IKE ) -! -DEALLOCATE(ZDZ) -! -! -IF (HELEC(1:3) == 'ELE') THEN -! -! -!* 3.2 initialize the parameters for the mixed-phase microphysics -!* and the electrification -! - CALL INI_RAIN_ICE_ELEC (KLUOUT, PTSTEP, ZDZMIN, NSPLITR, HCLOUD, & - IINTVL, ZFDINFTY) -! -! -!* 3.3 initialize the electrical parameters -! - ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB)) -! - CALL INI_PARAM_ELEC (TPINIFILE, CGETSVT, ZRHO00, NRR, IINTVL, & - ZFDINFTY, IIU, IJU, IKU) -! -! -!* 3.4 initialize the parameters for the electric field -! - IF (LINDUCTIVE .OR. ((.NOT. LOCG) .AND. LELEC_FIELD)) THEN - CALL INI_FIELD_ELEC (PDXX, PDYY, PDZZ, PDZX, PDZY, PZZ) - END IF -! -! -!* 3.5 initialize the parameters for the lightning flashes -! - IF (.NOT. LOCG) THEN - IF (LFLASH_GEOM) THEN - CALL INI_FLASH_GEOM_ELEC - ELSE - call Print_msg( NVERB_FATAL, 'GEN', 'INI_ELEC_n', 'INI_LIGHTNING_ELEC not yet developed' ) - END IF - END IF -! -ELSE IF (HELEC /= 'NONE') THEN - call Print_msg( NVERB_FATAL, 'GEN', 'INI_ELEC_n', 'not yet developed for CELEC='//trim(HELEC) ) -END IF -! -!* 3.6 initialize the parameters for the resolution of the electric field -! -YEQNSYS = CEQNSYS -CEQNSYS = 'LHE' -! Force any CEQNSYS (DUR, MAE, LHE) to LHE to obtain a unique set of coefficients -! for the flat laplacian operator and Return to the original CEQNSYS - -ALLOCATE (XRHOM_E(SIZE(XRHOM))) -ALLOCATE (XAF_E(SIZE(XAF))) -ALLOCATE (XCF_E(SIZE(XCF))) -ALLOCATE (XBFY_E(SIZE(XBFY,1),SIZE(XBFY,2),SIZE(XBFY,3))) -ALLOCATE (XBFB_E(SIZE(XBFB,1),SIZE(XBFB,2),SIZE(XBFB,3))) -ALLOCATE (XBF_SXP2_YP1_Z_E(SIZE(XBF_SXP2_YP1_Z,1),SIZE(XBF_SXP2_YP1_Z,2),& - SIZE(XBF_SXP2_YP1_Z,3))) -! -CALL ELEC_TRIDZ (CLBCX,CLBCY, & - XMAP,XDXHAT,XDYHAT,XDXHATM,XDYHATM,XRHOM_E,XAF_E, & - XCF_E,XTRIGSX,XTRIGSY,NIFAXX,NIFAXY, & - XRHODJ,XTHVREF,PZZ,XBFY_E,XEPOTFW_TOP, & - XBFB_E,XBF_SXP2_YP1_Z_E) -! -CEQNSYS=YEQNSYS -! -!* 3.7 initialize the flash maps -! -ALLOCATE( NMAP_TRIG_IC(IIU,IJU) ); NMAP_TRIG_IC(:,:) = 0 -ALLOCATE( NMAP_IMPACT_CG(IIU,IJU) ); NMAP_IMPACT_CG(:,:) = 0 -ALLOCATE( NMAP_2DAREA_IC(IIU,IJU) ); NMAP_2DAREA_IC(:,:) = 0 -ALLOCATE( NMAP_2DAREA_CG(IIU,IJU) ); NMAP_2DAREA_CG(:,:) = 0 -ALLOCATE( NMAP_3DIC(IIU,IJU,IKU) ); NMAP_3DIC(:,:,:) = 0 -ALLOCATE( NMAP_3DCG(IIU,IJU,IKU) ); NMAP_3DCG(:,:,:) = 0 -! -!------------------------------------------------------------------------------- -! -! -END SUBROUTINE INI_ELEC_n diff --git a/src/PHYEX/ext/ini_flash_geom_elec.f90 b/src/PHYEX/ext/ini_flash_geom_elec.f90 deleted file mode 100644 index 3c5faece3..000000000 --- a/src/PHYEX/ext/ini_flash_geom_elec.f90 +++ /dev/null @@ -1,148 +0,0 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -! ############################### - MODULE MODI_INI_FLASH_GEOM_ELEC -! ############################### -! -INTERFACE -! - SUBROUTINE INI_FLASH_GEOM_ELEC -! -END SUBROUTINE INI_FLASH_GEOM_ELEC -END INTERFACE -END MODULE MODI_INI_FLASH_GEOM_ELEC -! -! ############################## - SUBROUTINE INI_FLASH_GEOM_ELEC -! ############################## -! -!!**** *INI_FLASH_GEOM_ELEC* - routine to initialize the lightning flashes -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to initialize the variables -! of the lightning flashes routine -! -!!** METHOD -!! ------ -!! The initialization of the scheme is performed as follows : -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! -!! MODIFICATIONS -!! ------------- -!! Original 29/11/02 -!! -!! Modifications -!! J.-P. Pinty jan 2015 : add LMA simulator -!! J.Escobar 20/06/2018 : truly set NBRANCH_MAX = 5000 ! -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY : XPI -USE MODD_RAIN_ICE_DESCR_n -USE MODD_ELEC_DESCR -USE MODD_ELEC_PARAM -USE MODD_DIM_n, ONLY : NKMAX -USE MODD_TIME_n, ONLY : TDTCUR -USE MODD_LMA_SIMULATOR, ONLY : LLMA, TDTLMA, LWRITE_LMA, XDTLMA, CLMA_FILE -! -USE MODI_MOMG -! -IMPLICIT NONE -! -!* 0.1 Declaration of dummy arguments -! -! -!* 0.2 Declaration of local variables -! -! -!---------------------------------------------------------------------------- -! -!* 1. SOME CONSTANTS FOR NEUTRALIZATION -! --------------------------------- -! -XFQLIGHTC = 660. * MOMG(3.,3.,2.) / MOMG(3.,3.,3.) ! PI/A*lbda^(b-2) = 660. -! -XFQLIGHTR = XPI * XCCR * MOMG(XALPHAR,XNUR,2.) -XEXQLIGHTR = XCXR - 2. -! -XEXQLIGHTI = 2. / XBI -XFQLIGHTI = XPI / 4. * MOMG(XALPHAI,XNUI,2.) * & - (XAI * MOMG(XALPHAI,XNUI,XBI))**(-XEXQLIGHTI) -! -XFQLIGHTS = XPI * XCCS * MOMG(XALPHAS,XNUS,2.) -XEXQLIGHTS = XCXS - 2. -! -XFQLIGHTG = XPI * XCCG * MOMG(XALPHAG,XNUG,2.) -XEXQLIGHTG = XCXG - 2. -! -! -!---------------------------------------------------------------------------- -! -!* 2. INITIALIZE SOME THRESHOLDS -! -------------------------- -! -! electric field threshold for cell detection -! from Marshall et al. (1995) JGR, the breakeven electric field is -! 200 kV/m at the ground, ~ 33 kV/m at 15 km, and ~ 18 kV/m at 20 km height. -! To be sure all the electrified cells are detected, this threshold is set to -! 20 kV/m -XE_THRESH = 35.E3 ! (V/m) -! -! the maximum of segments in the bi-leader corresponds to the number of -! altitude levels in the domain since the bi-leader is hypothesized to -! propagate only along the vertical -NLEADER_MAX = NKMAX -! -! the maximum number of branches is arbitriraly set to 5000 -NBRANCH_MAX = 5000 -! -! the maximum number of electrified cells in the domain is arbitrarily -! set to 10 -NMAX_CELL = 10 -! -! the altitude for CG to be prolongated to the ground is set to 2 km -! this threshold could be modified once ions will be taken into account -XALT_CG = 2000. ! m -! -! -!---------------------------------------------------------------------------- -! -!* 3. INITIALIZATIONS -! --------------- -! -NNBLIGHT = 0 -NNB_CG = 0 -NNB_CG_POS = 0 -! -! -!---------------------------------------------------------------------------- -! -!* 4. INITIALIZE LMA RECORDS -! ---------------------- -! -! needs LLMA = .TRUE. to operate -XDTLMA = 600. -TDTLMA = TDTCUR -LWRITE_LMA = .FALSE. -CLMA_FILE(1:5) = "BEGIN" -! -!---------------------------------------------------------------------------- -! -END SUBROUTINE INI_FLASH_GEOM_ELEC diff --git a/src/PHYEX/ext/ini_lb.f90 b/src/PHYEX/ext/ini_lb.f90 deleted file mode 100644 index faa09698b..000000000 --- a/src/PHYEX/ext/ini_lb.f90 +++ /dev/null @@ -1,730 +0,0 @@ -!MNH_LIC Copyright 1998-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ###################### - MODULE MODI_INI_LB -! ###################### -! -INTERFACE -! -SUBROUTINE INI_LB(TPINIFILE,OLSOURCE,KSV, & - KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll, & - KSIZELBXTKE_ll,KSIZELBYTKE_ll, & - KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & - HGETTKEM,HGETRVM,HGETRCM,HGETRRM,HGETRIM,HGETRSM, & - HGETRGM,HGETRHM,HGETSVM, & - PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & - PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & - PLBXUMM,PLBXVMM,PLBXWMM,PLBXTHMM,PLBXTKEMM,PLBXRMM,PLBXSVMM, & - PLBYUMM,PLBYVMM,PLBYWMM,PLBYTHMM,PLBYTKEMM,PLBYRMM,PLBYSVMM, & - PLENG ) -! -USE MODD_IO, ONLY: TFILEDATA -! -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file -LOGICAL, INTENT(IN) :: OLSOURCE ! switch for the source term -! Larger Scale fields (source if OLSOURCE=T, fields at time t-dt if OLSOURCE=F) : -INTEGER, INTENT(IN) :: KSV ! number of passive variables -! sizes of the West-east total LB area -INTEGER, INTENT(IN) :: KSIZELBX_ll,KSIZELBXU_ll ! for T,V,W and u -INTEGER, INTENT(IN) :: KSIZELBXTKE_ll ! for TKE -INTEGER, INTENT(IN) :: KSIZELBXR_ll,KSIZELBXSV_ll ! for Rx and SV -! sizes of the North-south total LB area -INTEGER, INTENT(IN) :: KSIZELBY_ll,KSIZELBYV_ll ! for T,U,W and v -INTEGER, INTENT(IN) :: KSIZELBYTKE_ll ! for TKE -INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll ! for Rx and SV -! Get indicators -CHARACTER (LEN=*), INTENT(IN) :: HGETTKEM, & - HGETRVM,HGETRCM,HGETRRM, & - HGETRIM,HGETRSM,HGETRGM,HGETRHM -CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVM -! LB fields (source if OLSOURCE=T, fields at time t-dt if OLSOURCE=F) : -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXUM,PLBXVM,PLBXWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBYUM,PLBYVM,PLBYWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBYTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXTKEM ! TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBYTKEM -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PLBXRM ,PLBXSVM ! Moisture and SV -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PLBYRM ,PLBYSVM ! in x and y-dir. -! LB arrays at time t-dt (if OLSOURCE=T) : -REAL, DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PLBXUMM,PLBXVMM,PLBXWMM ! Wind -REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL :: PLBXTHMM ! Mass -REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL :: PLBYUMM,PLBYVMM,PLBYWMM ! Wind -REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL :: PLBYTHMM ! Mass -REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL :: PLBXTKEMM ! TKE -REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL :: PLBYTKEMM -REAL, DIMENSION(:,:,:,:),INTENT(IN), OPTIONAL :: PLBXRMM ,PLBXSVMM ! Moisture and SV -REAL, DIMENSION(:,:,:,:),INTENT(IN), OPTIONAL :: PLBYRMM ,PLBYSVMM ! in x and y-dir. -REAL, INTENT(IN), OPTIONAL :: PLENG ! Interpolation length -! -END SUBROUTINE INI_LB -! -END INTERFACE -! -END MODULE MODI_INI_LB -! ############################################################ -SUBROUTINE INI_LB(TPINIFILE,OLSOURCE,KSV, & - KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll, & - KSIZELBXTKE_ll,KSIZELBYTKE_ll, & - KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & - HGETTKEM,HGETRVM,HGETRCM,HGETRRM,HGETRIM,HGETRSM, & - HGETRGM,HGETRHM,HGETSVM, & - PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & - PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & - PLBXUMM,PLBXVMM,PLBXWMM,PLBXTHMM,PLBXTKEMM,PLBXRMM,PLBXSVMM, & - PLBYUMM,PLBYVMM,PLBYWMM,PLBYTHMM,PLBYTKEMM,PLBYRMM,PLBYSVMM, & - PLENG ) -! ############################################################ -! -!!**** *INI_LB* - routine to initialize LB fields -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to read the LB fields and to distribute -! on subdomain which have a non-nul intersection with the LB areas. -! In case of OLSOURCE=T, it initializes the LB sources instead of the -! LB fields at time t-dt -! -!!** METHOD -!! ------ -!! The LB fields are read in file and distributed by FMREAD_LB -!! -!! In case of OLSOURCE=T (INI_LB called by INI_CPL or LS_COUPLING), the LB sources -!! are computed -!! -!! -!! EXTERNAL -!! -------- -!! FMREAD : to read data in LFIFM file -!! FMREAD_LB : to read LB data in LFIFM file -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CONF : NVERB -!! -!! REFERENCE -!! --------- -!! Book2 of the documentation (routine INI_LB) -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq * Meteo France * -!! D. Gazen L.A. -!! -!! MODIFICATIONS -!! ------------- -!! Original 22/09/98 FMREAD_LB handle LBs fields -!! J. Stein 18/09/99 problem with the dry case -!! D. Gazen 22/01/01 treat NSV_* with floating indices -!! F Gheusi 29/10/03 bug in LB sources for NSV -!! J.-P. Pinty 06/05/04 treat NSV_* for C1R3 and ELEC -!! 20/05/06 Remove KEPS -!! C.Lac 20/03/08 Add passive pollutants -!! M.Leriche 16/07/10 Add ice phase chemical species -!! Pialat/tulet 15/02/12 Add ForeFire scalars -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! M.Leriche 09/02/16 Treat gas and aq. chemicals separately -!! J.Escobar : 27/04/2016 : bug , test only on ANY(HGETSVM({{1:KSV}})=='READ' -!! J.-P. Pinty 09/02/16 Add LIMA that is LBC for CCN and IFN -!! M.Leriche 09/02/16 Treat gas and aq. chemicals separately -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 13/02/2019: initialize PLBXSVM and PLBYSVM in all cases -! S. Bielli 02/2019: Sea salt: significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -USE MODD_TURB_n, ONLY: XTKEMIN -USE MODD_CONF, ONLY: LCPL_AROME -use modd_field, only: NMNHDIM_UNKNOWN, tfieldmetadata, TYPELOG, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_NSV, ONLY: NSV, NSV_CS, NSV_CSBEG, NSV_CSEND, NSV_LIMA_BEG, NSV_LIMA_END, & -#ifdef MNH_FOREFIRE - NSV_FF, NSV_FFBEG, NSV_FFEND, & -#endif - NSV_LIMA_CCN_FREE, NSV_LIMA_IFN_FREE, NSV_PP, NSV_PPBEG, NSV_PPEND, & - NSV_SNWBEG, NSV_SNWEND, NSV_USER, TSVLIST -USE MODD_PARAMETERS, ONLY: JPHEXT, JPSVNAMELGTMAX, NLONGNAMELGTMAX, NMNHNAMELGTMAX -USE MODD_PARAM_LIMA, ONLY: NMOD_CCN, NMOD_IFN -! -USE MODE_IO_FIELD_READ, only: IO_Field_read, IO_Field_read_lb -USE MODE_MSG -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -! -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file -LOGICAL, INTENT(IN) :: OLSOURCE ! switch for the source term -! Larger Scale fields (source if OLSOURCE=T, fields at time t-dt if OLSOURCE=F) : -INTEGER, INTENT(IN) :: KSV ! number of passive variables -! sizes of the West-east total LB area -INTEGER, INTENT(IN) :: KSIZELBX_ll,KSIZELBXU_ll ! for T,V,W and u -INTEGER, INTENT(IN) :: KSIZELBXTKE_ll ! for TKE -INTEGER, INTENT(IN) :: KSIZELBXR_ll,KSIZELBXSV_ll ! for Rx and SV -! sizes of the North-south total LB area -INTEGER, INTENT(IN) :: KSIZELBY_ll,KSIZELBYV_ll ! for T,U,W and v -INTEGER, INTENT(IN) :: KSIZELBYTKE_ll ! for TKE -INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll ! for Rx and SV -! Get indicators -CHARACTER (LEN=*), INTENT(IN) :: HGETTKEM, & - HGETRVM,HGETRCM,HGETRRM, & - HGETRIM,HGETRSM,HGETRGM,HGETRHM -CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVM -! LB fields (source if OLSOURCE=T, fields at time t-dt if OLSOURCE=F) : -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXUM,PLBXVM,PLBXWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBYUM,PLBYVM,PLBYWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBYTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXTKEM ! TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBYTKEM ! -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PLBXRM ,PLBXSVM ! Moisture and SV -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PLBYRM ,PLBYSVM ! in x and y-dir. -! LB arrays at time t-dt (if OLSOURCE=T) : -REAL, DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PLBXUMM,PLBXVMM,PLBXWMM ! Wind -REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL :: PLBXTHMM ! Mass -REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL :: PLBYUMM,PLBYVMM,PLBYWMM ! Wind -REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL :: PLBYTHMM ! Mass -REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL :: PLBXTKEMM ! TKE -REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL :: PLBYTKEMM -REAL, DIMENSION(:,:,:,:),INTENT(IN), OPTIONAL :: PLBXRMM ,PLBXSVMM ! Moisture and SV -REAL, DIMENSION(:,:,:,:),INTENT(IN), OPTIONAL :: PLBYRMM ,PLBYSVMM ! in x and y-dir. -REAL, INTENT(IN), OPTIONAL :: PLENG ! Interpolation length -! -! -!* 0.2 declarations of local variables -! -INTEGER :: ILBSIZEX,ILBSIZEY ! depth of the LB area in the RIM direction - ! written in FM file -INTEGER :: IL3DX,IL3DY ! Size of the LB arrays in FM file - ! in the RIM direction -INTEGER :: IL3DXU,IL3DYV ! Size of the LB arrays in FM file - ! in the RIM direction for the normal wind -INTEGER :: IRIMX,IRIMY ! Total size of the LB area (for the RIM direction) -INTEGER :: IRIMXU,IRIMYV ! Total size of the LB area (for the RIM direction) - ! for the normal wind (spatial gradient needed) - -INTEGER :: JSV,JRR ! Loop index for MOIST AND - ! additional scalar variables -INTEGER :: IRR ! counter for moist variables -INTEGER :: IRESP -LOGICAL :: GHORELAX_UVWTH ! switch for the horizontal relaxation for U,V,W,TH in the FM file -LOGICAL :: GHORELAX_TKE ! switch for the horizontal relaxation for tke in the FM file -LOGICAL :: GHORELAX_R, GHORELAX_SV ! switch for the horizontal relaxation - ! for moist and scalar variables -LOGICAL :: GIS551 ! True if file was written with MNH 5.5.1 -LOGICAL :: GOLDFILEFORMAT -CHARACTER (LEN= LEN(HGETRVM)), DIMENSION (7) :: YGETRXM ! Arrays with the get indicators - ! for the moist variables -CHARACTER (LEN=1), DIMENSION (7) :: YC ! array with the prefix of the moist variables -CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME_BASE -CHARACTER(LEN=NLONGNAMELGTMAX) :: YLONGNAME_BASE -TYPE(TFIELDMETADATA) :: TZFIELD -!------------------------------------------------------------------------------- -! -! -!* 0. READ CPL_AROME to know which LB_fileds there are to read -! -------------------- -IF ((TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)>8) .OR. TPINIFILE%NMNHVERSION(1)>4) THEN - CALL IO_Field_read(TPINIFILE,'CPL_AROME',LCPL_AROME) -ELSE - LCPL_AROME=.FALSE. -ENDIF -! -! -!* 1. SOME INITIALIZATIONS -! -------------------- -! -!If TPINIFILE file was written with a MesoNH version < 5.6, some variables had different names or were not available -GOLDFILEFORMAT = ( TPINIFILE%NMNHVERSION(1) < 5 & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 6 ) ) -GIS551 = TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 .AND. TPINIFILE%NMNHVERSION(3) == 1 -! -! -!------------------------------------------------------------------------------- -! -!* 2. READ 2D "surfacic" LB fields -! ---------------------------- -! -!* 2.1 read the number of available points for the horizontal relaxation -! for basic variables -CALL IO_Field_read(TPINIFILE,'RIMX',ILBSIZEX) -CALL IO_Field_read(TPINIFILE,'RIMY',ILBSIZEY) -! -!* 2.2 Basic variables -! -CALL IO_Field_read(TPINIFILE,'HORELAX_UVWTH',GHORELAX_UVWTH) - ! -IF (GHORELAX_UVWTH) THEN - IRIMX =(KSIZELBX_ll-2*JPHEXT)/2 - IRIMXU=(KSIZELBXU_ll-2*JPHEXT)/2 - IRIMY =(KSIZELBY_ll-2*JPHEXT)/2 - IRIMYV=(KSIZELBYV_ll-2*JPHEXT)/2 - IL3DX=2*ILBSIZEX+2*JPHEXT - IL3DXU=IL3DX - IL3DY=2*ILBSIZEY+2*JPHEXT - IL3DYV=IL3DY -ELSE - IRIMX=0 - IRIMXU=1 - IRIMY=0 - IRIMYV=1 - IL3DX=2*JPHEXT ! 2 - IL3DY=2*JPHEXT ! 2 - IL3DXU=2 + 2*JPHEXT ! 4 - IL3DYV=2 + 2*JPHEXT ! 4 -ENDIF -! -IF ( KSIZELBXU_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXUM', IL3DXU, IRIMXU, PLBXUM ) -IF ( KSIZELBX_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXVM', IL3DX, IRIMX, PLBXVM ) -IF ( KSIZELBX_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXWM', IL3DX, IRIMX, PLBXWM ) -IF ( KSIZELBY_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYUM', IL3DY, IRIMY, PLBYUM ) -IF ( KSIZELBYV_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYVM', IL3DYV, IRIMYV, PLBYVM ) -IF ( KSIZELBY_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYWM', IL3DY, IRIMY, PLBYWM ) -IF ( KSIZELBX_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXTHM', IL3DX, IRIMX, PLBXTHM ) -IF ( KSIZELBY_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYTHM', IL3DY, IRIMY, PLBYTHM ) -! -!* 2.3 LB-TKE -! -SELECT CASE(HGETTKEM) -CASE('READ') - IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN - IF (PRESENT(PLBXTKEMM).AND.PRESENT(PLBYTKEMM)) THEN - CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'LBXTKES and LBYTKE are initialized to PLBXTKEMM and PLBYTKEMM' ) - PLBXTKEM(:,:,:) = PLBXTKEMM(:,:,:) - PLBYTKEM(:,:,:) = PLBYTKEMM(:,:,:) - ELSE - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize LBXTKES and LBYTKES') - ENDIF - ELSE - CALL IO_Field_read(TPINIFILE,'HORELAX_TKE',GHORELAX_TKE) - IF (GHORELAX_TKE) THEN - IRIMX=(KSIZELBXTKE_ll-2*JPHEXT)/2 - IRIMY=(KSIZELBYTKE_ll-2*JPHEXT)/2 - IL3DX=2*ILBSIZEX+2*JPHEXT - IL3DY=2*ILBSIZEY+2*JPHEXT - ELSE - IRIMX=0 - IRIMY=0 - IL3DX=2*JPHEXT ! 2 - IL3DY=2*JPHEXT ! 2 - ENDIF -! - IF (KSIZELBXTKE_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBXTKEM',IL3DX,IRIMX,PLBXTKEM) - END IF -! - IF (KSIZELBYTKE_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBYTKEM',IL3DY,IRIMY,PLBYTKEM) - END IF - ENDIF -CASE('INIT') - IF (SIZE(PLBXTKEM,1) /= 0) PLBXTKEM(:,:,:) = XTKEMIN - IF (SIZE(PLBYTKEM,1) /= 0) PLBYTKEM(:,:,:) = XTKEMIN -END SELECT -! -! -!* 2.5 LB-Rx -! -IF(KSIZELBXR_ll > 0 ) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'HORELAX_R', & - CSTDNAME = '', & - CLONGNAME = 'HORELAX_R', & - CUNITS = '', & - CDIR = '--', & - CCOMMENT = 'Switch to activate the HOrizontal RELAXation', & - CLBTYPE = 'NONE', & - NGRID = 1, & - NTYPE = TYPELOG, & - NDIMS = 0, & - LTIMEDEP = .FALSE. ) - ! - CALL IO_Field_read(TPINIFILE,TZFIELD,GHORELAX_R) - ! - YGETRXM(:)=(/HGETRVM,HGETRCM,HGETRRM,HGETRIM,HGETRSM,HGETRGM,HGETRHM/) - YC(:)=(/"V","C","R","I","S","G","H"/) - IF (GHORELAX_R) THEN - IRIMX=(KSIZELBXR_ll-2*JPHEXT)/2 - IRIMY= (KSIZELBYR_ll-2*JPHEXT)/2 - IL3DX=2*ILBSIZEX+2*JPHEXT - IL3DY=2*ILBSIZEY+2*JPHEXT - ELSE - IRIMX=0 - IRIMY=0 - IL3DX=2*JPHEXT ! 2 - IL3DY=2*JPHEXT ! 2 - END IF - ! - TZFIELD = TFIELDMETADATA( & - CUNITS = 'kg kg-1', & - CDIR = '', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - IRR=0 - JRR=1 - SELECT CASE(YGETRXM(1)) - CASE('READ') - IRR=IRR+1 - IF ( KSIZELBXR_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBXR'//YC(JRR)//'M' - TZFIELD%CLONGNAME = 'LBXR'//YC(JRR)//'M' - TZFIELD%CLBTYPE = 'LBX' - TZFIELD%CCOMMENT = '2_Y_Z_LBXR'//YC(JRR)//'M' - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXRM(:,:,:,IRR)) - END IF - ! - IF ( KSIZELBYR_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBYR'//YC(JRR)//'M' - TZFIELD%CLONGNAME = 'LBYR'//YC(JRR)//'M' - TZFIELD%CLBTYPE = 'LBY' - TZFIELD%CCOMMENT = '2_Y_Z_LBYR'//YC(JRR)//'M' - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYRM(:,:,:,IRR)) - END IF - CASE('INIT') - IRR=IRR+1 - IF ( SIZE(PLBXRM,1) /= 0 ) PLBXRM(:,:,:,IRR) = 0. - IF ( SIZE(PLBYRM,1) /= 0 ) PLBYRM(:,:,:,IRR) = 0. - END SELECT - ! - ! - DO JRR=2,7 - SELECT CASE(YGETRXM(JRR)) - CASE('READ') - IRR=IRR+1 - IF ( KSIZELBXR_ll /= 0 ) THEN - IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN - IF (PRESENT(PLBXRMM)) THEN - PLBXRM(:,:,:,IRR)=PLBXRMM(:,:,:,IRR) - CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBXRM is initialized to PLBXRMM for LBXR'//YC(JRR)//'M' ) - ELSE - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBXRM for LBXR'//YC(JRR)//'M') - ENDIF - ELSE - TZFIELD%CMNHNAME = 'LBXR'//YC(JRR)//'M' - TZFIELD%CLONGNAME = 'LBXR'//YC(JRR)//'M' - TZFIELD%CLBTYPE = 'LBX' - TZFIELD%CCOMMENT = '2_Y_Z_LBXR'//YC(JRR)//'M' - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXRM(:,:,:,IRR)) - ENDIF - END IF - ! - IF ( KSIZELBYR_ll /= 0 ) THEN - IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN - IF (PRESENT(PLBYRMM)) THEN - PLBYRM(:,:,:,IRR)=PLBYRMM(:,:,:,IRR) - CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBYRM is initialized to PLBYRMM for LBYR'//YC(JRR)//'M' ) - ELSE - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBYRM for LBYR'//YC(JRR)//'M') - ENDIF - ELSE - TZFIELD%CMNHNAME = 'LBYR'//YC(JRR)//'M' - TZFIELD%CLONGNAME = 'LBYR'//YC(JRR)//'M' - TZFIELD%CLBTYPE = 'LBY' - TZFIELD%CCOMMENT = '2_Y_Z_LBYR'//YC(JRR)//'M' - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYRM(:,:,:,IRR)) - ENDIF - END IF - CASE('INIT') - IRR=IRR+1 - IF ( SIZE(PLBXRM,1) /= 0 ) PLBXRM(:,:,:,IRR) = 0. - IF ( SIZE(PLBYRM,1) /= 0 ) PLBYRM(:,:,:,IRR) = 0. - END SELECT - END DO -END IF -! -!* 2.6 LB-Scalar Variables -! -IF (KSV > 0) THEN - IF (ANY(HGETSVM(1:KSV)=='READ')) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'HORELAX_SV', & - CSTDNAME = '', & - CLONGNAME = 'HORELAX_SV', & - CUNITS = '', & - CDIR = '--', & - CCOMMENT = '', & - CLBTYPE = 'NONE', & - NGRID = 0, & - NTYPE = TYPELOG, & - NDIMS = 0, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read( TPINIFILE, TZFIELD, GHORELAX_SV ) - - IF ( GHORELAX_SV ) THEN - IRIMX=(KSIZELBXSV_ll-2*JPHEXT)/2 - IRIMY=(KSIZELBYSV_ll-2*JPHEXT)/2 - IL3DX=2*ILBSIZEX+2*JPHEXT - IL3DY=2*ILBSIZEY+2*JPHEXT - ELSE - IRIMX=0 - IRIMY=0 - IL3DX=2*JPHEXT - IL3DY=2*JPHEXT - END IF - END IF -END IF - -! Scalar variables -DO JSV = 1, NSV - SELECT CASE( HGETSVM(JSV) ) - CASE ( 'READ' ) - TZFIELD = TSVLIST(JSV) - TZFIELD%CDIR = '' - TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN - YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) - YLONGNAME_BASE = TRIM( TZFIELD%CLONGNAME ) - - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) - TZFIELD%CLONGNAME = 'LBX_' // TRIM( YLONGNAME_BASE ) - - !Some variables were written with an other name in MesoNH < 5.6 - IF ( GOLDFILEFORMAT ) THEN - IF ( JSV >= 1 .AND. JSV <= NSV_USER ) THEN - WRITE( TZFIELD%CMNHNAME, '( A6, I3.3 )' ) 'LBXSVM',JSV - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME ) - ELSE IF ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN - ! Name was corrected in MNH 5.5.1 - IF ( .NOT. GIS551 ) CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME, TZFIELD%CLONGNAME ) - TZFIELD%CSTDNAME = '' - ELSE IF ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) THEN - TZFIELD%CMNHNAME = 'LBX_PP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LBX_PP' - IF ( JSV == NSV_PPBEG .AND. NSV_PP > 1 ) THEN - CMNHMSG(1) = 'reading older file (<5.6) for LBX_PP scalar variables' - CMNHMSG(2) = 'they are bugged: there should be several LBX_PP variables' - CMNHMSG(3) = 'but they were all written with the same name ''LBX_PP''' - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) - END IF -#ifdef MNH_FOREFIRE - ELSE IF ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) THEN - TZFIELD%CMNHNAME = 'LBX_FF' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LBX_FF' - IF ( JSV == NSV_FFBEG .AND. NSV_FF > 1 ) THEN - CMNHMSG(1) = 'reading older file (<5.6) for LBX_FF scalar variables' - CMNHMSG(2) = 'they are bugged: there should be several LBX_FF variables' - CMNHMSG(3) = 'but they were all written with the same name ''LBX_FF''' - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) - END IF -#endif - ELSE IF ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) THEN - TZFIELD%CMNHNAME = 'LBX_CS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LBX_CS' - IF ( JSV == NSV_CSBEG .AND. NSV_CS > 1 ) THEN - CMNHMSG(1) = 'reading older file (<5.6) for LBX_CS scalar variables' - CMNHMSG(2) = 'they are bugged: there should be several LBX_CS variables' - CMNHMSG(3) = 'but they were all written with the same name ''LBX_CS''' - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) - END IF - END IF - END IF - - WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 )' ) '2_Y_Z_', 'LBXSVM', JSV - TZFIELD%CLBTYPE = 'LBX' - - CALL IO_Field_read_lb( TPINIFILE, TZFIELD, IL3DX, IRIMX, PLBXSVM(:,:,:,JSV), IRESP ) - - IF ( IRESP /= 0 ) THEN - IF ( PRESENT( PLBXSVMM ) ) THEN - PLBXSVM(:,:,:,JSV) = PLBXSVMM(:,:,:,JSV) - CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBXSVM is initialized to PLBXSVMM for ' // TRIM( YMNHNAME_BASE ) ) - ELSE - IF ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN - PLBXSVM(:,:,:,JSV) = 0. - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBXSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) ) - ELSE IF ( ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. & -#ifdef MNH_FOREFIRE - ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. & -#endif - ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) .OR. & - ( JSV >= NSV_SNWBEG .AND. JSV <= NSV_SNWEND .AND. GOLDFILEFORMAT ) ) THEN !Snow was not written in <5.6 - PLBXSVM(:,:,:,JSV) = 0. - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBXSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) ) - ELSE - CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize PLBXSVM for ' // TRIM( YMNHNAME_BASE ) ) - END IF - END IF - END IF - END IF - - IF ( KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) - TZFIELD%CLONGNAME = 'LBY_' // TRIM( YLONGNAME_BASE ) - - !Some variables were written with an other name in MesoNH < 5.6 - IF ( GOLDFILEFORMAT ) THEN - IF ( JSV >= 1 .AND. JSV <= NSV_USER ) THEN - WRITE( TZFIELD%CMNHNAME, '( A6, I3.3 )' ) 'LBYSVM',JSV - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME ) - ELSE IF ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN - ! Name was corrected in MNH 5.5.1 - IF ( .NOT. GIS551 ) CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME, TZFIELD%CLONGNAME ) - TZFIELD%CSTDNAME = '' - ELSE IF ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) THEN - TZFIELD%CMNHNAME = 'LBY_PP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LBY_PP' - IF ( JSV == NSV_PPBEG .AND. NSV_PP > 1 ) THEN - CMNHMSG(1) = 'reading older file (<5.6) for LBY_PP scalar variables' - CMNHMSG(2) = 'they are bugged: there should be several LBY_PP variables' - CMNHMSG(3) = 'but they were all written with the same name ''LBY_PP''' - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) - END IF -#ifdef MNH_FOREFIRE - ELSE IF ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) THEN - TZFIELD%CMNHNAME = 'LBY_FF' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LBY_FF' - IF ( JSV == NSV_FFBEG .AND. NSV_FF > 1 ) THEN - CMNHMSG(1) = 'reading older file (<5.6) for LBY_FF scalar variables' - CMNHMSG(2) = 'they are bugged: there should be several LBY_FF variables' - CMNHMSG(3) = 'but they were all written with the same name ''LBY_FF''' - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) - END IF -#endif - ELSE IF ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) THEN - TZFIELD%CMNHNAME = 'LBY_CS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LBY_CS' - IF ( JSV == NSV_CSBEG .AND. NSV_CS > 1 ) THEN - CMNHMSG(1) = 'reading older file (<5.6) for LBY_CS scalar variables' - CMNHMSG(2) = 'they are bugged: there should be several LBY_CS variables' - CMNHMSG(3) = 'but they were all written with the same name ''LBY_CS''' - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) - END IF - END IF - END IF - WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 )' ) 'X_2_Z_', 'LBYSVM', JSV - TZFIELD%CLBTYPE = 'LBY' - - CALL IO_Field_read_lb( TPINIFILE, TZFIELD, IL3DY, IRIMY, PLBYSVM(:,:,:,JSV), IRESP ) - - IF ( IRESP /= 0 ) THEN - IF ( PRESENT( PLBYSVMM ) ) THEN - PLBYSVM(:,:,:,JSV) = PLBYSVMM(:,:,:,JSV) - CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBYSVM is initialized to PLBYSVMM for ' // TRIM( YMNHNAME_BASE ) ) - ELSE - IF ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN - PLBYSVM(:,:,:,JSV) = 0. - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBYSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) ) - ELSE IF ( ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. & -#ifdef MNH_FOREFIRE - ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. & -#endif - ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) .OR. & - ( JSV >= NSV_SNWBEG .AND. JSV <= NSV_SNWEND .AND. GOLDFILEFORMAT ) ) THEN !Snow was not written in <5.6 - PLBYSVM(:,:,:,JSV) = 0. - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBYSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) ) - ELSE - CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize PLBYSVM for ' // TRIM( YMNHNAME_BASE ) ) - END IF - END IF - END IF - END IF - - CASE( 'INIT' ) - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT -END DO -!------------------------------------------------------------------------------- -! -!* 3. COMPUTE THE LB SOURCES -! ----------------------- -! -! IN case of initialization of LB source terms (OLSOURCE=T) : -! xxxM are LB source terms -! xxxMM are LB fields at time t -dt -IF (OLSOURCE) THEN - IF (PRESENT(PLBXUMM).AND.PRESENT(PLBYUMM)) THEN - PLBXUM(:,:,:) = (PLBXUM(:,:,:) - PLBXUMM(:,:,:)) / PLENG - PLBYUM(:,:,:) = (PLBYUM(:,:,:) - PLBYUMM(:,:,:)) / PLENG - ENDIF - IF (PRESENT(PLBXVMM).AND.PRESENT(PLBYVMM)) THEN - PLBXVM(:,:,:) = (PLBXVM(:,:,:) - PLBXVMM(:,:,:)) / PLENG - PLBYVM(:,:,:) = (PLBYVM(:,:,:) - PLBYVMM(:,:,:)) / PLENG - ENDIF - IF (PRESENT(PLBXWMM).AND.PRESENT(PLBYWMM)) THEN - PLBXWM(:,:,:) = (PLBXWM(:,:,:) - PLBXWMM(:,:,:)) / PLENG - PLBYWM(:,:,:) = (PLBYWM(:,:,:) - PLBYWMM(:,:,:)) / PLENG - ENDIF - IF (PRESENT(PLBXTHMM).AND.PRESENT(PLBYTHMM)) THEN - PLBXTHM(:,:,:) = (PLBXTHM(:,:,:) - PLBXTHMM(:,:,:)) / PLENG - PLBYTHM(:,:,:) = (PLBYTHM(:,:,:) - PLBYTHMM(:,:,:)) / PLENG - ENDIF - IF (HGETTKEM =='READ') THEN - IF (PRESENT(PLBXTKEMM).AND.PRESENT(PLBYTKEMM)) THEN - PLBXTKEM(:,:,:) = (PLBXTKEM(:,:,:) - PLBXTKEMM(:,:,:)) / PLENG - PLBYTKEM(:,:,:) = (PLBYTKEM(:,:,:) - PLBYTKEMM(:,:,:)) / PLENG - ENDIF - ENDIF - IF (HGETTKEM =='INIT') THEN - PLBXTKEM(:,:,:) = 0. - PLBYTKEM(:,:,:) = 0. - ENDIF -! LB moist variables - IRR=0 - IF (PRESENT(PLBXRMM).AND.PRESENT(PLBYRMM)) THEN - DO JRR=1,7 - IF (YGETRXM(JRR) == 'READ') THEN - IRR=IRR+1 - PLBXRM(:,:,:,IRR) = (PLBXRM(:,:,:,IRR) - PLBXRMM(:,:,:,IRR)) / PLENG - PLBYRM(:,:,:,IRR) = (PLBYRM(:,:,:,IRR) - PLBYRMM(:,:,:,IRR)) / PLENG - ENDIF - END DO - ENDIF -! LB-scalar variables - DO JSV=1,KSV - IF (HGETSVM(JSV) == 'READ') THEN - PLBXSVM(:,:,:,JSV) = (PLBXSVM(:,:,:,JSV) - PLBXSVMM(:,:,:,JSV)) / PLENG - PLBYSVM(:,:,:,JSV) = (PLBYSVM(:,:,:,JSV) - PLBYSVMM(:,:,:,JSV)) / PLENG - ENDIF - END DO -! -ENDIF -! -CONTAINS - - SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN( YMNHNAME, YLONGNAME ) - - CHARACTER(LEN=*), INTENT(INOUT) :: YMNHNAME - CHARACTER(LEN=*), INTENT(INOUT) :: YLONGNAME - - INTEGER :: IPOS - INTEGER :: JI - - !Try to generate CMNHNAME with old format - !In the old format, an indice of 2 numbers was written after the name but without trimming it - IPOS = SCAN( YMNHNAME, '0123456789' ) - - !Unmodified part YMNHNAME(1:IPOS-1) = YMNHNAME(1:IPOS-1) - - !Move number part at the new end - IF ( 4+JPSVNAMELGTMAX+2 > LEN( YMNHNAME ) ) & - CALL PRINT_MSG(NVERB_FATAL,'GEN','OLD_CMNHNAME_GENERATE_INTERN','CMNHNAME too small') - YMNHNAME(4+JPSVNAMELGTMAX+1 : 4+JPSVNAMELGTMAX+2) = YMNHNAME(IPOS : IPOS+1) - DO JI = IPOS, 4+JPSVNAMELGTMAX - YMNHNAME(JI:JI) = ' ' - END DO - - YLONGNAME = TRIM( YMNHNAME ) - - END SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN - -END SUBROUTINE INI_LB diff --git a/src/PHYEX/ext/ini_lesn.f90 b/src/PHYEX/ext/ini_lesn.f90 deleted file mode 100644 index 7caf12b44..000000000 --- a/src/PHYEX/ext/ini_lesn.f90 +++ /dev/null @@ -1,1995 +0,0 @@ -!MNH_LIC Copyright 2000-2022 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! #################### - SUBROUTINE INI_LES_n -! #################### -! -! -!!**** *INI_LES_n* initializes the LES variables for model _n -!! -!! PURPOSE -!! ------- -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/02/00 -!! Modification 01/02/01 (D.Gazen) add module MODD_NSV for NSV variable -!! 06/11/02 (V. Masson) add LES budgets -!! 10/2016 (C.Lac) Add droplet deposition -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! 02/2019 (C. Lac) Add rain fraction as a LES diagnostic -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! P. Wautelet 12/08/2020: bugfix: use NUNDEF instead of XUNDEF for integer variables -! P. Wautelet 04/01/2021: bugfix: nles_k was used instead of nspectra_k for a loop index -! P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain -! P. Wautelet 09/07/2021: bugfix: altitude levels are on the correct grid position (mass point) -! P. Wautelet 22/03/2022: LES averaging periods are more reliable (compute with integers instead of reals) -! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODE_MSG -USE MODE_MODELN_HANDLER -! -USE MODD_LES -USE MODD_LES_BUDGET -USE MODD_LES_n -! -USE MODD_CONF -USE MODD_PARAMETERS -USE MODD_NESTING -! -USE MODD_LUNIT_n -USE MODD_GRID_n -USE MODD_DYN_n -USE MODD_TIME_n -USE MODD_DIM_n -USE MODD_TURB_n -USE MODD_CONF_n -USE MODD_LBC_n -USE MODD_PARAM_n -USE MODD_DYN -USE MODD_NSV, ONLY: NSV ! update_nsv is done in INI_MODEL -USE MODD_CONDSAMP, ONLY : LCONDSAMP -! -USE MODI_INI_LES_CART_MASKn -USE MODI_COEF_VER_INTERP_LIN -USE MODI_SHUMAN -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -! -! -! 0.2 declaration of local variables -! -! -! -INTEGER :: ILUOUT, IRESP -INTEGER :: JI,JJ, JK ! loop counters -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_LES ! LES altitudes 3D array -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_SPEC! " for spectra -! -! -REAL, DIMENSION(:), POINTER :: ZXHAT_ll ! father model coordinates -REAL, DIMENSION(:), POINTER :: ZYHAT_ll ! -INTEGER :: IMI -! -!------------------------------------------------------------------------------- -IMI = GET_CURRENT_MODEL_INDEX() -! -ZXHAT_ll => NULL() -ZYHAT_ll => NULL() -! -ILUOUT = TLUOUT%NLU -! -!------------------------------------------------------------------------------- -! -!* 1. Does LES computations are used? -! ------------------------------ -! -LLES = LLES_MEAN .OR. LLES_RESOLVED .OR. LLES_SUBGRID .OR. LLES_UPDRAFT & - .OR. LLES_DOWNDRAFT .OR. LLES_SPECTRA -! -! -IF (.NOT. LLES) RETURN -! -IF (L1D) THEN - LLES_RESOLVED = .FALSE. - LLES_UPDRAFT = .FALSE. - LLES_DOWNDRAFT = .FALSE. - LLES_SPECTRA = .FALSE. - LLES_NEB_MASK = .FALSE. - LLES_CORE_MASK = .FALSE. - LLES_CS_MASK = .FALSE. - LLES_MY_MASK = .FALSE. -END IF -! -IF (LLES_RESOLVED ) LLES_MEAN = .TRUE. -IF (LLES_SUBGRID ) LLES_MEAN = .TRUE. -IF (LLES_UPDRAFT ) LLES_MEAN = .TRUE. -IF (LLES_DOWNDRAFT) LLES_MEAN = .TRUE. -IF (LLES_SPECTRA ) LLES_MEAN = .TRUE. -! -IF (CTURB=='NONE') THEN - WRITE(ILUOUT,FMT=*) 'LES diagnostics cannot be done without subgrid turbulence.' - WRITE(ILUOUT,FMT=*) 'You have chosen CTURB="NONE". You must choose a turbulence scheme.' - call Print_msg( NVERB_FATAL, 'GEN', 'WRITE_LB_n', 'LES diagnostics cannot be done without subgrid turbulence' ) -END IF -!------------------------------------------------------------------------------- -! -!* 2. Number and definition of masks -! ------------------------------ -! -!------------------------------------------------------------------------------- -! -!* 2.1 Cartesian (sub-)domain -! ---------------------- -! -!* updates number of masks -! ----------------------- -! -NLES_MASKS = 1 -! -!* For model 1, set default values of cartesian mask, and defines cartesian mask -! ----------------------------------------------------------------------------- -! -IF (IMI==1) THEN - IF ( LLES_CART_MASK ) THEN - !Compute LES diagnostics inside a cartesian mask - - !Set default values to physical domain boundaries - IF ( NLES_IINF == NUNDEF ) NLES_IINF = 1 - IF ( NLES_JINF == NUNDEF ) NLES_JINF = 1 - IF ( NLES_ISUP == NUNDEF ) NLES_ISUP = NIMAX_ll - IF ( NLES_JSUP == NUNDEF ) NLES_JSUP = NJMAX_ll - - !Check that selected indices are in physical domain - IF ( NLES_IINF < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_IINF too small (<1)' ) - IF ( NLES_IINF > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_IINF too large (>NIMAX)' ) - IF ( NLES_ISUP < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_ISUP too small (<1)' ) - IF ( NLES_ISUP > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_ISUP too large (>NIMAX)' ) - IF ( NLES_ISUP < NLES_IINF ) CALL Print_msg( NVERB_ERROR, 'BUD', 'INI_LES_n', 'NLES_ISUP < NLES_IINF' ) - - IF ( NLES_JINF < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JINF too small (<1)' ) - IF ( NLES_JINF > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JINF too large (>NJMAX)' ) - IF ( NLES_JSUP < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JSUP too small (<1)' ) - IF ( NLES_JSUP > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JSUP too large (>NJMAX)' ) - IF ( NLES_JSUP < NLES_JINF ) CALL Print_msg( NVERB_ERROR, 'BUD', 'INI_LES_n', 'NLES_JSUP < NLES_JINF' ) - - !Set LLES_CART_MASK to false if whole domain is selected - IF ( NLES_IINF == 1 .AND. NLES_JINF == 1 & - .AND. NLES_ISUP == NIMAX_ll .AND. NLES_ISUP == NJMAX_ll ) THEN - LLES_CART_MASK = .FALSE. - END IF - ELSE - !Compute LES diagnostics on whole physical domain - NLES_IINF = 1 - NLES_JINF = 1 - NLES_ISUP = NIMAX_ll - NLES_JSUP = NJMAX_ll - END IF - ! - NLESn_IINF(1)= NLES_IINF - NLESn_ISUP(1)= NLES_ISUP - NLESn_JINF(1)= NLES_JINF - NLESn_JSUP(1)= NLES_JSUP -! -!* For other models, fits cartesian mask on model 1 mask -! ----------------------------------------------------- -! -ELSE - ZXHAT_ll => XXHAT_ll !Use current (IMI) model XXHAT_ll - ZYHAT_ll => XYHAT_ll -! - CALL GOTO_MODEL(NDAD(IMI)) - CALL INI_LES_CART_MASK_n(IMI,ZXHAT_ll,ZYHAT_ll, & - NLESn_IINF(IMI),NLESn_JINF(IMI), & - NLESn_ISUP(IMI),NLESn_JSUP(IMI) ) - CALL GOTO_MODEL(IMI) -END IF -! -!* in non cyclic boundary conditions, limitiation of masks due to u and v grids -! ---------------------------------------------------------------------------- -! -IF ( (.NOT. L1D) .AND. CLBCX(1)/='CYCL') THEN - NLESn_IINF(IMI) = MAX(NLESn_IINF(IMI),2) -END IF -IF ( (.NOT. L1D) .AND. (.NOT. L2D) .AND. CLBCY(1)/='CYCL') THEN - NLESn_JINF(IMI) = MAX(NLESn_JINF(IMI),2) -END IF -! -!* X boundary conditions for 2points correlations computations -! ----------------------------------------------------------- -! -IF ( CLBCX(1) == 'CYCL' .AND. NLESn_IINF(IMI) == 1 .AND. NLESn_ISUP(IMI) == NIMAX_ll ) THEN - CLES_LBCX(:,IMI) = 'CYCL' -ELSE - CLES_LBCX(:,IMI) = 'OPEN' -END IF -! -!* Y boundary conditions for 2points correlations computations -! ----------------------------------------------------------- -! -IF ( CLBCY(1) == 'CYCL' .AND. NLESn_JINF(IMI) == 1 .AND. NLESn_JSUP(IMI) == NJMAX_ll ) THEN - CLES_LBCY(:,IMI) = 'CYCL' -ELSE - CLES_LBCY(:,IMI) = 'OPEN' -END IF -! -!------------------------------------------------------------------------------- -! -!* 2.2 Nebulosity mask -! --------------- -! -IF (.NOT. LUSERC .AND. .NOT. LUSERI) LLES_NEB_MASK = .FALSE. -! -IF (LLES_NEB_MASK) NLES_MASKS = NLES_MASKS + 2 -! -!------------------------------------------------------------------------------- -! -!* 2.3 Cloud core mask -! --------------- -! -IF (.NOT. LUSERC .AND. .NOT. LUSERI) LLES_CORE_MASK = .FALSE. -! -IF (LLES_CORE_MASK) NLES_MASKS = NLES_MASKS + 2 -! -!------------------------------------------------------------------------------- -! -!* 2.4 Conditional sampling mask -! ------------------------- -! -IF (.NOT. LUSERC .AND. .NOT. LCONDSAMP) LLES_CS_MASK = .FALSE. -! -IF (LLES_CS_MASK) NLES_MASKS = NLES_MASKS + 3 -! -!------------------------------------------------------------------------------- -! -!* 2.5 User mask -! --------- -! -IF (LLES_MY_MASK) NLES_MASKS = NLES_MASKS + NLES_MASKS_USER -! -!------------------------------------------------------------------------------- -! -!* 3. Number of temporal LES samplings -! -------------------------------- -! -!* 3.1 Default value -! ------------- -! -IF (XLES_TEMP_SAMPLING == XUNDEF) THEN - IF (CTURBDIM=='3DIM') THEN - XLES_TEMP_SAMPLING = 60. - ELSE - XLES_TEMP_SAMPLING = 300. - END IF -END IF -! -!* 3.2 Number of time steps between two calls -! -------------------------------------- -! -NLES_DTCOUNT = MAX( NINT( XLES_TEMP_SAMPLING / XTSTEP ) , 1) - -! -!* 3.3 Redefinition of the LES sampling time coherent with model time-step -! ------------------------------------------------------------------- -! -! Note that this modifies XLES_TEMP_SAMPLING only for father model (model number 1) -! For nested models (for which integration time step is an integer part of father model) -! the following operation does not change XLES_TEMP_SAMPLING. This way, LEs -! sampling is done at the same instants for all models. -! -XLES_TEMP_SAMPLING = XTSTEP * NLES_DTCOUNT -! -! -!* 3.4 number of temporal calls to LES routines -! ---------------------------------------- -! -! -NLES_TIMES = ( NINT( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / XTSTEP ) ) / NLES_DTCOUNT -! -!* 3.5 current LES time counter -! ------------------------ -! -NLES_TCOUNT = 0 -! -!* 3.6 dates array for diachro -! ---------------------- -! -allocate( tles_dates( nles_times ) ) -allocate( xles_times( nles_times ) ) -! -!* 3.7 No data -! ------- -! -IF (NLES_TIMES==0) THEN - LLES=.FALSE. - RETURN -END IF -! -!* 3.8 Averaging -! --------- -IF ( XLES_TEMP_MEAN_END == XUNDEF & - .OR. XLES_TEMP_MEAN_START == XUNDEF & - .OR. XLES_TEMP_MEAN_STEP == XUNDEF ) THEN - !No LES temporal averaging - NLES_MEAN_TIMES = 0 - NLES_MEAN_STEP = NNEGUNDEF - NLES_MEAN_START = NNEGUNDEF - NLES_MEAN_END = NNEGUNDEF -ELSE - !LES temporal averaging is enabled - !Ensure that XLES_TEMP_MEAN_END is not after segment end - XLES_TEMP_MEAN_END = MIN( XLES_TEMP_MEAN_END, XSEGLEN - DYN_MODEL(1)%XTSTEP ) - - NLES_MEAN_START = NINT( XLES_TEMP_MEAN_START / XTSTEP ) - - IF ( MODULO( NLES_MEAN_START, NLES_DTCOUNT ) /= 0 ) THEN - CMNHMSG(1) = 'XLES_TEMP_MEAN_START is not a multiple of XLES_TEMP_SAMPLING' - CMNHMSG(2) = 'LES averaging periods could be wrong' - CALL Print_msg( NVERB_WARNING, 'IO', 'INI_LES_n' ) - END IF - - NLES_MEAN_END = NINT( XLES_TEMP_MEAN_END / XTSTEP ) - - NLES_MEAN_STEP = NINT( XLES_TEMP_MEAN_STEP / XTSTEP ) - - IF ( NLES_MEAN_STEP < NLES_DTCOUNT ) & - CALL Print_msg( NVERB_ERROR, 'IO', 'INI_LES_n', 'XLES_TEMP_MEAN_STEP < XLES_TEMP_SAMPLING not allowed' ) - - IF ( MODULO( NLES_MEAN_STEP, NLES_DTCOUNT ) /= 0 ) THEN - CMNHMSG(1) = 'XLES_TEMP_MEAN_STEP is not a multiple of XLES_TEMP_SAMPLING' - CMNHMSG(2) = 'LES averaging periods could be wrong' - CALL Print_msg( NVERB_WARNING, 'IO', 'INI_LES_n' ) - END IF - - NLES_MEAN_TIMES = ( NLES_MEAN_END - NLES_MEAN_START ) / NLES_MEAN_STEP - !Add 1 averaging period if the last one is incomplete (for example: start=0., end=10., step=3.) - IF ( MODULO( NLES_MEAN_END - NLES_MEAN_START, NLES_MEAN_STEP ) > 0 ) NLES_MEAN_TIMES = NLES_MEAN_TIMES + 1 -END IF -!------------------------------------------------------------------------------- -! -!* 4. Number of vertical levels for local diagnostics -! ----------------------------------------------- -! -NLES_K = 0 -! -!* 4.1 Case of altitude levels (lowest priority) -! ----------------------- -! -IF (ANY(XLES_ALTITUDES(:)/=XUNDEF)) THEN - NLES_K = COUNT (XLES_ALTITUDES(:)/=XUNDEF) - CLES_LEVEL_TYPE='Z' - ! - ALLOCATE(XCOEFLIN_LES(SIZE(XZZ,1),SIZE(XZZ,2),NLES_K)) - ALLOCATE(NKLIN_LES (SIZE(XZZ,1),SIZE(XZZ,2),NLES_K)) - ! - ALLOCATE(ZZ_LES (SIZE(XZZ,1),SIZE(XZZ,2),NLES_K)) - DO JK=1,NLES_K - DO JJ=1,SIZE(XZZ,2) - DO JI=1,SIZE(XZZ,1) - ZZ_LES(JI,JJ,JK) = XLES_ALTITUDES(JK) - END DO - END DO - END DO - CALL COEF_VER_INTERP_LIN(MZF(XZZ),ZZ_LES,NKLIN_LES,XCOEFLIN_LES) - ! - DEALLOCATE(ZZ_LES) -END IF -! -! -!* 4.2 Case of model levels (highest priority) -! -------------------- -! -IF (ANY(NLES_LEVELS(:)/=NUNDEF)) THEN - DO JK = 1, SIZE( NLES_LEVELS ) - IF ( NLES_LEVELS(JK) /= NUNDEF ) THEN - IF ( NLES_LEVELS(JK) < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_LEVELS too small (<1)' ) - IF ( NLES_LEVELS(JK) > NKMAX ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_LEVELS too large (>NKMAX)' ) - END IF - END DO - - NLES_K = COUNT (NLES_LEVELS(:)/=NUNDEF) - CLES_LEVEL_TYPE='K' -ELSE - IF (NLES_K==0) THEN - NLES_K = MIN(SIZE(NLES_LEVELS),NKMAX) - CLES_LEVEL_TYPE='K' - DO JK=1,NLES_K - NLES_LEVELS(JK) = JK - END DO - END IF -END IF -! -!------------------------------------------------------------------------------- -! -!* 5. Number of vertical levels for non-local diagnostics -! --------------------------------------------------- -! -NSPECTRA_K = 0 -CSPECTRA_LEVEL_TYPE='N' -! -! -!* 5.1 Case of altitude levels (medium priority) -! ----------------------- -! -IF (ANY(XSPECTRA_ALTITUDES(:)/=XUNDEF)) THEN - NSPECTRA_K = COUNT (XSPECTRA_ALTITUDES(:)/=XUNDEF) - CSPECTRA_LEVEL_TYPE='Z' - ! - ALLOCATE(XCOEFLIN_SPEC(SIZE(XZZ,1),SIZE(XZZ,2),NSPECTRA_K)) - ALLOCATE(NKLIN_SPEC (SIZE(XZZ,1),SIZE(XZZ,2),NSPECTRA_K)) - ! - ALLOCATE(ZZ_SPEC (SIZE(XZZ,1),SIZE(XZZ,2),NSPECTRA_K)) - DO JK=1,NSPECTRA_K - DO JJ=1,SIZE(XZZ,2) - DO JI=1,SIZE(XZZ,1) - ZZ_SPEC(JI,JJ,JK) = XSPECTRA_ALTITUDES(JK) - END DO - END DO - END DO - CALL COEF_VER_INTERP_LIN(XZZ,ZZ_SPEC,NKLIN_SPEC,XCOEFLIN_SPEC) - ! - DEALLOCATE(ZZ_SPEC) -END IF -! -! -!* 5.2 Case of model levels (highest priority) -! -------------------- -! -IF (ANY(NSPECTRA_LEVELS(:)/=NUNDEF)) THEN - DO JK = 1, SIZE( NSPECTRA_LEVELS ) - IF ( NSPECTRA_LEVELS(JK) /= NUNDEF ) THEN - IF ( NSPECTRA_LEVELS(JK) < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NSPECTRA_LEVELS too small (<1)' ) - IF ( NSPECTRA_LEVELS(JK) > NKMAX ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NSPECTRA_LEVELS too large (>NKMAX)' ) - END IF - END DO - - NSPECTRA_K = COUNT (NSPECTRA_LEVELS(:)/=NUNDEF) - CSPECTRA_LEVEL_TYPE='K' -END IF -! -!------------------------------------------------------------------------------- -! -!* 6. Number of horizontal wavelengths for non-local diagnostics -! ---------------------------------------------------------- -! -NSPECTRA_NI = NLESn_ISUP(IMI) - NLESn_IINF(IMI) + 1 -NSPECTRA_NJ = NLESn_JSUP(IMI) - NLESn_JINF(IMI) + 1 -! -! -!------------------------------------------------------------------------------- -! -!* 7. Allocations of temporal series of local diagnostics -! --------------------------------------------------- -! -!* 7.0 Altitude levels -! --------------- -! -ALLOCATE(XLES_Z (NLES_K)) -! -!* 7.1 Averaging control variables -! --------------------------- -! -ALLOCATE(NLES_AVG_PTS_ll (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(NLES_UND_PTS_ll (NLES_K,NLES_TIMES,NLES_MASKS)) -! -NLES_AVG_PTS_ll = NUNDEF -NLES_UND_PTS_ll = NUNDEF -! -! -!* 7.2 Horizontally mean variables -! --------------------------- -! -ALLOCATE(XLES_MEAN_U (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_V (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_W (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_P (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_DP (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_TP (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_TR (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_DISS(NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_LM (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_RHO(NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_Th (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_Mf (NLES_K,NLES_TIMES,NLES_MASKS)) -IF (LUSERC ) THEN - ALLOCATE(XLES_MEAN_Thl(NLES_K,NLES_TIMES,NLES_MASKS)) - ALLOCATE(XLES_MEAN_Rt (NLES_K,NLES_TIMES,NLES_MASKS)) - ALLOCATE(XLES_MEAN_KHt(NLES_K,NLES_TIMES,NLES_MASKS)) - ALLOCATE(XLES_MEAN_KHr(NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Thl(0,0,0)) - ALLOCATE(XLES_MEAN_Rt (0,0,0)) - ALLOCATE(XLES_MEAN_KHt(0,0,0)) - ALLOCATE(XLES_MEAN_KHr(0,0,0)) -END IF -IF (LUSERV) THEN - ALLOCATE(XLES_MEAN_Thv(NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Thv(0,0,0)) -END IF -! -IF (LUSERV ) THEN - ALLOCATE(XLES_MEAN_Rv (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Rv (0,0,0)) -END IF -IF (LUSERV ) THEN - ALLOCATE(XLES_MEAN_Rehu (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Rehu (0,0,0)) -ENDIF -IF (LUSERV ) THEN - ALLOCATE(XLES_MEAN_Qs (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Qs (0,0,0)) -END IF -IF (LUSERC ) THEN - ALLOCATE(XLES_MEAN_Rc (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Rc (0,0,0)) -END IF -IF (LUSERC ) THEN - ALLOCATE(XLES_MEAN_Cf (NLES_K,NLES_TIMES,NLES_MASKS)) - ALLOCATE(XLES_MEAN_INDCf (NLES_K,NLES_TIMES,NLES_MASKS)) - ALLOCATE(XLES_MEAN_INDCf2 (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Cf (0,0,0)) - ALLOCATE(XLES_MEAN_INDCf (0,0,0)) - ALLOCATE(XLES_MEAN_INDCf2(0,0,0)) -END IF -IF (LUSERR ) THEN - ALLOCATE(XLES_MEAN_Rr (NLES_K,NLES_TIMES,NLES_MASKS)) - ALLOCATE(XLES_MEAN_RF (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Rr (0,0,0)) - ALLOCATE(XLES_MEAN_RF (0,0,0)) -END IF -IF (LUSERI ) THEN - ALLOCATE(XLES_MEAN_Ri (NLES_K,NLES_TIMES,NLES_MASKS)) - ALLOCATE(XLES_MEAN_If (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Ri (0,0,0)) - ALLOCATE(XLES_MEAN_If (0,0,0)) -END IF -IF (LUSERS ) THEN - ALLOCATE(XLES_MEAN_Rs (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Rs (0,0,0)) -END IF -IF (LUSERG ) THEN - ALLOCATE(XLES_MEAN_Rg (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Rg (0,0,0)) -END IF -IF (LUSERH ) THEN - ALLOCATE(XLES_MEAN_Rh (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Rh (0,0,0)) -END IF -IF (NSV>0 ) THEN - ALLOCATE(XLES_MEAN_Sv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) -ELSE - ALLOCATE(XLES_MEAN_Sv (0,0,0,0)) -END IF -ALLOCATE(XLES_MEAN_WIND (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_dUdz (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_dVdz (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_dWdz (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_dThldz(NLES_K,NLES_TIMES,NLES_MASKS)) -IF (LUSERV) THEN - ALLOCATE(XLES_MEAN_dRtdz(NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_dRtdz(0,0,0)) -END IF -IF (NSV>0) THEN - ALLOCATE(XLES_MEAN_dSvdz(NLES_K,NLES_TIMES,NLES_MASKS,NSV)) -ELSE - ALLOCATE(XLES_MEAN_dSvdz(0,0,0,0)) -END IF -! -IF (LLES_PDF) THEN -!pdf distributions and jpdf distributions - CALL LES_ALLOCATE('XLES_PDF_TH ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - CALL LES_ALLOCATE('XLES_PDF_W ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - CALL LES_ALLOCATE('XLES_PDF_THV ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - IF (LUSERV) THEN - CALL LES_ALLOCATE('XLES_PDF_RV ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - ELSE - CALL LES_ALLOCATE('XLES_PDF_RV ',(/0,0,0,0/)) - END IF - IF (LUSERC) THEN - CALL LES_ALLOCATE('XLES_PDF_RC ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - CALL LES_ALLOCATE('XLES_PDF_RT ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - CALL LES_ALLOCATE('XLES_PDF_THL',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - ELSE - CALL LES_ALLOCATE('XLES_PDF_RC ',(/0,0,0,0/)) - CALL LES_ALLOCATE('XLES_PDF_RT ',(/0,0,0,0/)) - CALL LES_ALLOCATE('XLES_PDF_THL',(/0,0,0,0/)) - ENDIF - IF (LUSERR) THEN - CALL LES_ALLOCATE('XLES_PDF_RR ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - ELSE - CALL LES_ALLOCATE('XLES_PDF_RR ',(/0,0,0,0/)) - ENDIF - IF (LUSERI) THEN - CALL LES_ALLOCATE('XLES_PDF_RI ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - ELSE - CALL LES_ALLOCATE('XLES_PDF_RI ',(/0,0,0,0/)) - END IF - IF (LUSERS) THEN - CALL LES_ALLOCATE('XLES_PDF_RS ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - ELSE - CALL LES_ALLOCATE('XLES_PDF_RS ',(/0,0,0,0/)) - END IF - IF (LUSERG) THEN - CALL LES_ALLOCATE('XLES_PDF_RG ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - ELSE - CALL LES_ALLOCATE('XLES_PDF_RG ',(/0,0,0,0/)) - END IF -ENDIF -! -XLES_MEAN_U = XUNDEF -XLES_MEAN_V = XUNDEF -XLES_MEAN_W = XUNDEF -XLES_MEAN_P = XUNDEF -XLES_MEAN_DP = XUNDEF -XLES_MEAN_TP = XUNDEF -XLES_MEAN_TR = XUNDEF -XLES_MEAN_DISS= XUNDEF -XLES_MEAN_LM = XUNDEF -XLES_MEAN_RHO= XUNDEF -XLES_MEAN_Th = XUNDEF -XLES_MEAN_Mf = XUNDEF -IF (LUSERC ) XLES_MEAN_Thl= XUNDEF -IF (LUSERV ) XLES_MEAN_Thv= XUNDEF -IF (LUSERV ) XLES_MEAN_Rv = XUNDEF -IF (LUSERV ) XLES_MEAN_Rehu = XUNDEF -IF (LUSERV ) XLES_MEAN_Qs = XUNDEF -IF (LUSERC ) XLES_MEAN_KHr = XUNDEF -IF (LUSERC ) XLES_MEAN_KHt = XUNDEF -IF (LUSERC ) XLES_MEAN_Rt = XUNDEF -IF (LUSERC ) XLES_MEAN_Rc = XUNDEF -IF (LUSERC ) XLES_MEAN_Cf = XUNDEF -IF (LUSERC ) XLES_MEAN_RF = XUNDEF -IF (LUSERC ) XLES_MEAN_INDCf = XUNDEF -IF (LUSERC ) XLES_MEAN_INDCf2 = XUNDEF -IF (LUSERR ) XLES_MEAN_Rr = XUNDEF -IF (LUSERI ) XLES_MEAN_Ri = XUNDEF -IF (LUSERI ) XLES_MEAN_If = XUNDEF -IF (LUSERS ) XLES_MEAN_Rs = XUNDEF -IF (LUSERG ) XLES_MEAN_Rg = XUNDEF -IF (LUSERH ) XLES_MEAN_Rh = XUNDEF -IF (NSV>0 ) XLES_MEAN_Sv = XUNDEF -XLES_MEAN_WIND = XUNDEF -XLES_MEAN_WIND = XUNDEF -XLES_MEAN_dUdz = XUNDEF -XLES_MEAN_dVdz = XUNDEF -XLES_MEAN_dWdz = XUNDEF -XLES_MEAN_dThldz= XUNDEF -IF (LUSERV) XLES_MEAN_dRtdz = XUNDEF -IF (NSV>0) XLES_MEAN_dSvdz = XUNDEF -! -IF (LLES_PDF) THEN - XLES_PDF_TH = XUNDEF - XLES_PDF_W = XUNDEF - XLES_PDF_THV = XUNDEF - IF (LUSERV) THEN - XLES_PDF_RV = XUNDEF - END IF - IF (LUSERC) THEN - XLES_PDF_RC = XUNDEF - XLES_PDF_RT = XUNDEF - XLES_PDF_THL = XUNDEF - END IF - IF (LUSERR) THEN - XLES_PDF_RR = XUNDEF - END IF - IF (LUSERI) THEN - XLES_PDF_RI = XUNDEF - END IF - IF (LUSERS) THEN - XLES_PDF_RS = XUNDEF - END IF - IF (LUSERG) THEN - XLES_PDF_RG = XUNDEF - END IF -END IF -! -! -! -!* 7.3 Resolved quantities -! ------------------- -! -ALLOCATE(XLES_RESOLVED_U2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'2> -ALLOCATE(XLES_RESOLVED_V2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'2> -ALLOCATE(XLES_RESOLVED_W2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2> -ALLOCATE(XLES_RESOLVED_P2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <p'2> -ALLOCATE(XLES_RESOLVED_Th2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Th'2> -IF (LUSERV) THEN - ALLOCATE(XLES_RESOLVED_ThThv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Th'Thv'> -ELSE - ALLOCATE(XLES_RESOLVED_ThThv (0,0,0)) -END IF -IF (LUSERC) THEN - ALLOCATE(XLES_RESOLVED_Thl2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'2> - ALLOCATE(XLES_RESOLVED_ThlThv(NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'Thv'> -ELSE - ALLOCATE(XLES_RESOLVED_Thl2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThlThv(0,0,0)) -END IF -ALLOCATE(XLES_RESOLVED_Ke (NLES_K,NLES_TIMES,NLES_MASKS)) ! 0.5 <u'2+v'2+w'2> -ALLOCATE(XLES_RESOLVED_UV (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'v'> -ALLOCATE(XLES_RESOLVED_WU (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'u'> -ALLOCATE(XLES_RESOLVED_WV (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'v'> -ALLOCATE(XLES_RESOLVED_UP (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'p'> -ALLOCATE(XLES_RESOLVED_VP (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'p'> -ALLOCATE(XLES_RESOLVED_WP (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'p'> -ALLOCATE(XLES_RESOLVED_UTh (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Th'> -ALLOCATE(XLES_RESOLVED_VTh (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Th'> -ALLOCATE(XLES_RESOLVED_WTh (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Th'> -IF (LUSERC) THEN - ALLOCATE(XLES_RESOLVED_UThl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Thl'> - ALLOCATE(XLES_RESOLVED_VThl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Thl'> - ALLOCATE(XLES_RESOLVED_WThl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'> -ELSE - ALLOCATE(XLES_RESOLVED_UThl(0,0,0)) - ALLOCATE(XLES_RESOLVED_VThl(0,0,0)) - ALLOCATE(XLES_RESOLVED_WThl(0,0,0)) -END IF -IF (LUSERV) THEN - ALLOCATE(XLES_RESOLVED_UThv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Thv'> - ALLOCATE(XLES_RESOLVED_VThv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Thv'> - ALLOCATE(XLES_RESOLVED_WThv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thv'> -ELSE - ALLOCATE(XLES_RESOLVED_UThv(0,0,0)) - ALLOCATE(XLES_RESOLVED_VThv(0,0,0)) - ALLOCATE(XLES_RESOLVED_WThv(0,0,0)) -END IF -ALLOCATE(XLES_RESOLVED_U3 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'3> -ALLOCATE(XLES_RESOLVED_V3 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'3> -ALLOCATE(XLES_RESOLVED_W3 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'3> -ALLOCATE(XLES_RESOLVED_U4 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'4> -ALLOCATE(XLES_RESOLVED_V4 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'4> -ALLOCATE(XLES_RESOLVED_W4 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'4> -ALLOCATE(XLES_RESOLVED_ThlPz (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thv'dp'/dz> -ALLOCATE(XLES_RESOLVED_WThl2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'2> -ALLOCATE(XLES_RESOLVED_W2Thl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2Thl'> -ALLOCATE(XLES_RESOLVED_MASSFX(NLES_K,NLES_TIMES,NLES_MASKS)) ! <upward mass flux> -ALLOCATE(XLES_RESOLVED_UKe (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'(u'2+v'2+w'2)> -ALLOCATE(XLES_RESOLVED_VKe (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'(u'2+v'2+w'2)> -ALLOCATE(XLES_RESOLVED_WKe (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'(u'2+v'2+w'2)> - -IF (LUSERV ) THEN - ALLOCATE(XLES_RESOLVED_Rv2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rv'2> - ALLOCATE(XLES_RESOLVED_ThRv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Th'Rv'> - ALLOCATE(XLES_RESOLVED_ThvRv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thv'Rv'> - ALLOCATE(XLES_RESOLVED_URv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Rv'> - ALLOCATE(XLES_RESOLVED_VRv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Rv'> - ALLOCATE(XLES_RESOLVED_WRv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rv'> - ALLOCATE(XLES_RESOLVED_WRv2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rv'2> - ALLOCATE(XLES_RESOLVED_W2Rv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2Rv'> - ALLOCATE(XLES_RESOLVED_W2Rt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2Rt'> - ALLOCATE(XLES_RESOLVED_WRt2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rt2'> - ALLOCATE(XLES_RESOLVED_RvPz (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rv'dp'/dz> - ALLOCATE(XLES_RESOLVED_WThlRv(NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'Rv'> - ALLOCATE(XLES_RESOLVED_WThlRt(NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'Rt'> -ELSE - ALLOCATE(XLES_RESOLVED_Rv2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThRv (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThvRv (0,0,0)) - ALLOCATE(XLES_RESOLVED_URv (0,0,0)) - ALLOCATE(XLES_RESOLVED_VRv (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRv (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRv2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_W2Rv (0,0,0)) - ALLOCATE(XLES_RESOLVED_W2Rt (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRt2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_RvPz (0,0,0)) - ALLOCATE(XLES_RESOLVED_WThlRv(0,0,0)) - ALLOCATE(XLES_RESOLVED_WThlRt(0,0,0)) -END IF -IF (LUSERC ) THEN - ALLOCATE(XLES_RESOLVED_ThlRv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'Rv'> - ! - ALLOCATE(XLES_RESOLVED_Rc2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rc'2> - ALLOCATE(XLES_RESOLVED_ThRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Th'Rc'> - ALLOCATE(XLES_RESOLVED_ThlRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'Rc'> - ALLOCATE(XLES_RESOLVED_ThvRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thv'Rc'> - ALLOCATE(XLES_RESOLVED_URc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Rc'> - ALLOCATE(XLES_RESOLVED_VRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Rc'> - ALLOCATE(XLES_RESOLVED_WRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rc'> - ALLOCATE(XLES_RESOLVED_WRc2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rc'2> - ALLOCATE(XLES_RESOLVED_W2Rc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2Rc'> - ALLOCATE(XLES_RESOLVED_RcPz (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rc'dp'/dz> - ALLOCATE(XLES_RESOLVED_WThlRc(NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'Rc'> - ALLOCATE(XLES_RESOLVED_WRvRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rv'Rc'> - ALLOCATE(XLES_RESOLVED_WRt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rt'> - ALLOCATE(XLES_RESOLVED_Rt2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rt'2> - ALLOCATE(XLES_RESOLVED_RtPz (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rv'dp'/dz> -ELSE - ALLOCATE(XLES_RESOLVED_ThlRv (0,0,0)) - ! - ALLOCATE(XLES_RESOLVED_Rc2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThRc (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThlRc (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThvRc (0,0,0)) - ALLOCATE(XLES_RESOLVED_URc (0,0,0)) - ALLOCATE(XLES_RESOLVED_VRc (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRc (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRc2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_W2Rc (0,0,0)) - ALLOCATE(XLES_RESOLVED_RcPz (0,0,0)) - ALLOCATE(XLES_RESOLVED_WThlRc(0,0,0)) - ALLOCATE(XLES_RESOLVED_WRvRc (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRt (0,0,0)) - ALLOCATE(XLES_RESOLVED_Rt2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_RtPz (0,0,0)) -END IF -IF (LUSERI ) THEN - ALLOCATE(XLES_RESOLVED_Ri2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Ri'2> - ALLOCATE(XLES_RESOLVED_ThRi (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Th'Ri'> - ALLOCATE(XLES_RESOLVED_ThlRi (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'Ri'> - ALLOCATE(XLES_RESOLVED_ThvRi (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thv'Ri'> - ALLOCATE(XLES_RESOLVED_URi (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Ri'> - ALLOCATE(XLES_RESOLVED_VRi (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Ri'> - ALLOCATE(XLES_RESOLVED_WRi (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Ri'> - ALLOCATE(XLES_RESOLVED_WRi2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Ri'2> - ALLOCATE(XLES_RESOLVED_W2Ri (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2Ri'> - ALLOCATE(XLES_RESOLVED_RiPz (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Ri'dp'/dz> - ALLOCATE(XLES_RESOLVED_WThlRi(NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'Ri'> - ALLOCATE(XLES_RESOLVED_WRvRi (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rv'Ri'> -ELSE - ALLOCATE(XLES_RESOLVED_Ri2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThRi (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThlRi (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThvRi (0,0,0)) - ALLOCATE(XLES_RESOLVED_URi (0,0,0)) - ALLOCATE(XLES_RESOLVED_VRi (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRi (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRi2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_W2Ri (0,0,0)) - ALLOCATE(XLES_RESOLVED_RiPz (0,0,0)) - ALLOCATE(XLES_RESOLVED_WThlRi(0,0,0)) - ALLOCATE(XLES_RESOLVED_WRvRi (0,0,0)) -END IF -! -IF (LUSERR) THEN - ALLOCATE(XLES_RESOLVED_WRr (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rr'> - ALLOCATE(XLES_INPRR3D (NLES_K,NLES_TIMES,NLES_MASKS)) !precip flux - ALLOCATE(XLES_MAX_INPRR3D (NLES_K,NLES_TIMES,NLES_MASKS)) !precip flux - ALLOCATE(XLES_EVAP3D (NLES_K,NLES_TIMES,NLES_MASKS)) ! evap -ELSE - ALLOCATE(XLES_RESOLVED_WRr (0,0,0)) - ALLOCATE(XLES_INPRR3D (0,0,0)) - ALLOCATE(XLES_MAX_INPRR3D (0,0,0)) - ALLOCATE(XLES_EVAP3D (0,0,0)) -END IF -IF (NSV>0 ) THEN - ALLOCATE(XLES_RESOLVED_Sv2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Sv'2> - ALLOCATE(XLES_RESOLVED_ThSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Th'Sv> - ALLOCATE(XLES_RESOLVED_USv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <u'Sv'> - ALLOCATE(XLES_RESOLVED_VSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <v'Sv'> - ALLOCATE(XLES_RESOLVED_WSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Sv'> - ALLOCATE(XLES_RESOLVED_WSv2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Sv'2> - ALLOCATE(XLES_RESOLVED_W2Sv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'2Sv'> - ALLOCATE(XLES_RESOLVED_SvPz (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Sv'dp'/dz> - ALLOCATE(XLES_RESOLVED_WThlSv(NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Thl'Sv'> - IF (LUSERV) THEN - ALLOCATE(XLES_RESOLVED_ThvSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Thv'Sv> - ALLOCATE(XLES_RESOLVED_WRvSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Rv'Sv'> - ELSE - ALLOCATE(XLES_RESOLVED_ThvSv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_WRvSv (0,0,0,0)) - END IF - IF (LUSERC) THEN - ALLOCATE(XLES_RESOLVED_ThlSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Thl'Sv> - ELSE - ALLOCATE(XLES_RESOLVED_ThlSv (0,0,0,0)) - END IF -ELSE - ALLOCATE(XLES_RESOLVED_Sv2 (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_ThSv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_USv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_VSv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_WSv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_WSv2 (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_W2Sv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_SvPz (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_ThvSv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_ThlSv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_WThlSv(0,0,0,0)) - ALLOCATE(XLES_RESOLVED_WRvSv (0,0,0,0)) -END IF -! -! -XLES_RESOLVED_U2 = XUNDEF -XLES_RESOLVED_V2 = XUNDEF -XLES_RESOLVED_W2 = XUNDEF -XLES_RESOLVED_P2 = XUNDEF -XLES_RESOLVED_Th2 = XUNDEF -IF( LUSERC) THEN - XLES_RESOLVED_Thl2= XUNDEF - XLES_RESOLVED_ThlThv= XUNDEF -END IF -IF (LUSERV) THEN - XLES_RESOLVED_ThThv = XUNDEF -END IF -XLES_RESOLVED_Ke = XUNDEF -XLES_RESOLVED_UV = XUNDEF -XLES_RESOLVED_WU = XUNDEF -XLES_RESOLVED_WV = XUNDEF -XLES_RESOLVED_UP = XUNDEF -XLES_RESOLVED_VP = XUNDEF -XLES_RESOLVED_WP = XUNDEF -XLES_RESOLVED_UTh = XUNDEF -XLES_RESOLVED_VTh = XUNDEF -XLES_RESOLVED_WTh = XUNDEF -IF (LUSERC) THEN - XLES_RESOLVED_UThl= XUNDEF - XLES_RESOLVED_VThl= XUNDEF - XLES_RESOLVED_WThl= XUNDEF -END IF -IF (LUSERV) THEN - XLES_RESOLVED_UThv= XUNDEF - XLES_RESOLVED_VThv= XUNDEF - XLES_RESOLVED_WThv= XUNDEF -END IF -XLES_RESOLVED_U3 = XUNDEF -XLES_RESOLVED_V3 = XUNDEF -XLES_RESOLVED_W3 = XUNDEF -XLES_RESOLVED_U4 = XUNDEF -XLES_RESOLVED_V4 = XUNDEF -XLES_RESOLVED_W4 = XUNDEF -XLES_RESOLVED_WThl2 = XUNDEF -XLES_RESOLVED_W2Thl = XUNDEF -XLES_RESOLVED_ThlPz = XUNDEF -! -XLES_RESOLVED_MASSFX = XUNDEF -XLES_RESOLVED_UKe = XUNDEF -XLES_RESOLVED_VKe = XUNDEF -XLES_RESOLVED_WKe = XUNDEF -IF (LUSERV ) THEN - XLES_RESOLVED_Rv2 = XUNDEF - XLES_RESOLVED_ThRv = XUNDEF - IF (LUSERC) XLES_RESOLVED_ThlRv= XUNDEF - XLES_RESOLVED_ThvRv= XUNDEF - XLES_RESOLVED_URv = XUNDEF - XLES_RESOLVED_VRv = XUNDEF - XLES_RESOLVED_WRv = XUNDEF - XLES_RESOLVED_WRv2 = XUNDEF - XLES_RESOLVED_W2Rv = XUNDEF - XLES_RESOLVED_WRt2 = XUNDEF - XLES_RESOLVED_W2Rt = XUNDEF - XLES_RESOLVED_WThlRv= XUNDEF - XLES_RESOLVED_WThlRt= XUNDEF - XLES_RESOLVED_RvPz = XUNDEF -END IF -IF (LUSERC ) THEN - XLES_RESOLVED_Rc2 = XUNDEF - XLES_RESOLVED_ThRc = XUNDEF - XLES_RESOLVED_ThlRc= XUNDEF - XLES_RESOLVED_ThvRc= XUNDEF - XLES_RESOLVED_URc = XUNDEF - XLES_RESOLVED_VRc = XUNDEF - XLES_RESOLVED_WRc = XUNDEF - XLES_RESOLVED_WRc2 = XUNDEF - XLES_RESOLVED_W2Rc = XUNDEF - XLES_RESOLVED_WThlRc= XUNDEF - XLES_RESOLVED_WRvRc = XUNDEF - XLES_RESOLVED_RcPz = XUNDEF - XLES_RESOLVED_RtPz = XUNDEF - XLES_RESOLVED_WRt = XUNDEF - XLES_RESOLVED_Rt2 = XUNDEF -END IF -IF (LUSERI ) THEN - XLES_RESOLVED_Ri2 = XUNDEF - XLES_RESOLVED_ThRi = XUNDEF - XLES_RESOLVED_ThlRi= XUNDEF - XLES_RESOLVED_ThvRi= XUNDEF - XLES_RESOLVED_URi = XUNDEF - XLES_RESOLVED_VRi = XUNDEF - XLES_RESOLVED_WRi = XUNDEF - XLES_RESOLVED_WRi2 = XUNDEF - XLES_RESOLVED_W2Ri = XUNDEF - XLES_RESOLVED_WThlRi= XUNDEF - XLES_RESOLVED_WRvRi = XUNDEF - XLES_RESOLVED_RiPz = XUNDEF -END IF -! -IF (LUSERR) XLES_RESOLVED_WRr = XUNDEF -IF (LUSERR) XLES_MAX_INPRR3D = XUNDEF -IF (LUSERR) XLES_INPRR3D = XUNDEF -IF (LUSERR) XLES_EVAP3D = XUNDEF -IF (NSV>0 ) THEN - XLES_RESOLVED_Sv2 = XUNDEF - XLES_RESOLVED_ThSv = XUNDEF - IF (LUSERC) XLES_RESOLVED_ThlSv= XUNDEF - IF (LUSERV) XLES_RESOLVED_ThvSv= XUNDEF - XLES_RESOLVED_USv = XUNDEF - XLES_RESOLVED_VSv = XUNDEF - XLES_RESOLVED_WSv = XUNDEF - XLES_RESOLVED_WSv2 = XUNDEF - XLES_RESOLVED_W2Sv = XUNDEF - XLES_RESOLVED_WThlSv= XUNDEF - IF (LUSERV) XLES_RESOLVED_WRvSv = XUNDEF - XLES_RESOLVED_SvPz = XUNDEF -END IF -! -! -!* 7.4 interactions of resolved and subgrid quantities -! ----------------------------------------------- -! -ALLOCATE(XLES_RES_U_SBG_Tke (NLES_K,NLES_TIMES,NLES_MASKS))! <u'Tke> -ALLOCATE(XLES_RES_V_SBG_Tke (NLES_K,NLES_TIMES,NLES_MASKS))! <v'Tke> -ALLOCATE(XLES_RES_W_SBG_Tke (NLES_K,NLES_TIMES,NLES_MASKS))! <w'Tke> -! ______ -ALLOCATE(XLES_RES_W_SBG_WThl (NLES_K,NLES_TIMES,NLES_MASKS))! <w'w'Thl'> -! _____ -ALLOCATE(XLES_RES_W_SBG_Thl2 (NLES_K,NLES_TIMES,NLES_MASKS))! <w'Thl'2> -! _____ -ALLOCATE(XLES_RES_ddxa_U_SBG_UaU (NLES_K,NLES_TIMES,NLES_MASKS))! <du'/dxa ua'u'> -! _____ -ALLOCATE(XLES_RES_ddxa_V_SBG_UaV (NLES_K,NLES_TIMES,NLES_MASKS))! <dv'/dxa ua'v'> -! _____ -ALLOCATE(XLES_RES_ddxa_W_SBG_UaW (NLES_K,NLES_TIMES,NLES_MASKS))! <dw'/dxa ua'w'> -! _______ -ALLOCATE(XLES_RES_ddxa_W_SBG_UaThl (NLES_K,NLES_TIMES,NLES_MASKS))! <dw'/dxa ua'Thl'> -! _____ -ALLOCATE(XLES_RES_ddxa_Thl_SBG_UaW (NLES_K,NLES_TIMES,NLES_MASKS))! <dThl'/dxa ua'w'> -! ___ -ALLOCATE(XLES_RES_ddz_Thl_SBG_W2 (NLES_K,NLES_TIMES,NLES_MASKS))! <dThl'/dz w'2> -! _______ -ALLOCATE(XLES_RES_ddxa_Thl_SBG_UaThl(NLES_K,NLES_TIMES,NLES_MASKS))! <dThl'/dxa ua'Thl'> -! -IF (LUSERV) THEN -! _____ - ALLOCATE(XLES_RES_W_SBG_WRt (NLES_K,NLES_TIMES,NLES_MASKS))! <w'w'Rt'> -! ____ - ALLOCATE(XLES_RES_W_SBG_Rt2 (NLES_K,NLES_TIMES,NLES_MASKS))! <w'Rt'2> -! _______ - ALLOCATE(XLES_RES_W_SBG_ThlRt (NLES_K,NLES_TIMES,NLES_MASKS))! <w'Thl'Rt'> -! ______ - ALLOCATE(XLES_RES_ddxa_W_SBG_UaRt (NLES_K,NLES_TIMES,NLES_MASKS))! <dw'/dxa ua'Rt'> -! _____ - ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaW (NLES_K,NLES_TIMES,NLES_MASKS))! <dRt'/dxa ua'w'> -! ___ - ALLOCATE(XLES_RES_ddz_Rt_SBG_W2 (NLES_K,NLES_TIMES,NLES_MASKS))! <dRt'/dz w'2> -! ______ - ALLOCATE(XLES_RES_ddxa_Thl_SBG_UaRt (NLES_K,NLES_TIMES,NLES_MASKS))! <dThl'/dxa ua'Rt'> -! _______ - ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaThl (NLES_K,NLES_TIMES,NLES_MASKS))! <dRt'/dxa ua'Thl'> -! ______ - ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaRt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <dRt'/dxa ua'Rt'> -ELSE - ALLOCATE(XLES_RES_W_SBG_WRt (0,0,0)) - ALLOCATE(XLES_RES_W_SBG_Rt2 (0,0,0)) - ALLOCATE(XLES_RES_W_SBG_ThlRt (0,0,0)) - ALLOCATE(XLES_RES_ddxa_W_SBG_UaRt (0,0,0)) - ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaW (0,0,0)) - ALLOCATE(XLES_RES_ddz_Rt_SBG_W2 (0,0,0)) - ALLOCATE(XLES_RES_ddxa_Thl_SBG_UaRt (0,0,0)) - ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaThl (0,0,0)) - ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaRt (0,0,0)) -END IF -! -! ______ -ALLOCATE(XLES_RES_ddxa_W_SBG_UaSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <dw'/dxa ua'Sv'> -! _____ -ALLOCATE(XLES_RES_ddxa_Sv_SBG_UaW (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <dSv'/dxa ua'w'> -! ___ -ALLOCATE(XLES_RES_ddz_Sv_SBG_W2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <dSv'/dz w'2> -! ______ -ALLOCATE(XLES_RES_ddxa_Sv_SBG_UaSv(NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <dSv'/dxa ua'Sv'> -! _____ -ALLOCATE(XLES_RES_W_SBG_WSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'w'Sv'> -! ____ -ALLOCATE(XLES_RES_W_SBG_Sv2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Sv'2> -! -XLES_RES_U_SBG_Tke= XUNDEF -XLES_RES_V_SBG_Tke= XUNDEF -XLES_RES_W_SBG_Tke= XUNDEF -XLES_RES_W_SBG_WThl = XUNDEF -XLES_RES_W_SBG_Thl2 = XUNDEF -XLES_RES_ddxa_U_SBG_UaU = XUNDEF -XLES_RES_ddxa_V_SBG_UaV = XUNDEF -XLES_RES_ddxa_W_SBG_UaW = XUNDEF -XLES_RES_ddxa_W_SBG_UaThl = XUNDEF -XLES_RES_ddxa_Thl_SBG_UaW = XUNDEF -XLES_RES_ddz_Thl_SBG_W2 = XUNDEF -XLES_RES_ddxa_Thl_SBG_UaThl = XUNDEF -IF (LUSERV) THEN - XLES_RES_W_SBG_WRt = XUNDEF - XLES_RES_W_SBG_Rt2 = XUNDEF - XLES_RES_W_SBG_ThlRt = XUNDEF - XLES_RES_ddxa_W_SBG_UaRt = XUNDEF - XLES_RES_ddxa_Rt_SBG_UaW = XUNDEF - XLES_RES_ddz_Rt_SBG_W2 = XUNDEF - XLES_RES_ddxa_Thl_SBG_UaRt= XUNDEF - XLES_RES_ddxa_Rt_SBG_UaThl= XUNDEF - XLES_RES_ddxa_Rt_SBG_UaRt = XUNDEF -END IF -IF (NSV>0) THEN - XLES_RES_ddxa_W_SBG_UaSv = XUNDEF - XLES_RES_ddxa_Sv_SBG_UaW = XUNDEF - XLES_RES_ddz_Sv_SBG_W2 = XUNDEF - XLES_RES_ddxa_Sv_SBG_UaSv= XUNDEF - XLES_RES_W_SBG_WSv = XUNDEF - XLES_RES_W_SBG_Sv2 = XUNDEF -END IF -! -! -!* 7.5 subgrid quantities -! ------------------ -! -ALLOCATE(XLES_SUBGRID_U2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'2> -ALLOCATE(XLES_SUBGRID_V2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'2> -ALLOCATE(XLES_SUBGRID_W2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2> -ALLOCATE(XLES_SUBGRID_Tke (NLES_K,NLES_TIMES,NLES_MASKS)) ! <e> -ALLOCATE(XLES_SUBGRID_Thl2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'2> -ALLOCATE(XLES_SUBGRID_UV (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'v'> -ALLOCATE(XLES_SUBGRID_WU (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'u'> -ALLOCATE(XLES_SUBGRID_WV (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'v'> -ALLOCATE(XLES_SUBGRID_UThl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Thl'> -ALLOCATE(XLES_SUBGRID_VThl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Thl'> -ALLOCATE(XLES_SUBGRID_WThl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'> -ALLOCATE(XLES_SUBGRID_WThv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thv'> -ALLOCATE(XLES_SUBGRID_ThlThv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'Thv'> -ALLOCATE(XLES_SUBGRID_W2Thl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2Thl> -ALLOCATE(XLES_SUBGRID_WThl2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'2> -ALLOCATE(XLES_SUBGRID_DISS_Tke (NLES_K,NLES_TIMES,NLES_MASKS)) ! <epsilon> -ALLOCATE(XLES_SUBGRID_DISS_Thl2(NLES_K,NLES_TIMES,NLES_MASKS)) ! <epsilon_Thl2> -ALLOCATE(XLES_SUBGRID_WP (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'p'> -ALLOCATE(XLES_SUBGRID_PHI3 (NLES_K,NLES_TIMES,NLES_MASKS)) ! phi3 -ALLOCATE(XLES_SUBGRID_LMix (NLES_K,NLES_TIMES,NLES_MASKS)) ! mixing length -ALLOCATE(XLES_SUBGRID_LDiss (NLES_K,NLES_TIMES,NLES_MASKS)) ! dissipative length -ALLOCATE(XLES_SUBGRID_Km (NLES_K,NLES_TIMES,NLES_MASKS)) ! Km -ALLOCATE(XLES_SUBGRID_Kh (NLES_K,NLES_TIMES,NLES_MASKS)) ! Kh -ALLOCATE(XLES_SUBGRID_ThlPz (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'dp'/dz> -ALLOCATE(XLES_SUBGRID_UTke (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Tke> -ALLOCATE(XLES_SUBGRID_VTke (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Tke> -ALLOCATE(XLES_SUBGRID_WTke (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Tke> -ALLOCATE(XLES_SUBGRID_ddz_WTke (NLES_K,NLES_TIMES,NLES_MASKS)) ! <dw'Tke/dz> - -ALLOCATE(XLES_SUBGRID_THLUP_MF(NLES_K,NLES_TIMES,NLES_MASKS)) ! Thl of the Updraft -ALLOCATE(XLES_SUBGRID_RTUP_MF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Rt of the Updraft -ALLOCATE(XLES_SUBGRID_RVUP_MF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Rv of the Updraft -ALLOCATE(XLES_SUBGRID_RCUP_MF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Rc of the Updraft -ALLOCATE(XLES_SUBGRID_RIUP_MF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Ri of the Updraft -ALLOCATE(XLES_SUBGRID_WUP_MF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Thl of the Updraft -ALLOCATE(XLES_SUBGRID_MASSFLUX(NLES_K,NLES_TIMES,NLES_MASKS)) ! Mass Flux -ALLOCATE(XLES_SUBGRID_DETR (NLES_K,NLES_TIMES,NLES_MASKS)) ! Detrainment -ALLOCATE(XLES_SUBGRID_ENTR (NLES_K,NLES_TIMES,NLES_MASKS)) ! Entrainment -ALLOCATE(XLES_SUBGRID_FRACUP (NLES_K,NLES_TIMES,NLES_MASKS)) ! Updraft Fraction -ALLOCATE(XLES_SUBGRID_THVUP_MF(NLES_K,NLES_TIMES,NLES_MASKS)) ! Thv of the Updraft -ALLOCATE(XLES_SUBGRID_WTHLMF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Flux of thl -ALLOCATE(XLES_SUBGRID_WRTMF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Flux of rt -ALLOCATE(XLES_SUBGRID_WTHVMF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Flux of thv -ALLOCATE(XLES_SUBGRID_WUMF (NLES_K,NLES_TIMES,NLES_MASKS))! Flux of u -ALLOCATE(XLES_SUBGRID_WVMF (NLES_K,NLES_TIMES,NLES_MASKS))! Flux of v - -IF (LUSERV ) THEN - ALLOCATE(XLES_SUBGRID_Rt2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rt'2> - ALLOCATE(XLES_SUBGRID_ThlRt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'Rt'> - ALLOCATE(XLES_SUBGRID_URt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Rt'> - ALLOCATE(XLES_SUBGRID_VRt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Rt'> - ALLOCATE(XLES_SUBGRID_WRt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rt'> - ALLOCATE(XLES_SUBGRID_RtThv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rt'Thv'> - ALLOCATE(XLES_SUBGRID_W2Rt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2Rt'> - ALLOCATE(XLES_SUBGRID_WThlRt(NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'Rt'> - ALLOCATE(XLES_SUBGRID_WRt2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rt'2> - ALLOCATE(XLES_SUBGRID_DISS_Rt2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <epsilon_Rt2> - ALLOCATE(XLES_SUBGRID_DISS_ThlRt(NLES_K,NLES_TIMES,NLES_MASKS)) ! <epsilon_ThlRt> - ALLOCATE(XLES_SUBGRID_RtPz (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rt'dp'/dz> - ALLOCATE(XLES_SUBGRID_PSI3 (NLES_K,NLES_TIMES,NLES_MASKS)) ! psi3 -ELSE - ALLOCATE(XLES_SUBGRID_Rt2 (0,0,0)) - ALLOCATE(XLES_SUBGRID_ThlRt (0,0,0)) - ALLOCATE(XLES_SUBGRID_URt (0,0,0)) - ALLOCATE(XLES_SUBGRID_VRt (0,0,0)) - ALLOCATE(XLES_SUBGRID_WRt (0,0,0)) - ALLOCATE(XLES_SUBGRID_RtThv (0,0,0)) - ALLOCATE(XLES_SUBGRID_W2Rt (0,0,0)) - ALLOCATE(XLES_SUBGRID_WThlRt(0,0,0)) - ALLOCATE(XLES_SUBGRID_WRt2 (0,0,0)) - ALLOCATE(XLES_SUBGRID_DISS_Rt2 (0,0,0)) - ALLOCATE(XLES_SUBGRID_DISS_ThlRt(0,0,0)) - ALLOCATE(XLES_SUBGRID_RtPz (0,0,0)) - ALLOCATE(XLES_SUBGRID_PSI3 (0,0,0)) -END IF -IF (LUSERC ) THEN - ALLOCATE(XLES_SUBGRID_Rc2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rc'2> - ALLOCATE(XLES_SUBGRID_URc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Rc'> - ALLOCATE(XLES_SUBGRID_VRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Rc'> - ALLOCATE(XLES_SUBGRID_WRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rc'> -ELSE - ALLOCATE(XLES_SUBGRID_Rc2 (0,0,0)) - ALLOCATE(XLES_SUBGRID_URc (0,0,0)) - ALLOCATE(XLES_SUBGRID_VRc (0,0,0)) - ALLOCATE(XLES_SUBGRID_WRc (0,0,0)) -END IF -IF (LUSERI ) THEN - ALLOCATE(XLES_SUBGRID_Ri2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Ri'2> -ELSE - ALLOCATE(XLES_SUBGRID_Ri2 (0,0,0)) -END IF -IF (NSV>0 ) THEN - ALLOCATE(XLES_SUBGRID_USv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <u'Sv'> - ALLOCATE(XLES_SUBGRID_VSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <v'Sv'> - ALLOCATE(XLES_SUBGRID_WSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Sv'> - ALLOCATE(XLES_SUBGRID_Sv2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Sv'2> - ALLOCATE(XLES_SUBGRID_SvThv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Sv'Thv'> - ALLOCATE(XLES_SUBGRID_W2Sv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'2Sv'> - ALLOCATE(XLES_SUBGRID_WSv2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Sv'2> - ALLOCATE(XLES_SUBGRID_DISS_Sv2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <epsilon_Sv2> - ALLOCATE(XLES_SUBGRID_SvPz (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Sv'dp'/dz> -ELSE - ALLOCATE(XLES_SUBGRID_USv (0,0,0,0)) - ALLOCATE(XLES_SUBGRID_VSv (0,0,0,0)) - ALLOCATE(XLES_SUBGRID_WSv (0,0,0,0)) - ALLOCATE(XLES_SUBGRID_Sv2 (0,0,0,0)) - ALLOCATE(XLES_SUBGRID_SvThv (0,0,0,0)) - ALLOCATE(XLES_SUBGRID_W2Sv (0,0,0,0)) - ALLOCATE(XLES_SUBGRID_WSv2 (0,0,0,0)) - ALLOCATE(XLES_SUBGRID_DISS_Sv2(0,0,0,0)) - ALLOCATE(XLES_SUBGRID_SvPz (0,0,0,0)) -END IF -! -XLES_SUBGRID_U2 = XUNDEF -XLES_SUBGRID_V2 = XUNDEF -XLES_SUBGRID_W2 = XUNDEF -XLES_SUBGRID_Tke = XUNDEF -XLES_SUBGRID_Thl2= XUNDEF -XLES_SUBGRID_UV = XUNDEF -XLES_SUBGRID_WU = XUNDEF -XLES_SUBGRID_WV = XUNDEF -XLES_SUBGRID_UThl= XUNDEF -XLES_SUBGRID_VThl= XUNDEF -XLES_SUBGRID_WThl= XUNDEF -XLES_SUBGRID_WThv= XUNDEF -XLES_SUBGRID_ThlThv= XUNDEF -XLES_SUBGRID_W2Thl= XUNDEF -XLES_SUBGRID_WThl2 = XUNDEF -XLES_SUBGRID_DISS_Tke = XUNDEF -XLES_SUBGRID_DISS_Thl2= XUNDEF -XLES_SUBGRID_WP = XUNDEF -XLES_SUBGRID_PHI3 = XUNDEF -XLES_SUBGRID_LMix = XUNDEF -XLES_SUBGRID_LDiss = XUNDEF -XLES_SUBGRID_Km = XUNDEF -XLES_SUBGRID_Kh = XUNDEF -XLES_SUBGRID_ThlPz = XUNDEF -XLES_SUBGRID_UTke= XUNDEF -XLES_SUBGRID_VTke= XUNDEF -XLES_SUBGRID_WTke= XUNDEF -XLES_SUBGRID_ddz_WTke = XUNDEF - -XLES_SUBGRID_THLUP_MF = XUNDEF -XLES_SUBGRID_RTUP_MF = XUNDEF -XLES_SUBGRID_RVUP_MF = XUNDEF -XLES_SUBGRID_RCUP_MF = XUNDEF -XLES_SUBGRID_RIUP_MF = XUNDEF -XLES_SUBGRID_WUP_MF = XUNDEF -XLES_SUBGRID_MASSFLUX = XUNDEF -XLES_SUBGRID_DETR = XUNDEF -XLES_SUBGRID_ENTR = XUNDEF -XLES_SUBGRID_FRACUP = XUNDEF -XLES_SUBGRID_THVUP_MF = XUNDEF -XLES_SUBGRID_WTHLMF = XUNDEF -XLES_SUBGRID_WRTMF = XUNDEF -XLES_SUBGRID_WTHVMF = XUNDEF -XLES_SUBGRID_WUMF = XUNDEF -XLES_SUBGRID_WVMF = XUNDEF - -IF (LUSERV ) THEN - XLES_SUBGRID_Rt2 = XUNDEF - XLES_SUBGRID_ThlRt= XUNDEF - XLES_SUBGRID_URt = XUNDEF - XLES_SUBGRID_VRt = XUNDEF - XLES_SUBGRID_WRt = XUNDEF - XLES_SUBGRID_RtThv = XUNDEF - XLES_SUBGRID_W2Rt = XUNDEF - XLES_SUBGRID_WThlRt = XUNDEF - XLES_SUBGRID_WRt2 = XUNDEF - XLES_SUBGRID_DISS_Rt2= XUNDEF - XLES_SUBGRID_DISS_ThlRt= XUNDEF - XLES_SUBGRID_RtPz = XUNDEF - XLES_SUBGRID_PSI3 = XUNDEF -END IF -IF (LUSERC ) THEN - XLES_SUBGRID_Rc2 = XUNDEF - XLES_SUBGRID_URc = XUNDEF - XLES_SUBGRID_VRc = XUNDEF - XLES_SUBGRID_WRc = XUNDEF -END IF -IF (LUSERI ) THEN - XLES_SUBGRID_Ri2 = XUNDEF -END IF -IF (NSV>0 ) THEN - XLES_SUBGRID_USv = XUNDEF - XLES_SUBGRID_VSv = XUNDEF - XLES_SUBGRID_WSv = XUNDEF - XLES_SUBGRID_Sv2 = XUNDEF - XLES_SUBGRID_SvThv = XUNDEF - XLES_SUBGRID_W2Sv = XUNDEF - XLES_SUBGRID_WSv2 = XUNDEF - XLES_SUBGRID_DISS_Sv2= XUNDEF - XLES_SUBGRID_SvPz = XUNDEF -END IF -! -! -!* 7.6 updraft quantities (only on the cartesian mask) -! ------------------ -! -ALLOCATE(XLES_UPDRAFT (NLES_K,NLES_TIMES)) ! updraft fraction -ALLOCATE(XLES_UPDRAFT_W (NLES_K,NLES_TIMES)) ! <w> -ALLOCATE(XLES_UPDRAFT_Th (NLES_K,NLES_TIMES)) ! <theta> -ALLOCATE(XLES_UPDRAFT_Ke (NLES_K,NLES_TIMES)) ! <E> -ALLOCATE(XLES_UPDRAFT_WTh (NLES_K,NLES_TIMES)) ! <w'theta'> -ALLOCATE(XLES_UPDRAFT_Th2 (NLES_K,NLES_TIMES)) ! <th'2> -ALLOCATE(XLES_UPDRAFT_Tke (NLES_K,NLES_TIMES)) ! <e> - -IF (LUSERV) THEN - ALLOCATE(XLES_UPDRAFT_Thv (NLES_K,NLES_TIMES)) ! <thetav> - ALLOCATE(XLES_UPDRAFT_WThv (NLES_K,NLES_TIMES)) ! <w'thv'> - ALLOCATE(XLES_UPDRAFT_ThThv (NLES_K,NLES_TIMES)) ! <th'thv'> -ELSE - ALLOCATE(XLES_UPDRAFT_Thv (0,0)) - ALLOCATE(XLES_UPDRAFT_WThv (0,0)) - ALLOCATE(XLES_UPDRAFT_ThThv (0,0)) -END IF -! -IF (LUSERC) THEN - ALLOCATE(XLES_UPDRAFT_Thl (NLES_K,NLES_TIMES)) ! <thetal> - ALLOCATE(XLES_UPDRAFT_WThl (NLES_K,NLES_TIMES)) ! <w'thetal'> - ALLOCATE(XLES_UPDRAFT_Thl2 (NLES_K,NLES_TIMES)) ! <thl'2> - ALLOCATE(XLES_UPDRAFT_ThlThv(NLES_K,NLES_TIMES)) ! <thl'thv'> -ELSE - ALLOCATE(XLES_UPDRAFT_Thl (0,0)) - ALLOCATE(XLES_UPDRAFT_WThl (0,0)) - ALLOCATE(XLES_UPDRAFT_Thl2 (0,0)) - ALLOCATE(XLES_UPDRAFT_ThlThv(0,0)) -END IF - -IF (LUSERV ) THEN - ALLOCATE(XLES_UPDRAFT_Rv (NLES_K,NLES_TIMES)) ! <Rv> - ALLOCATE(XLES_UPDRAFT_WRv (NLES_K,NLES_TIMES)) ! <w'Rv'> - ALLOCATE(XLES_UPDRAFT_Rv2 (NLES_K,NLES_TIMES)) ! <Rv'2> - ALLOCATE(XLES_UPDRAFT_ThRv (NLES_K,NLES_TIMES)) ! <Th'Rv'> - ALLOCATE(XLES_UPDRAFT_ThvRv (NLES_K,NLES_TIMES)) ! <Thv'Rv'> - IF (LUSERC) THEN - ALLOCATE(XLES_UPDRAFT_ThlRv (NLES_K,NLES_TIMES)) ! <Thl'Rv'> - ELSE - ALLOCATE(XLES_UPDRAFT_ThlRv (0,0)) - END IF -ELSE - ALLOCATE(XLES_UPDRAFT_Rv (0,0)) - ALLOCATE(XLES_UPDRAFT_WRv (0,0)) - ALLOCATE(XLES_UPDRAFT_Rv2 (0,0)) - ALLOCATE(XLES_UPDRAFT_ThRv (0,0)) - ALLOCATE(XLES_UPDRAFT_ThvRv (0,0)) - ALLOCATE(XLES_UPDRAFT_ThlRv (0,0)) -END IF -IF (LUSERC ) THEN - ALLOCATE(XLES_UPDRAFT_Rc (NLES_K,NLES_TIMES)) ! <Rc> - ALLOCATE(XLES_UPDRAFT_WRc (NLES_K,NLES_TIMES)) ! <w'Rc'> - ALLOCATE(XLES_UPDRAFT_Rc2 (NLES_K,NLES_TIMES)) ! <Rc'2> - ALLOCATE(XLES_UPDRAFT_ThRc (NLES_K,NLES_TIMES)) ! <Th'Rc'> - ALLOCATE(XLES_UPDRAFT_ThvRc (NLES_K,NLES_TIMES)) ! <Thv'Rc'> - ALLOCATE(XLES_UPDRAFT_ThlRc (NLES_K,NLES_TIMES)) ! <Thl'Rc'> -ELSE - ALLOCATE(XLES_UPDRAFT_Rc (0,0)) - ALLOCATE(XLES_UPDRAFT_WRc (0,0)) - ALLOCATE(XLES_UPDRAFT_Rc2 (0,0)) - ALLOCATE(XLES_UPDRAFT_ThRc (0,0)) - ALLOCATE(XLES_UPDRAFT_ThvRc (0,0)) - ALLOCATE(XLES_UPDRAFT_ThlRc (0,0)) -END IF -IF (LUSERR ) THEN - ALLOCATE(XLES_UPDRAFT_Rr (NLES_K,NLES_TIMES)) ! <Rr> -ELSE - ALLOCATE(XLES_UPDRAFT_Rr (0,0)) -END IF -IF (LUSERI ) THEN - ALLOCATE(XLES_UPDRAFT_Ri (NLES_K,NLES_TIMES)) ! <Ri> - ALLOCATE(XLES_UPDRAFT_WRi (NLES_K,NLES_TIMES)) ! <w'Ri'> - ALLOCATE(XLES_UPDRAFT_Ri2 (NLES_K,NLES_TIMES)) ! <Ri'2> - ALLOCATE(XLES_UPDRAFT_ThRi (NLES_K,NLES_TIMES)) ! <Th'Ri'> - ALLOCATE(XLES_UPDRAFT_ThvRi (NLES_K,NLES_TIMES)) ! <Thv'Ri'> - ALLOCATE(XLES_UPDRAFT_ThlRi (NLES_K,NLES_TIMES)) ! <Thl'Ri'> -ELSE - ALLOCATE(XLES_UPDRAFT_Ri (0,0)) - ALLOCATE(XLES_UPDRAFT_WRi (0,0)) - ALLOCATE(XLES_UPDRAFT_Ri2 (0,0)) - ALLOCATE(XLES_UPDRAFT_ThRi (0,0)) - ALLOCATE(XLES_UPDRAFT_ThvRi (0,0)) - ALLOCATE(XLES_UPDRAFT_ThlRi (0,0)) -END IF -IF (LUSERS ) THEN - ALLOCATE(XLES_UPDRAFT_Rs (NLES_K,NLES_TIMES)) ! <Rs> -ELSE - ALLOCATE(XLES_UPDRAFT_Rs (0,0)) -END IF -IF (LUSERG ) THEN - ALLOCATE(XLES_UPDRAFT_Rg (NLES_K,NLES_TIMES)) ! <Rg> -ELSE - ALLOCATE(XLES_UPDRAFT_Rg (0,0)) -END IF -IF (LUSERH ) THEN - ALLOCATE(XLES_UPDRAFT_Rh (NLES_K,NLES_TIMES)) ! <Rh> -ELSE - ALLOCATE(XLES_UPDRAFT_Rh (0,0)) -END IF -IF (NSV>0 ) THEN - ALLOCATE(XLES_UPDRAFT_Sv (NLES_K,NLES_TIMES,NSV))! <Sv> - ALLOCATE(XLES_UPDRAFT_WSv (NLES_K,NLES_TIMES,NSV))! <w'Sv'> - ALLOCATE(XLES_UPDRAFT_Sv2 (NLES_K,NLES_TIMES,NSV))! <Sv'2> - ALLOCATE(XLES_UPDRAFT_ThSv (NLES_K,NLES_TIMES,NSV))! <Th'Sv'> - IF (LUSERV) THEN - ALLOCATE(XLES_UPDRAFT_ThvSv (NLES_K,NLES_TIMES,NSV))! <Thv'Sv'> - ELSE - ALLOCATE(XLES_UPDRAFT_ThvSv (0,0,0)) - END IF - IF (LUSERC) THEN - ALLOCATE(XLES_UPDRAFT_ThlSv (NLES_K,NLES_TIMES,NSV))! <Thl'Sv'> - ELSE - ALLOCATE(XLES_UPDRAFT_ThlSv (0,0,0)) - END IF -ELSE - ALLOCATE(XLES_UPDRAFT_Sv (0,0,0)) - ALLOCATE(XLES_UPDRAFT_WSv (0,0,0)) - ALLOCATE(XLES_UPDRAFT_Sv2 (0,0,0)) - ALLOCATE(XLES_UPDRAFT_ThSv (0,0,0)) - ALLOCATE(XLES_UPDRAFT_ThvSv (0,0,0)) - ALLOCATE(XLES_UPDRAFT_ThlSv (0,0,0)) -END IF -! -! -XLES_UPDRAFT = XUNDEF -XLES_UPDRAFT_W = XUNDEF -XLES_UPDRAFT_Th = XUNDEF -XLES_UPDRAFT_Thl = XUNDEF -XLES_UPDRAFT_Tke = XUNDEF -IF (LUSERV ) XLES_UPDRAFT_Thv = XUNDEF -IF (LUSERC ) XLES_UPDRAFT_Thl = XUNDEF -IF (LUSERV ) XLES_UPDRAFT_Rv = XUNDEF -IF (LUSERC ) XLES_UPDRAFT_Rc = XUNDEF -IF (LUSERR ) XLES_UPDRAFT_Rr = XUNDEF -IF (LUSERI ) XLES_UPDRAFT_Ri = XUNDEF -IF (LUSERS ) XLES_UPDRAFT_Rs = XUNDEF -IF (LUSERG ) XLES_UPDRAFT_Rg = XUNDEF -IF (LUSERH ) XLES_UPDRAFT_Rh = XUNDEF -IF (NSV>0 ) XLES_UPDRAFT_Sv = XUNDEF -XLES_UPDRAFT_Ke = XUNDEF -XLES_UPDRAFT_WTh = XUNDEF -IF (LUSERV ) XLES_UPDRAFT_WThv = XUNDEF -IF (LUSERC ) XLES_UPDRAFT_WThl = XUNDEF -IF (LUSERV ) XLES_UPDRAFT_WRv = XUNDEF -IF (LUSERC ) XLES_UPDRAFT_WRc = XUNDEF -IF (LUSERI ) XLES_UPDRAFT_WRi = XUNDEF -IF (NSV>0 ) XLES_UPDRAFT_WSv = XUNDEF -XLES_UPDRAFT_Th2 = XUNDEF -IF (LUSERV ) THEN - XLES_UPDRAFT_ThThv = XUNDEF -END IF -IF (LUSERC ) THEN - XLES_UPDRAFT_Thl2 = XUNDEF - XLES_UPDRAFT_ThlThv = XUNDEF -END IF -IF (LUSERV ) XLES_UPDRAFT_Rv2 = XUNDEF -IF (LUSERC ) XLES_UPDRAFT_Rc2 = XUNDEF -IF (LUSERI ) XLES_UPDRAFT_Ri2 = XUNDEF -IF (NSV>0 ) XLES_UPDRAFT_Sv2 = XUNDEF -IF (LUSERV ) XLES_UPDRAFT_ThRv = XUNDEF -IF (LUSERC ) XLES_UPDRAFT_ThRc = XUNDEF -IF (LUSERI ) XLES_UPDRAFT_ThRi = XUNDEF -IF (LUSERC ) XLES_UPDRAFT_ThlRv= XUNDEF -IF (LUSERC ) XLES_UPDRAFT_ThlRc= XUNDEF -IF (LUSERI ) XLES_UPDRAFT_ThlRi= XUNDEF -IF (NSV>0 ) XLES_UPDRAFT_ThSv = XUNDEF -IF (LUSERV ) XLES_UPDRAFT_ThvRv= XUNDEF -IF (LUSERC ) XLES_UPDRAFT_ThvRc= XUNDEF -IF (LUSERI ) XLES_UPDRAFT_ThvRi= XUNDEF -IF (NSV>0 .AND. LUSERV) XLES_UPDRAFT_ThvSv = XUNDEF -IF (NSV>0 .AND. LUSERC) XLES_UPDRAFT_ThlSv = XUNDEF -! -! -!* 7.7 downdraft quantities (only on the cartesian mask) -! -------------------- -! -ALLOCATE(XLES_DOWNDRAFT (NLES_K,NLES_TIMES)) ! updraft fraction -ALLOCATE(XLES_DOWNDRAFT_W (NLES_K,NLES_TIMES)) ! <w> -ALLOCATE(XLES_DOWNDRAFT_Th (NLES_K,NLES_TIMES)) ! <theta> -ALLOCATE(XLES_DOWNDRAFT_Ke (NLES_K,NLES_TIMES)) ! <E> -ALLOCATE(XLES_DOWNDRAFT_WTh (NLES_K,NLES_TIMES)) ! <w'theta'> -ALLOCATE(XLES_DOWNDRAFT_Th2 (NLES_K,NLES_TIMES)) ! <th'2> -ALLOCATE(XLES_DOWNDRAFT_Tke (NLES_K,NLES_TIMES)) ! <e> - -IF (LUSERV) THEN - ALLOCATE(XLES_DOWNDRAFT_Thv (NLES_K,NLES_TIMES)) ! <thetav> - ALLOCATE(XLES_DOWNDRAFT_WThv (NLES_K,NLES_TIMES)) ! <w'thv'> - ALLOCATE(XLES_DOWNDRAFT_ThThv (NLES_K,NLES_TIMES)) ! <th'thv'> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Thv (0,0)) - ALLOCATE(XLES_DOWNDRAFT_WThv (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThThv (0,0)) -END IF -! -IF (LUSERC) THEN - ALLOCATE(XLES_DOWNDRAFT_Thl (NLES_K,NLES_TIMES)) ! <thetal> - ALLOCATE(XLES_DOWNDRAFT_WThl (NLES_K,NLES_TIMES)) ! <w'thetal'> - ALLOCATE(XLES_DOWNDRAFT_Thl2 (NLES_K,NLES_TIMES)) ! <thl'2> - ALLOCATE(XLES_DOWNDRAFT_ThlThv(NLES_K,NLES_TIMES)) ! <thl'thv'> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Thl (0,0)) - ALLOCATE(XLES_DOWNDRAFT_WThl (0,0)) - ALLOCATE(XLES_DOWNDRAFT_Thl2 (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThlThv(0,0)) -END IF - -IF (LUSERV ) THEN - ALLOCATE(XLES_DOWNDRAFT_Rv (NLES_K,NLES_TIMES)) ! <Rv> - ALLOCATE(XLES_DOWNDRAFT_WRv (NLES_K,NLES_TIMES)) ! <w'Rv'> - ALLOCATE(XLES_DOWNDRAFT_Rv2 (NLES_K,NLES_TIMES)) ! <Rv'2> - ALLOCATE(XLES_DOWNDRAFT_ThRv (NLES_K,NLES_TIMES)) ! <Th'Rv'> - ALLOCATE(XLES_DOWNDRAFT_ThvRv (NLES_K,NLES_TIMES)) ! <Thv'Rv'> - IF (LUSERC) THEN - ALLOCATE(XLES_DOWNDRAFT_ThlRv (NLES_K,NLES_TIMES)) ! <Thl'Rv'> - ELSE - ALLOCATE(XLES_DOWNDRAFT_ThlRv (0,0)) - END IF -ELSE - ALLOCATE(XLES_DOWNDRAFT_Rv (0,0)) - ALLOCATE(XLES_DOWNDRAFT_WRv (0,0)) - ALLOCATE(XLES_DOWNDRAFT_Rv2 (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThRv (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThvRv (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThlRv (0,0)) -END IF -IF (LUSERC ) THEN - ALLOCATE(XLES_DOWNDRAFT_Rc (NLES_K,NLES_TIMES)) ! <Rc> - ALLOCATE(XLES_DOWNDRAFT_WRc (NLES_K,NLES_TIMES)) ! <w'Rc'> - ALLOCATE(XLES_DOWNDRAFT_Rc2 (NLES_K,NLES_TIMES)) ! <Rc'2> - ALLOCATE(XLES_DOWNDRAFT_ThRc (NLES_K,NLES_TIMES)) ! <Th'Rc'> - ALLOCATE(XLES_DOWNDRAFT_ThvRc (NLES_K,NLES_TIMES)) ! <Thv'Rc'> - ALLOCATE(XLES_DOWNDRAFT_ThlRc (NLES_K,NLES_TIMES)) ! <Thl'Rc'> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Rc (0,0)) - ALLOCATE(XLES_DOWNDRAFT_WRc (0,0)) - ALLOCATE(XLES_DOWNDRAFT_Rc2 (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThRc (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThvRc (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThlRc (0,0)) -END IF -IF (LUSERR ) THEN - ALLOCATE(XLES_DOWNDRAFT_Rr (NLES_K,NLES_TIMES)) ! <Rr> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Rr (0,0)) -END IF -IF (LUSERI ) THEN - ALLOCATE(XLES_DOWNDRAFT_Ri (NLES_K,NLES_TIMES)) ! <Ri> - ALLOCATE(XLES_DOWNDRAFT_WRi (NLES_K,NLES_TIMES)) ! <w'Ri'> - ALLOCATE(XLES_DOWNDRAFT_Ri2 (NLES_K,NLES_TIMES)) ! <Ri'2> - ALLOCATE(XLES_DOWNDRAFT_ThRi (NLES_K,NLES_TIMES)) ! <Th'Ri'> - ALLOCATE(XLES_DOWNDRAFT_ThvRi (NLES_K,NLES_TIMES)) ! <Thv'Ri'> - ALLOCATE(XLES_DOWNDRAFT_ThlRi (NLES_K,NLES_TIMES)) ! <Thl'Ri'> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Ri (0,0)) - ALLOCATE(XLES_DOWNDRAFT_WRi (0,0)) - ALLOCATE(XLES_DOWNDRAFT_Ri2 (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThRi (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThvRi (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThlRi (0,0)) -END IF -IF (LUSERS ) THEN - ALLOCATE(XLES_DOWNDRAFT_Rs (NLES_K,NLES_TIMES)) ! <Rs> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Rs (0,0)) -END IF -IF (LUSERG ) THEN - ALLOCATE(XLES_DOWNDRAFT_Rg (NLES_K,NLES_TIMES)) ! <Rg> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Rg (0,0)) -END IF -IF (LUSERH ) THEN - ALLOCATE(XLES_DOWNDRAFT_Rh (NLES_K,NLES_TIMES)) ! <Rh> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Rh (0,0)) -END IF -IF (NSV>0 ) THEN - ALLOCATE(XLES_DOWNDRAFT_Sv (NLES_K,NLES_TIMES,NSV))! <Sv> - ALLOCATE(XLES_DOWNDRAFT_WSv (NLES_K,NLES_TIMES,NSV))! <w'Sv'> - ALLOCATE(XLES_DOWNDRAFT_Sv2 (NLES_K,NLES_TIMES,NSV))! <Sv'2> - ALLOCATE(XLES_DOWNDRAFT_ThSv (NLES_K,NLES_TIMES,NSV))! <Th'Sv'> - IF (LUSERV) THEN - ALLOCATE(XLES_DOWNDRAFT_ThvSv (NLES_K,NLES_TIMES,NSV))! <Thv'Sv'> - ELSE - ALLOCATE(XLES_DOWNDRAFT_ThvSv (0,0,0)) - END IF - IF (LUSERC) THEN - ALLOCATE(XLES_DOWNDRAFT_ThlSv (NLES_K,NLES_TIMES,NSV))! <Thl'Sv'> - ELSE - ALLOCATE(XLES_DOWNDRAFT_ThlSv (0,0,0)) - END IF -ELSE - ALLOCATE(XLES_DOWNDRAFT_Sv (0,0,0)) - ALLOCATE(XLES_DOWNDRAFT_WSv (0,0,0)) - ALLOCATE(XLES_DOWNDRAFT_Sv2 (0,0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThSv (0,0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThvSv (0,0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThlSv (0,0,0)) -END IF -! -! -XLES_DOWNDRAFT = XUNDEF -XLES_DOWNDRAFT_W = XUNDEF -XLES_DOWNDRAFT_Th = XUNDEF -XLES_DOWNDRAFT_Thl = XUNDEF -XLES_DOWNDRAFT_Tke = XUNDEF -IF (LUSERV ) XLES_DOWNDRAFT_Thv = XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_Thl = XUNDEF -IF (LUSERV ) XLES_DOWNDRAFT_Rv = XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_Rc = XUNDEF -IF (LUSERR ) XLES_DOWNDRAFT_Rr = XUNDEF -IF (LUSERI ) XLES_DOWNDRAFT_Ri = XUNDEF -IF (LUSERS ) XLES_DOWNDRAFT_Rs = XUNDEF -IF (LUSERG ) XLES_DOWNDRAFT_Rg = XUNDEF -IF (LUSERH ) XLES_DOWNDRAFT_Rh = XUNDEF -IF (NSV>0 ) XLES_DOWNDRAFT_Sv = XUNDEF -XLES_DOWNDRAFT_Ke = XUNDEF -XLES_DOWNDRAFT_WTh = XUNDEF -IF (LUSERV ) XLES_DOWNDRAFT_WThv = XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_WThl = XUNDEF -IF (LUSERV ) XLES_DOWNDRAFT_WRv = XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_WRc = XUNDEF -IF (LUSERI ) XLES_DOWNDRAFT_WRi = XUNDEF -IF (NSV>0 ) XLES_DOWNDRAFT_WSv = XUNDEF -XLES_DOWNDRAFT_Th2 = XUNDEF -IF (LUSERV ) THEN - XLES_DOWNDRAFT_ThThv = XUNDEF -END IF -IF (LUSERC ) THEN - XLES_DOWNDRAFT_Thl2 = XUNDEF - XLES_DOWNDRAFT_ThlThv = XUNDEF -END IF -IF (LUSERV ) XLES_DOWNDRAFT_Rv2 = XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_Rc2 = XUNDEF -IF (LUSERI ) XLES_DOWNDRAFT_Ri2 = XUNDEF -IF (NSV>0 ) XLES_DOWNDRAFT_Sv2 = XUNDEF -IF (LUSERV ) XLES_DOWNDRAFT_ThRv = XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_ThRc = XUNDEF -IF (LUSERI ) XLES_DOWNDRAFT_ThRi = XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_ThlRv= XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_ThlRc= XUNDEF -IF (LUSERI ) XLES_DOWNDRAFT_ThlRi= XUNDEF -IF (NSV>0 ) XLES_DOWNDRAFT_ThSv = XUNDEF -IF (LUSERV ) XLES_DOWNDRAFT_ThvRv= XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_ThvRc= XUNDEF -IF (LUSERI ) XLES_DOWNDRAFT_ThvRi= XUNDEF -IF (NSV>0 .AND. LUSERV) XLES_DOWNDRAFT_ThvSv = XUNDEF -IF (NSV>0 .AND. LUSERC) XLES_DOWNDRAFT_ThlSv = XUNDEF -! -!* 7.8 production terms -! ---------------- -! -ALLOCATE(XLES_BU_RES_KE (NLES_K,NLES_TIMES,NLES_TOT)) -ALLOCATE(XLES_BU_RES_WThl (NLES_K,NLES_TIMES,NLES_TOT)) -ALLOCATE(XLES_BU_RES_Thl2 (NLES_K,NLES_TIMES,NLES_TOT)) -ALLOCATE(XLES_BU_SBG_TKE (NLES_K,NLES_TIMES,NLES_TOT)) -XLES_BU_RES_KE = 0. -XLES_BU_RES_WThl = 0. -XLES_BU_RES_Thl2 = 0. -XLES_BU_SBG_TKE = 0. -IF (LUSERV) THEN - ALLOCATE(XLES_BU_RES_WRt (NLES_K,NLES_TIMES,NLES_TOT)) - ALLOCATE(XLES_BU_RES_Rt2 (NLES_K,NLES_TIMES,NLES_TOT)) - ALLOCATE(XLES_BU_RES_ThlRt(NLES_K,NLES_TIMES,NLES_TOT)) - XLES_BU_RES_WRt = 0. - XLES_BU_RES_Rt2 = 0. - XLES_BU_RES_ThlRt = 0. -END IF -ALLOCATE(XLES_BU_RES_WSv (NLES_K,NLES_TIMES,NLES_TOT,NSV)) -ALLOCATE(XLES_BU_RES_Sv2 (NLES_K,NLES_TIMES,NLES_TOT,NSV)) -IF (NSV>0) THEN - XLES_BU_RES_WSv = 0. - XLES_BU_RES_Sv2 = 0. -END IF -! -!------------------------------------------------------------------------------- -! -!* 8. Allocations of the normalization variables temporal series -! ---------------------------------------------------------- -! -ALLOCATE(XLES_UW0 (NLES_TIMES)) -ALLOCATE(XLES_VW0 (NLES_TIMES)) -ALLOCATE(XLES_USTAR (NLES_TIMES)) -ALLOCATE(XLES_WSTAR (NLES_TIMES)) -ALLOCATE(XLES_Q0 (NLES_TIMES)) -ALLOCATE(XLES_E0 (NLES_TIMES)) -ALLOCATE(XLES_SV0 (NLES_TIMES,NSV)) -ALLOCATE(XLES_BL_HEIGHT (NLES_TIMES)) -ALLOCATE(XLES_MO_LENGTH (NLES_TIMES)) -ALLOCATE(XLES_ZCB (NLES_TIMES)) -ALLOCATE(XLES_CFtot (NLES_TIMES)) -ALLOCATE(XLES_CF2tot (NLES_TIMES)) -ALLOCATE(XLES_LWP (NLES_TIMES)) -ALLOCATE(XLES_LWPVAR (NLES_TIMES)) -ALLOCATE(XLES_RWP (NLES_TIMES)) -ALLOCATE(XLES_IWP (NLES_TIMES)) -ALLOCATE(XLES_SWP (NLES_TIMES)) -ALLOCATE(XLES_GWP (NLES_TIMES)) -ALLOCATE(XLES_HWP (NLES_TIMES)) -ALLOCATE(XLES_INT_TKE (NLES_TIMES)) -ALLOCATE(XLES_ZMAXCF (NLES_TIMES)) -ALLOCATE(XLES_ZMAXCF2 (NLES_TIMES)) -ALLOCATE(XLES_INPRR (NLES_TIMES)) -ALLOCATE(XLES_INPRC (NLES_TIMES)) -ALLOCATE(XLES_INDEP (NLES_TIMES)) -ALLOCATE(XLES_RAIN_INPRR(NLES_TIMES)) -ALLOCATE(XLES_ACPRR (NLES_TIMES)) -ALLOCATE(XLES_PRECFR (NLES_TIMES)) -ALLOCATE(XLES_SWU (NLES_K,NLES_TIMES)) -ALLOCATE(XLES_SWD (NLES_K,NLES_TIMES)) -ALLOCATE(XLES_LWU (NLES_K,NLES_TIMES)) -ALLOCATE(XLES_LWD (NLES_K,NLES_TIMES)) -ALLOCATE(XLES_DTHRADSW (NLES_K,NLES_TIMES)) -ALLOCATE(XLES_DTHRADLW (NLES_K,NLES_TIMES)) -ALLOCATE(XLES_RADEFF (NLES_K,NLES_TIMES)) -! -XLES_UW0 = XUNDEF -XLES_VW0 = XUNDEF -XLES_USTAR = XUNDEF -XLES_WSTAR = XUNDEF -XLES_Q0 = XUNDEF -XLES_E0 = XUNDEF -XLES_SV0 = XUNDEF -XLES_BL_HEIGHT = XUNDEF -XLES_MO_LENGTH = XUNDEF -XLES_ZCB = XUNDEF -XLES_CFtot = XUNDEF -XLES_CF2tot = XUNDEF -XLES_LWP = XUNDEF -XLES_LWPVAR = XUNDEF -XLES_RWP = XUNDEF -XLES_IWP = XUNDEF -XLES_SWP = XUNDEF -XLES_GWP = XUNDEF -XLES_HWP = XUNDEF -XLES_INT_TKE = XUNDEF -XLES_ZMAXCF = XUNDEF -XLES_ZMAXCF2 = XUNDEF -XLES_PRECFR = XUNDEF -XLES_ACPRR = XUNDEF -XLES_INPRR = XUNDEF -XLES_INPRC = XUNDEF -XLES_INDEP = XUNDEF -XLES_RAIN_INPRR = XUNDEF -XLES_SWU = XUNDEF -XLES_SWD = XUNDEF -XLES_LWU = XUNDEF -XLES_LWD = XUNDEF -XLES_DTHRADSW = XUNDEF -XLES_DTHRADLW = XUNDEF -XLES_RADEFF = XUNDEF -! -!------------------------------------------------------------------------------- -! -!* 9. Allocations of the normalization variables temporal series -! ---------------------------------------------------------- -! -! 9.1 Two-points correlations in I direction -! -------------------------------------- -! -ALLOCATE(XCORRi_UU (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between u and u -ALLOCATE(XCORRi_VV (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between v and v -ALLOCATE(XCORRi_UV (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between u and v -ALLOCATE(XCORRi_WU (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and u -ALLOCATE(XCORRi_WV (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and v -ALLOCATE(XCORRi_WW (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and w -ALLOCATE(XCORRi_WTh (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and theta -ALLOCATE(XCORRi_ThTh (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between theta and theta -IF (LUSERC) THEN - ALLOCATE(XCORRi_WThl (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and thetal - ALLOCATE(XCORRi_ThlThl(NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between thetal and thetal -ELSE - ALLOCATE(XCORRi_WThl (0,0,0)) - ALLOCATE(XCORRi_ThlThl(0,0,0)) -END IF - - -IF (LUSERV ) THEN - ALLOCATE(XCORRi_WRv (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and Rv - ALLOCATE(XCORRi_ThRv (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between theta and Rv - IF (LUSERC) THEN - ALLOCATE(XCORRi_ThlRv(NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between thetal and Rv - ELSE - ALLOCATE(XCORRi_ThlRv(0,0,0)) - END IF - ALLOCATE(XCORRi_RvRv (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between Rv and Rv -ELSE - ALLOCATE(XCORRi_WRv (0,0,0)) - ALLOCATE(XCORRi_ThRv (0,0,0)) - ALLOCATE(XCORRi_ThlRv(0,0,0)) - ALLOCATE(XCORRi_RvRv (0,0,0)) -END IF - -IF (LUSERC ) THEN - ALLOCATE(XCORRi_WRc (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and Rc - ALLOCATE(XCORRi_ThRc (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between theta and Rc - ALLOCATE(XCORRi_ThlRc(NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between thetal and Rc - ALLOCATE(XCORRi_RcRc (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between Rc and Rc -ELSE - ALLOCATE(XCORRi_WRc (0,0,0)) - ALLOCATE(XCORRi_ThRc (0,0,0)) - ALLOCATE(XCORRi_ThlRc(0,0,0)) - ALLOCATE(XCORRi_RcRc (0,0,0)) -END IF - -IF (LUSERI ) THEN - ALLOCATE(XCORRi_WRi (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and Ri - ALLOCATE(XCORRi_ThRi (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between theta and Rc - ALLOCATE(XCORRi_ThlRi(NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between thetal and Rc - ALLOCATE(XCORRi_RiRi (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between Rc and Rc -ELSE - ALLOCATE(XCORRi_WRi (0,0,0)) - ALLOCATE(XCORRi_ThRi (0,0,0)) - ALLOCATE(XCORRi_ThlRi(0,0,0)) - ALLOCATE(XCORRi_RiRi (0,0,0)) -END IF - -IF (NSV>0 ) THEN - ALLOCATE(XCORRi_WSv (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES,NSV)) ! between w and Sv - ALLOCATE(XCORRi_SvSv (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES,NSV)) ! between Sv and Sv -ELSE - ALLOCATE(XCORRi_WSv (0,0,0,0)) - ALLOCATE(XCORRi_SvSv (0,0,0,0)) -END IF -! -! -XCORRi_UU = XUNDEF -XCORRi_VV = XUNDEF -XCORRi_UV = XUNDEF -XCORRi_WU = XUNDEF -XCORRi_WV = XUNDEF -XCORRi_WW = XUNDEF -XCORRi_WTh = XUNDEF -IF (LUSERC ) XCORRi_WThl= XUNDEF -IF (LUSERV ) XCORRi_WRv = XUNDEF -IF (LUSERC ) XCORRi_WRc = XUNDEF -IF (LUSERI ) XCORRi_WRi = XUNDEF -IF (NSV>0 ) XCORRi_WSv = XUNDEF -XCORRi_ThTh = XUNDEF -IF (LUSERC ) XCORRi_ThlThl= XUNDEF -IF (LUSERV ) XCORRi_ThRv = XUNDEF -IF (LUSERC ) XCORRi_ThRc = XUNDEF -IF (LUSERI ) XCORRi_ThRi = XUNDEF -IF (LUSERC ) XCORRi_ThlRv= XUNDEF -IF (LUSERC ) XCORRi_ThlRc= XUNDEF -IF (LUSERI ) XCORRi_ThlRi= XUNDEF -IF (LUSERV ) XCORRi_RvRv = XUNDEF -IF (LUSERC ) XCORRi_RcRc = XUNDEF -IF (LUSERI ) XCORRi_RiRi = XUNDEF -IF (NSV>0 ) XCORRi_SvSv = XUNDEF -! -! -! 9.2 Two-points correlations in J direction -! -------------------------------------- -! -ALLOCATE(XCORRj_UU (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between u and u -ALLOCATE(XCORRj_VV (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between v and v -ALLOCATE(XCORRj_UV (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between u and v -ALLOCATE(XCORRj_WU (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and u -ALLOCATE(XCORRj_WV (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and v -ALLOCATE(XCORRj_WW (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and w -ALLOCATE(XCORRj_WTh (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and theta -ALLOCATE(XCORRj_ThTh (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between theta and theta -IF (LUSERC) THEN - ALLOCATE(XCORRj_WThl (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and thetal - ALLOCATE(XCORRj_ThlThl(NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between thetal and thetal -ELSE - ALLOCATE(XCORRj_WThl (0,0,0)) - ALLOCATE(XCORRj_ThlThl(0,0,0)) -END IF - -IF (LUSERV ) THEN - ALLOCATE(XCORRj_WRv (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and Rv - ALLOCATE(XCORRj_ThRv (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between theta and Rv - IF (LUSERC) THEN - ALLOCATE(XCORRj_ThlRv(NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between thetal and Rv - ELSE - ALLOCATE(XCORRj_ThlRv(0,0,0)) - END IF - ALLOCATE(XCORRj_RvRv (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between Rv and Rv -ELSE - ALLOCATE(XCORRj_WRv (0,0,0)) - ALLOCATE(XCORRj_ThRv (0,0,0)) - ALLOCATE(XCORRj_ThlRv(0,0,0)) - ALLOCATE(XCORRj_RvRv (0,0,0)) -END IF - -IF (LUSERC ) THEN - ALLOCATE(XCORRj_WRc (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and Rc - ALLOCATE(XCORRj_ThRc (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between theta and Rc - ALLOCATE(XCORRj_ThlRc(NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between thetal and Rc - ALLOCATE(XCORRj_RcRc (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between Rc and Rc -ELSE - ALLOCATE(XCORRj_WRc (0,0,0)) - ALLOCATE(XCORRj_ThRc (0,0,0)) - ALLOCATE(XCORRj_ThlRc(0,0,0)) - ALLOCATE(XCORRj_RcRc (0,0,0)) -END IF - -IF (LUSERI ) THEN - ALLOCATE(XCORRj_WRi (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and Ri - ALLOCATE(XCORRj_ThRi (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between theta and Rc - ALLOCATE(XCORRj_ThlRi(NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between thetal and Rc - ALLOCATE(XCORRj_RiRi (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between Rc and Rc -ELSE - ALLOCATE(XCORRj_WRi (0,0,0)) - ALLOCATE(XCORRj_ThRi (0,0,0)) - ALLOCATE(XCORRj_ThlRi(0,0,0)) - ALLOCATE(XCORRj_RiRi (0,0,0)) -END IF - -IF (NSV>0 ) THEN - ALLOCATE(XCORRj_WSv (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES,NSV)) ! between w and Sv - ALLOCATE(XCORRj_SvSv (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES,NSV)) ! between Sv and Sv -ELSE - ALLOCATE(XCORRj_WSv (0,0,0,0)) - ALLOCATE(XCORRj_SvSv (0,0,0,0)) -END IF -! -! -XCORRj_UU = XUNDEF -XCORRj_VV = XUNDEF -XCORRj_UV = XUNDEF -XCORRj_WU = XUNDEF -XCORRj_WV = XUNDEF -XCORRj_WW = XUNDEF -XCORRj_WTh = XUNDEF -IF (LUSERC ) XCORRj_WThl= XUNDEF -IF (LUSERV ) XCORRj_WRv = XUNDEF -IF (LUSERC ) XCORRj_WRc = XUNDEF -IF (LUSERI ) XCORRj_WRi = XUNDEF -IF (NSV>0 ) XCORRj_WSv = XUNDEF -XCORRj_ThTh = XUNDEF -IF (LUSERC ) XCORRj_ThlThl= XUNDEF -IF (LUSERV ) XCORRj_ThRv = XUNDEF -IF (LUSERC ) XCORRj_ThRc = XUNDEF -IF (LUSERI ) XCORRj_ThRi = XUNDEF -IF (LUSERC ) XCORRj_ThlRv= XUNDEF -IF (LUSERC ) XCORRj_ThlRc= XUNDEF -IF (LUSERI ) XCORRj_ThlRi= XUNDEF -IF (LUSERV ) XCORRj_RvRv = XUNDEF -IF (LUSERC ) XCORRj_RcRc = XUNDEF -IF (LUSERI ) XCORRj_RiRi = XUNDEF -IF (NSV>0 ) XCORRj_SvSv = XUNDEF -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE INI_LES_n diff --git a/src/PHYEX/ext/ini_micron.f90 b/src/PHYEX/ext/ini_micron.f90 deleted file mode 100644 index a4934ed55..000000000 --- a/src/PHYEX/ext/ini_micron.f90 +++ /dev/null @@ -1,327 +0,0 @@ -!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ######################## - MODULE MODI_INI_MICRO_n -! ######################## -! -INTERFACE - SUBROUTINE INI_MICRO_n ( TPINIFILE,KLUOUT ) -! -USE MODD_IO, ONLY: TFILEDATA -! -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file -INTEGER, INTENT(IN) :: KLUOUT ! Logical unit number for prints -! -END SUBROUTINE INI_MICRO_n -! -END INTERFACE -! -END MODULE MODI_INI_MICRO_n -! ############################################ - SUBROUTINE INI_MICRO_n ( TPINIFILE,KLUOUT ) -! ############################################ -! -! -!!**** *INI_MICRO_n* allocates and fills MODD_PRECIP_n variables -!! and initialize parameter for microphysical scheme -!! -!! PURPOSE -!! ------- -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! P. Jabouille -!! -!! MODIFICATIONS -!! ------------- -!! Original 27/11/02 -!! O.Geoffroy (03/2006) : Add KHKO scheme -!! Modification 01/2016 (JP Pinty) Add LIMA -!! C.LAc 10/2016 Add budget for droplet deposition -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 01/2019: bugfix: add missing allocations -! C. Lac 02/2020: add missing allocation of INPRC and ACPRC with deposition -! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! P. Wautelet 04/06/2020: bugfix: correct bounds of passed arrays -! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -! -USE MODD_CONF, ONLY : CCONF,CPROGRAM -USE MODD_IO, ONLY : TFILEDATA -USE MODD_GET_n, ONLY : CGETRCT,CGETRRT, CGETRST, CGETRGT, CGETRHT, CGETCLOUD -USE MODD_DIM_n, ONLY : NIMAX_ll, NJMAX_ll -USE MODD_PARAMETERS, ONLY : JPVEXT, JPHEXT -USE MODD_PARAM_n, ONLY : CCLOUD -USE MODD_PRECIP_n, ONLY : XINPRR, XACPRR, XINPRS, XACPRS, XINPRG, XACPRG, & - XINPRH, XACPRH, XINPRC, XACPRC, XINPRR3D, XEVAP3D,& - XINDEP,XACDEP -USE MODD_FIELD_n, ONLY : XRT, XSVT, XTHT, XPABST, XTHM, XRCM -USE MODD_GRID_n, ONLY : XZZ -USE MODD_METRICS_n, ONLY : XDXX,XDYY,XDZZ,XDZX,XDZY -USE MODD_REF_n, ONLY : XRHODREF -USE MODD_DYN_n, ONLY : XTSTEP -USE MODD_CLOUDPAR_n, ONLY : NSPLITR, NSPLITG -USE MODD_PARAM_n, ONLY : CELEC -USE MODD_PARAM_ICE_n, ONLY : LSEDIC, LDEPOSC -USE MODD_PARAM_C2R2, ONLY : LSEDC, LACTIT, LDEPOC -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n -! -USE MODI_READ_PRECIP_FIELD -USE MODI_INI_CLOUD -USE MODE_INI_RAIN_ICE, ONLY: INI_RAIN_ICE -USE MODI_INI_RAIN_C2R2 -USE MODI_INI_ICE_C1R3 -USE MODI_CLEAN_CONC_RAIN_C2R2 -USE MODI_SET_CONC_RAIN_C2R2 -USE MODI_CLEAN_CONC_ICE_C1R3 -USE MODI_SET_CONC_ICE_C1R3 -! -USE MODE_ll -USE MODE_MODELN_HANDLER -USE MODE_BLOWSNOW_SEDIM_LKT -USE MODE_SET_CONC_LIMA -! -USE MODD_NSV, ONLY : NSV,NSV_CHEM,NSV_C2R2BEG,NSV_C2R2END, & - NSV_C1R3BEG,NSV_C1R3END, & - NSV_LIMA_BEG, NSV_LIMA_END -USE MODD_PARAM_LIMA, ONLY : LSCAV, MSEDC=>LSEDC, MACTIT=>LACTIT, MDEPOC=>LDEPOC -USE MODD_LIMA_PRECIP_SCAVENGING_n -! -USE MODI_INIT_AEROSOL_CONCENTRATION -USE MODE_INI_LIMA, ONLY: INI_LIMA -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file -INTEGER, INTENT(IN) :: KLUOUT ! Logical unit number for prints -! -! 0.2 declaration of local variables -! -! -! -INTEGER :: IIU ! Upper dimension in x direction (local) -INTEGER :: IJU ! Upper dimension in y direction (local) -INTEGER :: IKU ! Upper dimension in z direction -INTEGER :: JK ! loop vertical index -INTEGER :: IINFO_ll! Return code of //routines -INTEGER :: IKB,IKE -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDZ ! mesh size -REAL :: ZDZMIN -INTEGER :: IMI -! -!------------------------------------------------------------------------------- -! -!* 1. PROLOGUE -! -! -CALL GET_DIM_EXT_ll('B',IIU,IJU) -IKU=SIZE(XZZ,3) -IMI = GET_CURRENT_MODEL_INDEX() -! -! -!* 2. ALLOCATE Module MODD_PRECIP_n -! ------------------------------ -! -IF (CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE') THEN - ALLOCATE(XINPRR(IIU,IJU)) - ALLOCATE(XINPRR3D(IIU,IJU,IKU)) - ALLOCATE(XEVAP3D(IIU,IJU,IKU)) - ALLOCATE(XACPRR(IIU,IJU)) - XINPRR(:,:)=0.0 - XACPRR(:,:)=0.0 - XINPRR3D(:,:,:)=0.0 - XEVAP3D(:,:,:)=0.0 -ELSE - ALLOCATE(XINPRR(0,0)) - ALLOCATE(XINPRR3D(0,0,0)) - ALLOCATE(XEVAP3D(0,0,0)) - ALLOCATE(XACPRR(0,0)) -END IF -! -IF (( CCLOUD(1:3) == 'ICE' .AND.(LSEDIC .OR. LDEPOSC)) .OR. & - ((CCLOUD=='C2R2' .OR. CCLOUD=='C3R5' .OR. CCLOUD=='KHKO').AND.(LSEDC .OR. LDEPOC)) .OR. & - ( CCLOUD=='LIMA' .AND.(MSEDC .OR. MDEPOC))) THEN - ALLOCATE(XINPRC(IIU,IJU)) - ALLOCATE(XACPRC(IIU,IJU)) - XINPRC(:,:)=0.0 - XACPRC(:,:)=0.0 -ELSE - ALLOCATE(XINPRC(0,0)) - ALLOCATE(XACPRC(0,0)) -END IF -! -IF (( CCLOUD(1:3) == 'ICE' .AND.LDEPOSC) .OR. & - ((CCLOUD=='C2R2' .OR. CCLOUD=='KHKO').AND.LDEPOC) .OR. & - ( CCLOUD=='LIMA' .AND.MDEPOC)) THEN - ALLOCATE(XINDEP(IIU,IJU)) - ALLOCATE(XACDEP(IIU,IJU)) - XINDEP(:,:)=0.0 - XACDEP(:,:)=0.0 -ELSE - ALLOCATE(XINDEP(0,0)) - ALLOCATE(XACDEP(0,0)) -END IF -! -IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'LIMA') THEN - ALLOCATE(XINPRS(IIU,IJU)) - ALLOCATE(XACPRS(IIU,IJU)) - XINPRS(:,:)=0.0 - XACPRS(:,:)=0.0 -ELSE - ALLOCATE(XINPRS(0,0)) - ALLOCATE(XACPRS(0,0)) - END IF -! -IF (CCLOUD == 'C3R5' .OR. CCLOUD(1:3) == 'ICE'.OR. CCLOUD == 'LIMA') THEN - ALLOCATE(XINPRG(IIU,IJU)) - ALLOCATE(XACPRG(IIU,IJU)) - XINPRG(:,:)=0.0 - XACPRG(:,:)=0.0 -ELSE - ALLOCATE(XINPRG(0,0)) - ALLOCATE(XACPRG(0,0)) -END IF -! -IF (CCLOUD =='ICE4' .OR. CCLOUD == 'LIMA') THEN - ALLOCATE(XINPRH(IIU,IJU)) - ALLOCATE(XACPRH(IIU,IJU)) - XINPRH(:,:)=0.0 - XACPRH(:,:)=0.0 -ELSE - ALLOCATE(XINPRH(0,0)) - ALLOCATE(XACPRH(0,0)) -END IF -! -IF(LBLOWSNOW) THEN - ALLOCATE(XSNWSUBL3D(IIU,IJU,IKU)) - XSNWSUBL3D(:,:,:) = 0.0 - IF(CSNOWSEDIM=='TABC') THEN -!Read in look up tables of snow particles properties -!No arguments, all look up tables are defined in module -!mode_snowdrift_sedim_lkt - CALL BLOWSNOW_SEDIM_LKT_SET - END IF -ELSE - ALLOCATE(XSNWSUBL3D(0,0,0)) -END IF -! -!* 2b. ALLOCATION for Radiative cooling -! ------------------------------ -IF (LACTIT .OR. MACTIT) THEN - ALLOCATE( XTHM(IIU,IJU,IKU) ) - ALLOCATE( XRCM(IIU,IJU,IKU) ) - XTHM = XTHT - XRCM(:,:,:) = XRT(:,:,:,2) -ELSE - ALLOCATE( XTHM(0,0,0) ) - ALLOCATE( XRCM(0,0,0) ) -END IF -! -!* 2.bis ALLOCATE Module MODD_PRECIP_SCAVENGING_n -! ------------------------------ -! -IF ( (CCLOUD=='LIMA') .AND. LSCAV ) THEN - ALLOCATE(XINPAP(IIU,IJU)) - ALLOCATE(XACPAP(IIU,IJU)) - XINPAP(:,:)=0.0 - XACPAP(:,:)=0.0 -ELSE - ALLOCATE(XINPAP(0,0)) - ALLOCATE(XACPAP(0,0)) -END IF -! -IF(SIZE(XINPRR) == 0) RETURN -! -!* 3. INITIALIZE MODD_PRECIP_n variables -! ---------------------------------- -! -CALL READ_PRECIP_FIELD(TPINIFILE,CPROGRAM,CCONF, & - CGETRCT,CGETRRT,CGETRST,CGETRGT,CGETRHT, & - XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D,& - XACPRR,XINPRS,XACPRS,XINPRG,XACPRG, XINPRH,XACPRH ) -! -! -!* 4. INITIALIZE THE PARAMETERS FOR THE MICROPHYSICS -! ---------------------------------------------- -! -! -!* 4.1 Compute the minimun vertical mesh size -! -ALLOCATE(ZDZ(IIU,IJU,IKU)) -ZDZ=0. -IKB = 1 + JPVEXT -IKE = SIZE(XZZ,3)- JPVEXT -DO JK = IKB,IKE - ZDZ(:,:,JK) = XZZ(:,:,JK+1) - XZZ(:,:,JK) -END DO -ZDZMIN = MIN_ll (ZDZ,IINFO_ll,1,1,IKB,NIMAX_ll+2*JPHEXT,NJMAX_ll+2*JPHEXT,IKE ) -DEALLOCATE(ZDZ) -! -IF (CCLOUD(1:3) == 'KES') THEN - CALL INI_CLOUD(XTSTEP,ZDZMIN,NSPLITR) ! Warm cloud only -ELSE IF (CCLOUD(1:3) == 'ICE' ) THEN - CALL INI_RAIN_ICE(KLUOUT,XTSTEP,ZDZMIN,NSPLITR,CCLOUD) ! Mixed phase cloud - ! including hail -ELSE IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') THEN - CALL INI_RAIN_C2R2(XTSTEP,ZDZMIN,NSPLITR,CCLOUD) ! 1/2 spectral warm cloud - IF (CCLOUD == 'C3R5') THEN - CALL INI_ICE_C1R3(XTSTEP,ZDZMIN,NSPLITG) ! 1/2 spectral cold cloud - END IF -ELSE IF (CCLOUD == 'LIMA') THEN - IF (CGETCLOUD /= 'READ') CALL INIT_AEROSOL_CONCENTRATION( XRHODREF, XSVT(:, :, :, :), XZZ(:, :, :) ) - CALL INI_LIMA(XTSTEP,ZDZMIN,NSPLITR, NSPLITG) ! 1/2 spectral warm cloud -END IF -! -IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') THEN - IF (CGETCLOUD=='READ') THEN - CALL CLEAN_CONC_RAIN_C2R2 (XRT,XSVT(:,:,:,NSV_C2R2BEG:NSV_C2R2END)) - ELSE IF (CGETCLOUD=='INI1'.OR.CGETCLOUD=='INI2') THEN - CALL SET_CONC_RAIN_C2R2 (CGETCLOUD,XRHODREF,& - &XRT,XSVT(:,:,:,NSV_C2R2BEG:NSV_C2R2END)) - ENDIF - IF (CCLOUD == 'C3R5' ) THEN - IF (CGETCLOUD=='READ') THEN - CALL CLEAN_CONC_ICE_C1R3 (XRT,XSVT(:,:,:,NSV_C2R2BEG:NSV_C1R3END)) - ELSE - CALL SET_CONC_ICE_C1R3 (XRHODREF,XRT,XSVT(:,:,:,NSV_C2R2BEG:NSV_C1R3END)) - ENDIF - ENDIF -ENDIF -! -IF (CCLOUD == 'LIMA') THEN - IF (CGETCLOUD/='READ') THEN - CALL SET_CONC_LIMA(IMI,CGETCLOUD,XRHODREF,XRT,XSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END)) - END IF -END IF -! -! -!* 5. INITIALIZE ATMOSPHERIC ELECTRICITY -! ---------------------------------- -! -! -!IF (CELEC /= 'NONE') THEN -! CALL INI_ELEC(IMI,TPINIFILE,XTSTEP,ZDZMIN,NSPLITR, & -! XDXX,XDYY,XDZZ,XDZX,XDZY ) -!END IF -! -! -END SUBROUTINE INI_MICRO_n diff --git a/src/PHYEX/ext/ini_modeln.f90 b/src/PHYEX/ext/ini_modeln.f90 deleted file mode 100644 index f1b7d8069..000000000 --- a/src/PHYEX/ext/ini_modeln.f90 +++ /dev/null @@ -1,2919 +0,0 @@ -!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ####################### - MODULE MODI_INI_MODEL_n -! ####################### -! -INTERFACE -! - SUBROUTINE INI_MODEL_n(KMI,TPINIFILE) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KMI ! Model Index -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file -! -END SUBROUTINE INI_MODEL_n -! -END INTERFACE -! -END MODULE MODI_INI_MODEL_n -! ############################################ - SUBROUTINE INI_MODEL_n(KMI,TPINIFILE) -! ############################################ -! -!!**** *INI_MODEL_n* - routine to initialize the nested model _n -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to initialize the variables -! of the nested model _n. -! -!!** METHOD -!! ------ -!! The initialization of the model _n is performed as follows : -!! - Memory for arrays are then allocated : -!! * If turbulence kinetic energy variable is not needed -!! (CTURB='NONE'), XTKET, XTKEM and XTKES are zero-size arrays. -!! * If dissipation of TKE variable is not needed -!! (CTURBLEN /='KEPS'), XEPST, XEPSM and XREPSS are zero-size arrays. -!! * Memory for mixing ratio arrays is allocated according to the -!! value of logicals LUSERn (the number NRR of moist variables is deduced). -!! * The latitude (XLAT), longitude (XLON) and map factor (XMAP) -!! arrays are zero-size arrays if Cartesian geometry (LCARTESIAN=.TRUE.) -!! * Memory for reference state without orography ( XRHODREFZ and -!! XTHVREFZ) is only allocated in INI_MODEL1 -!! * The horizontal Coriolis parameters (XCORIOX and XCORIOY) arrays -!! are zero-size arrays if thinshell approximation (LTHINSHELL=.TRUE.) -!! * The Curvature coefficients (XCURVX and XCURVY) arrays -!! are zero-size arrays if Cartesian geometry (LCARTESIAN=.TRUE.) -!! * Memory for the Jacobian (ZJ) local array is allocated -!! (This variable is computed in SET_GRID and used in SET_REF). -!! - The spatial and temporal grid variables are initialized by SET_GRID. -!! - The metric coefficients are computed by METRICS (they are using in -!! the SET-REF call). -!! - The prognostic variables and are read in initial -!! LFIFM file (in READ_FIELD) -!! - The reference state variables are initialized by SET_REF. -!! - The temporal indexes of the outputs are computed by SET_OUTPUT_TIMES -!! - The large scale sources are computed in case of coupling case by -!! INI_CPL. -!! - The initialization of the parameters needed for the dynamics -!! of the model n is realized in INI_DYNAMICS. -!! - Then the initial file (DESFM+LFIFM files) is closed by IO_File_close. -!! - The initialization of the parameters needed for the ECMWF radiation -!! code is realized in INI_RADIATIONS. -!! - The contents of the scalar variables are overwritten by -!! the chemistry initialization subroutine CH_INIT_FIELDn when -!! the flags LUSECHEM and LCH_INIT_FIELD are set to TRUE. -!! This allows easy initialization of the chemical fields at a -!! restart of the model. -!! -!! EXTERNAL -!! -------- -!! SET_DIM : to initialize dimensions -!! SET_GRID : to initialize grid -!! METRICS : to compute metric coefficients -!! READ_FIELD : to initialize field -!! FMCLOS : to close a FM-file -!! SET_REF : to initialize reference state for anelastic approximation -!! INI_DYNAMICS: to initialize parameters for the dynamics -!! INI_TKE_EPS : to initialize the TKE -!! SET_DIRCOS : to compute the director cosinus of the orography -!! INI_RADIATIONS : to initialize radiation computations -!! CH_INIT_CCS: to initialize the chemical core system -!! CH_INIT_FIELDn: to (re)initialize the scalar variables -!! INI_DEEP_CONVECTION : to initialize the deep convection scheme -!! CLEANLIST_ll : deaalocate a list -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! Module MODD_PARAMETERS : contains declaration of parameter variables -!! JPHEXT : Horizontal external points number -!! JPVEXT : Vertical external points number -!! -!! Module MODD_MODD_DYN : contains declaration of parameters -!! for the dynamics -!! Module MODD_CONF : contains declaration of configuration variables -!! for all models -!! NMODEL : Number of nested models -!! NVERB : Level of informations on output-listing -!! 0 for minimum prints -!! 5 for intermediate level of prints -!! 10 for maximum prints -!! -!! Module MODD_REF : contains declaration of reference state -!! variables for all models -!! Module MODD_FIELD_n : contains declaration of prognostic fields -!! Module MODD_LSFIELD_n : contains declaration of Larger Scale fields -!! Module MODD_GRID_n : contains declaration of spatial grid variables -!! Module MODD_TIME_n : contains declaration of temporal grid variables -!! Module MODD_REF_n : contains declaration of reference state -!! variables -!! Module MODD_CURVCOR_n : contains declaration of curvature and Coriolis -!! variables -!! Module MODD_BUDGET : contains declarations of the budget parameters -!! Module MODD_RADIATIONS_n:contains declaration of the variables of the -!! radiation interface scheme -!! Module MODD_STAND_ATM : contains declaration of the 5 standard -!! atmospheres used for the ECMWF-radiation code -!! Module MODD_FRC : contains declaration of the control variables -!! and of the forcing fields -!! Module MODD_CH_MNHC_n : contains the control parameters for chemistry -!! Module MODD_DEEP_CONVECTION_n: contains declaration of the variables of -!! the deep convection scheme -!! -!! -!! -!! -!! Module MODN_CONF_n : contains declaration of namelist NAM_CONFn and -!! uses module MODD_CONF_n (configuration variables) -!! Module MODN_LUNIT_n : contains declaration of namelist NAM_LUNITn and -!! uses module MODD_LUNIT_n (Logical units) -!! Module MODN_DYN_n : contains declaration of namelist NAM_DYNn and -!! uses module MODD_DYN_n (control of dynamics) -!! Module MODN_PARAM_n : contains declaration of namelist NAM_PARAMn and -!! uses module MODD_PARAM_n (control of physical -!! parameterization) -!! Module MODN_LBC_n : contains declaration of namelist NAM_LBCn and -!! uses module MODD_LBC_n (lateral boundaries) -!! Module MODN_TURB_n : contains declaration of namelist NAM_TURBn and -!! uses module MODD_TURB_n (turbulence scheme) -!! Module MODN_PARAM_RAD_n: contains declaration of namelist NAM_PARAM_RADn -!! -!! REFERENCE -!! --------- -!! Book2 of documentation (routine INI_MODEL_n) -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 10/06/94 -!! Modification 17/10/94 (Stein) For LCORIO -!! Modification 20/10/94 (Stein) For SET_GRID and NAMOUTN -!! Modification 26/10/94 (Stein) Modifications of the namelist names -!! Modification 10/11/94 (Lafore) allocatation of tke fields -!! Modification 22/11/94 (Stein) change the READ_FIELDS call ( add -!! pressure function -!! Modification 06/12/94 (Stein) add the LS fields -!! 12/12/94 (Stein) rename END_INI in INI_DYNAMICS -!! Modification 09/01/95 (Stein) add the turbulence scheme -!! Modification Jan 19, 1995 (J. Cuxart) add the TKE initialization -!! Jan 23, 1995 (J. Stein ) remove the condition -!! LTHINSHELL=T LCARTESIAN=T => stop -!! Modification Feb 16, 1995 (I.Mallet) add the METRICS call and -!! change the SET_REF call (add -!! the lineic mass) -!! Modification Mar 10, 1995 (I. Mallet) add the COUPLING initialization -!! June 29,1995 (Ph. Hereil, J. Stein) add the budget init. -!! Modification Sept. 1, 1995 (S. Belair) Reading of the surface variables -!! and parameters for ISBA (i.e., add a -!! CALL READ_GR_FIELD) -!! Modification 18/08/95 (J.P.Lafore) time step change case -!! 25/09/95 (J. Cuxart and J.Stein) add LES variables -!! and the diachronic file initialization -!! Modification Sept 20,1995 (Lafore) coupling for the dry mass Md -!! Modification Sept. 12, 1995 (J.-P. Pinty) add the initialization of -!! the ECMWF radiation code -!! Modification Sept. 13, 1995 (J.-P. Pinty) control the allocation of the -!! arrays of MODD_GR_FIELD_n -!! Modification Nove. 17, 1995 (J.Stein) control of the control !! -!! March 01, 1996 (J. Stein) add the cloud fraction -!! April 03, 1996 (J. Stein) unify the ISBA and TSZ0 cases -!! Modification 13/12/95 (M. Georgelin) add the forcing variables in -!! the call read_field, and their -!! allocation. -!! Mai 23, 1996 (J. Stein) allocate XSEA in the TSZ0 case -!! June 11, 1996 (V. Masson) add XSILT and XLAKE of -!! MODD_GR_FIELD_n -!! August 7, 1996 (K. Suhre) add (re)initialization of -!! chemistry -!! Octo. 11, 1996 (J. Stein ) add XSRCT and XSRCM -!! October 8, 1996 (J. Cuxart, E. Sanchez) Moist LES diagnostics -!! and control on TKE initialization. -!! Modification 19/12/96 (J.-P. Pinty) add the ice parameterization and -!! the precipitation fields -!! Modification 11/01/97 (J.-P. Pinty) add the deep convection -!! Nov. 1, 1996 (V. Masson) Read the vertical grid kind -!! Nov. 20, 1996 (V. Masson) control of convection calling time -!! July 16, 1996 (J.P.Lafore) update of EXSEG file reading -!! Oct. 08, 1996 (J.P.Lafore, V.Masson) -!! MY_NAME and DAD_NAME reading and check -!! Oct. 30, 1996 (J.P.Lafore) resolution ratio reading for nesting -!! and Bikhardt interpolation coef. initialization -!! Nov. 22, 1996 (J.P.Lafore) allocation of LS sources for nesting -!! Feb. 26, 1997 (J.P.Lafore) allocation of "surfacic" LS fields -!! March 10, 1997 (J.P.Lafore) forcing only for model 1 -!! June 22, 1997 (J. Stein) add the absolute pressure -!! July 09, 1997 (V. Masson) add directional z0 and SSO -!! Aug. 18, 1997 (V. Masson) consistency between storage -!! type and CCONF -!! Dec. 22, 1997 (J. Stein) add the LS field spawning -!! Jan. 24, 1998 (P.Bechtold) change MODD_FRC and MODD_DEEP_CONVECTION -!! Dec. 24, 1997 (V.Masson) directional z0 parameters -!! Aug. 13, 1998 (V. Ducrocq P Jabouille) // -!! Mai. 26, 1998 (J. Stein) remove NXEND,NYEND -!! Feb. 1, 1999 (J. Stein) compute the Bikhardt -!! interpolation coeff. before the call to set_grid -!! April 5, 1999 (V. Ducrocq) change the DXRATIO_ALL init. -!! April 12, 1999 (J. Stein) cleaning + INI_SPAWN_LS -!! Apr. 7, 1999 (P Jabouille) store the metric coefficients -!! in modd_metrics_n -!! Jui. 15,1999 (P Jabouille) split the routines in two parts -!! Jan. 04,2000 (V. Masson) removes the TSZ0 case -!! Apr. 15,2000 (P Jabouille) parallelization of grid nesting -!! Aug. 20,2000 (J Stein ) tranpose XBFY -!! Jui 01,2000 (F.solmon ) adapatation for patch approach -!! Jun. 15,2000 (J.-P. Pinty) add C2R2 initialization -!! Nov. 15,2000 (V.Masson) use of ini_modeln in prep_real_case -!! Nov. 15,2000 (V.Masson) call of LES routines -!! Nov. 15,2000 (V.Masson) aircraft and balloon initialization routines -!! Jan. 22,2001 (D.Gazen) update_nsv set NSV_* var. for current model -!! Mar. 04,2002 (V.Ducrocq) initialization to temporal series -!! Mar. 15,2002 (F.Solmon) modification of ini_radiation interface -!! Nov. 29,2002 (JP Pinty) add C3R5, ICE2, ICE4, ELEC -!! Jan. 2004 (V.Masson) externalization of surface -!! May 2006 Remove KEPS -!! Apr. 2010 (M. Leriche) add pH for aqueous phase chemistry -!! Jul. 2010 (M. Leriche) add Ice phase chemistry -!! Oct. 2010 (J.Escobar) check if local domain not to small for NRIMX NRIMY -!! Nov. 2010 (J.Escobar) PGI BUG , add SIZE(CSV) to init_ground routine -!! Nov. 2009 (C. Barthe) add call to INI_ELEC_n -!! Mar. 2010 (M. Chong) add small ions -!! Apr. 2011 (M. Chong) correction of RESTART (ELEC) -!! June 2011 (B.Aouizerats) Prognostic aerosols -!! June 2011 (P.Aumond) Drag of the vegetation -!! + Mean fields -!! July 2013 (Bosseur & Filippi) Adds Forefire -!! P. Tulet Nov 2014 accumulated moles of aqueous species that fall at the surface -!! JAn. 2015 (F. Brosse) bug in allocate XACPRAQ -!! Dec 2014 (C.Lac) : For reproducibility START/RESTA -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! V. Masson Feb 2015 replaces, for aerosols, cover fractions by sea, town, bare soil fractions -!! J.Escobar : 19/04/2016 : Pb IOZ/NETCDF , missing OPARALLELIO=.FALSE. for PGD files -!! J.Escobar : 01/06/2016 : correct check limit of NRIM versus local subdomain size IDIM -!! 06/2016 (G.Delautier) phasage surfex 8 -!! Modification 01/2016 (JP Pinty) Add LIMA -!! Aug. 2016 (J.Pianezze) Add SFX_OASIS_READ_NAM function from SurfEx -!! M.Leriche 2016 Chemistry -!! 10/2016 M.Mazoyer New KHKO output fields -!! 10/2016 (C.Lac) Add max values -!! F. Brosse Oct. 2016 add prod/loss terms computation for chemistry -!! M.Leriche 2016 Chemistry -!! M.Leriche 10/02/17 prevent negative values in LBX(Y)SVS -!! M.Leriche 01/07/2017 Add DIAG chimical surface fluxes -!! 09/2017 Q.Rodier add LTEND_UV_FRC -!! 02/2018 Q.Libois ECRAD -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! V. Vionnet : 18/07/2017 : add blowing snow scheme -!! 01/18 J.Colin Add DRAG -! P. Wautelet 29/01/2019: bug: add missing zero-size allocations -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -! P. Wautelet 13/02/2019: initialize XALBUV even if no radiation (needed in CH_INTERP_JVALUES) -! P. Wautelet 13/02/2019: removed PPABSM and PTSTEP dummy arguments of READ_FIELD -! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! P. Wautelet 14/02/2019: remove HINIFILE dummy argument from INI_RADIATIONS_ECMWF/ECRAD -!! 02/2019 C.Lac add rain fraction as an output field -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 14/03/2019: correct ZWS when variable not present in file (set to XZWS_DEFAULT) -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 19/04/2019: removed unused dummy arguments and variables -! P. Wautelet 07/06/2019: allocate lookup tables for optical properties only when needed -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! C. Lac 11/2019: correction in the drag formula and application to building in addition to tree -! S. Riette 04/2020: XHL* fields -! F. Auguste 02/2021: add IBM -! T.Nigel 02/2021: add turbulence recycling -! J.L.Redelsperger 06/2011: OCEAN case -! R. Schoetter 12/2021 multi-level coupling between MesoNH and SURFEX -! R. Schoetter 12/2021 adds humidity and other mean diagnostics -! A. Costes 12/2021: Blaze fire model -!--------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -#ifdef MNH_ECRAD -USE YOERDI, only: RCCO2 -#endif - -USE MODD_2D_FRC -USE MODD_ADVFRC_n -USE MODD_ADV_n -use MODD_AEROSET, only: POLYTAU, POLYSSA, POLYG -USE MODD_ARGSLIST_ll, only: LIST_ll -USE MODD_BIKHARDT_n -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n -USE MODD_BUDGET -USE MODD_CH_AERO_n, only: XSOLORG,XMI -USE MODD_CH_AEROSOL, only: LORILAM -USE MODD_CH_BUDGET_n -USE MODD_CH_FLX_n, only: XCHFLX -USE MODD_CH_M9_n, only:NNONZEROTERMS -USE MODD_CH_MNHC_n, only: LUSECHEM, LUSECHAQ, LUSECHIC, LCH_INIT_FIELD, & - LCH_CONV_LINOX, XCH_TUV_DOBNEW, LCH_PH -USE MODD_CH_PH_n -USE MODD_CH_PRODLOSSTOT_n -USE MODD_CLOUD_MF_n -USE MODD_CONF -USE MODD_CONF_n -USE MODD_CST -USE MODD_CTURB -USE MODD_CURVCOR_n -USE MODD_DEEP_CONVECTION_n -USE MODD_DEF_EDDY_FLUX_n ! for VT and WT fluxes -USE MODD_DEF_EDDYUV_FLUX_n ! FOR UV -USE MODD_DIAG_FLAG, only: LCHEMDIAG, CSPEC_BU_DIAG -USE MODD_DIM_n -USE MODD_DRAG_n -USE MODD_DRAGTREE_n -USE MODD_DRAGBLDG_n -USE MODD_DUST -use MODD_DUST_OPT_LKT, only: NMAX_RADIUS_LKT_DUST=>NMAX_RADIUS_LKT, NMAX_SIGMA_LKT_DUST=>NMAX_SIGMA_LKT, & - NMAX_WVL_SW_DUST=>NMAX_WVL_SW, & - XEXT_COEFF_WVL_LKT_DUST=>XEXT_COEFF_WVL_LKT, XEXT_COEFF_550_LKT_DUST=>XEXT_COEFF_550_LKT, & - XPIZA_LKT_DUST=>XPIZA_LKT, XCGA_LKT_DUST=>XCGA_LKT -USE MODD_DYN -USE MODD_DYN_n -USE MODD_DYNZD -USE MODD_DYNZD_n -USE MODD_ELEC_n, only: XCION_POS_FW, XCION_NEG_FW -USE MODD_EOL_MAIN -USE MODD_FIELD_n -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE -USE MODD_FOREFIRE_n -#endif -USE MODD_FRC -USE MODD_FRC_n -USE MODD_GET_n -USE MODD_GRID_n -USE MODD_GRID, only: XLONORI,XLATORI -USE MODD_IBM_PARAM_n, only: LIBM, XIBM_IEPS, XIBM_LS, XIBM_XMUT -USE MODD_IO, only: CIO_DIR, TFILEDATA, TFILE_DUMMY -USE MODD_IO_SURF_MNH, only: IO_SURF_MNH_MODEL -USE MODD_LATZ_EDFLX -USE MODD_LBC_n, only: CLBCX, CLBCY -use modd_les -USE MODD_LSFIELD_n -USE MODD_LUNIT_n -USE MODD_MEAN_FIELD -USE MODD_MEAN_FIELD_n -USE MODD_METRICS_n -USE MODD_MNH_SURFEX_n -USE MODD_NESTING, only: CDAD_NAME, NDAD, NDT_2_WAY, NDTRATIO, NDXRATIO_ALL, NDYRATIO_ALL -USE MODD_NSV -USE MODD_NSV -USE MODD_NUDGING_n, only: LNUDGING -USE MODD_OCEANH -USE MODD_OUT_n -USE MODD_PARAMETERS -USE MODD_PARAM_KAFR_n -USE MODD_PARAM_MFSHALL_n -USE MODD_PARAM_n -USE MODD_PARAM_RAD_n, only: CAER, CAOP, CLW -USE MODD_PASPOL -USE MODD_PASPOL_n -USE MODD_PAST_FIELD_n -use modd_precision, only: LFIINT -USE MODD_RADIATIONS_n -USE MODD_RECYCL_PARAM_n -USE MODD_REF -USE MODD_REF_n -USE MODD_RELFRC_n -use MODD_SALT, only: LSALT -use MODD_SALT_OPT_LKT, only: NMAX_RADIUS_LKT_SALT=>NMAX_RADIUS_LKT, NMAX_SIGMA_LKT_SALT=>NMAX_SIGMA_LKT, & - NMAX_WVL_SW_SALT=>NMAX_WVL_SW, & - XEXT_COEFF_WVL_LKT_SALT=>XEXT_COEFF_WVL_LKT, XEXT_COEFF_550_LKT_SALT=>XEXT_COEFF_550_LKT, & - XPIZA_LKT_SALT=>XPIZA_LKT, XCGA_LKT_SALT=>XCGA_LKT -USE MODD_SERIES, only: LSERIES -USE MODD_SHADOWS_n -USE MODD_STAND_ATM, only: XSTROATM, XSMLSATM, XSMLWATM, XSPOSATM, XSPOWATM -USE MODD_SURF_PAR, only: XUNDEF_SFX => XUNDEF -USE MODD_TIME -USE MODD_TIME_n -USE MODD_TURB_n -USE MODD_NEB_n, only: LSUBG_COND, LSTATNW -USE MODD_VAR_ll, only: IP - -USE MODE_GATHER_ll -USE MODE_INI_AIRCRAFT_BALLOON, only: INI_AIRCRAFT_BALLOON -use mode_ini_budget, only: Budget_preallocate, Ini_budget -USE MODE_INI_ONE_WAY_n -USE MODE_IO -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_IO_FILE, only: IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -USE MODE_ll -USE MODE_MODELN_HANDLER -USE MODE_MPPDB -USE MODE_MSG -USE MODE_SET_GRID -USE MODE_SPLITTINGZ_ll, only: GET_DIM_EXTZ_ll -USE MODE_TYPE_ZDIFFU -USE MODE_FIELD, ONLY: INI_FIELD_LIST - -USE MODI_CH_AER_MOD_INIT -USE MODI_CH_INIT_BUDGET_n -USE MODI_CH_INIT_FIELD_n -USE MODI_CH_INIT_JVALUES -USE MODI_CH_INIT_PRODLOSSTOT_n -USE MODI_GET_SIZEX_LB -USE MODI_GET_SIZEY_LB -USE MODI_INI_AEROSET1 -USE MODI_INI_AEROSET2 -USE MODI_INI_AEROSET3 -USE MODI_INI_AEROSET4 -USE MODI_INI_AEROSET5 -USE MODI_INI_AEROSET6 -USE MODI_INI_BIKHARDT_n -USE MODI_INI_CPL -USE MODI_INI_DEEP_CONVECTION -USE MODI_INI_DRAG -USE MODI_INI_DYNAMICS -USE MODI_INI_ELEC_n -USE MODI_INI_EOL_ADNR -USE MODI_INI_EOL_ALM -USE MODI_INI_LES_N -USE MODI_INI_LG -USE MODI_INI_LW_SETUP -USE MODI_INI_MICRO_n -USE MODE_INI_TURB, ONLY: INI_TURB -USE MODE_INI_MFSHALL, ONLY: INI_MFSHALL -USE MODI_INI_POSPROFILER_n -USE MODI_INI_RADIATIONS -USE MODI_INI_RADIATIONS_ECMWF -USE MODI_INI_RADIATIONS_ECRAD -USE MODI_INI_SERIES_N -USE MODI_INI_SPAWN_LS_n -USE MODI_INI_SURF_RAD -USE MODI_INI_SURFSTATION_n -USE MODI_INI_SW_SETUP -USE MODE_INIT_AEROSOL_PROPERTIES, ONLY: INIT_AEROSOL_PROPERTIES -#ifdef MNH_FOREFIRE -USE MODI_INIT_FOREFIRE_n -#endif -USE MODI_INIT_GROUND_PARAM_n -USE MODI_INI_TKE_EPS -USE MODI_METRICS -USE MODI_MNHGET_SURF_PARAM_n -USE MODI_MNHREAD_ZS_DUMMY_n -USE MODI_READ_FIELD -USE MODI_SET_DIRCOS -USE MODI_SET_REF -#ifdef CPLOASIS -USE MODI_SFX_OASIS_READ_NAM -#endif -USE MODI_SUNPOS_n -USE MODI_SURF_SOLAR_GEOM -USE MODI_UPDATE_METRICS -USE MODI_UPDATE_NSV -#ifdef MNH_ECRAD -#if ( VER_ECRAD == 140 ) -USE YOERDI , ONLY :RCCO2 -#endif -#endif -! -USE MODD_FIRE_n -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -INTEGER, INTENT(IN) :: KMI ! Model Index -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file -! -!* 0.2 declarations of local variables -! -REAL, PARAMETER :: NALBUV_DEFAULT = 0.01 ! Arbitrary low value for XALBUV -! -INTEGER :: JSV ! Loop index -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: ILUOUT ! Logical unit number of output-listing -CHARACTER(LEN=28) :: YNAME -INTEGER :: IIU ! Upper dimension in x direction (local) -INTEGER :: IJU ! Upper dimension in y direction (local) -INTEGER :: IIU_ll ! Upper dimension in x direction (global) -INTEGER :: IJU_ll ! Upper dimension in y direction (global) -INTEGER :: IKU ! Upper dimension in z direction -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZJ ! Jacobian -LOGICAL :: GINIDCONV ! logical switch for the deep convection - ! initialization -LOGICAL :: GINIRAD ! logical switch for the radiation - ! initialization -logical :: gles ! Logical to determine if LES diagnostics are enabled -! -! -TYPE(LIST_ll), POINTER :: TZINITHALO2D_ll ! pointer for the list of 2D fields - ! which must be communicated in INIT -TYPE(LIST_ll), POINTER :: TZINITHALO3D_ll ! pointer for the list of 3D fields - ! which must be communicated in INIT -! -INTEGER :: IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU ! dimensions of the -INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2 ! West-east LB arrays -INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV ! dimensions of the -INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2 ! North-south LB arrays -INTEGER :: IINFO_ll ! Return code of //routines -INTEGER :: IIY,IJY -INTEGER :: IIU_B,IJU_B -INTEGER :: IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZCO2 ! CO2 concentration near the surface -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDIR_ALB ! direct albedo -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSCA_ALB ! diffuse albedo -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEMIS ! emissivity -REAL, DIMENSION(:,:), ALLOCATABLE :: ZTSRAD ! surface temperature -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZIBM_LS ! LevelSet IBM -! -! -INTEGER, DIMENSION(:,:),ALLOCATABLE :: IINDEX ! indices of non-zero terms -INTEGER, DIMENSION(:),ALLOCATABLE :: IIND -INTEGER :: JM, JT -! -!------------------------------------------ -! Dummy pointers needed to correct an ifort Bug -REAL, DIMENSION(:), POINTER :: DPTR_XZHAT -REAL, DIMENSION(:), POINTER :: DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4 -REAL, DIMENSION(:), POINTER :: DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4 -REAL, DIMENSION(:), POINTER :: DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4 -REAL, DIMENSION(:), POINTER :: DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4 -CHARACTER(LEN=4), DIMENSION(:), POINTER :: DPTR_CLBCX,DPTR_CLBCY -INTEGER, DIMENSION(:,:,:), POINTER :: DPTR_NKLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_NKLIN_LBXV,DPTR_NKLIN_LBYV -INTEGER, DIMENSION(:,:,:), POINTER :: DPTR_NKLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_NKLIN_LBXM,DPTR_NKLIN_LBYM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXU,DPTR_XCOEFLIN_LBYU -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXV,DPTR_XCOEFLIN_LBYV -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXW,DPTR_XCOEFLIN_LBYW -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXM,DPTR_XCOEFLIN_LBYM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXWM,DPTR_XLBYWM,DPTR_XLBXTHM,DPTR_XLBYTHM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXTKEM,DPTR_XLBYTKEM -REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXSVM,DPTR_XLBYSVM -REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXRM,DPTR_XLBYRM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XZZ -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS -REAL, DIMENSION(:,:), POINTER :: DPTR_XLSZWSM,DPTR_XLSZWSS -! -INTEGER :: IIB,IJB,IIE,IJE,IDIMX,IDIMY,IMI -! Fire model -INTEGER :: INBPARAMSENSIBLE, INBPARAMLATENT -!------------------------------------------------------------------------------- -! -!* 0. PROLOGUE -! -------- -! Compute relaxation coefficients without changing INI_DYNAMICS nor RELAXDEF -! -IF (CCLOUD == 'LIMA') THEN - LHORELAX_SVC1R3=LHORELAX_SVLIMA -END IF -! -! UPDATE CONSTANTS FOR OCEAN MODEL -IF (LOCEAN) THEN - XP00=XP00OCEAN - XTH00=XTH00OCEAN -END IF -! -! -NULLIFY(TZINITHALO2D_ll) -NULLIFY(TZINITHALO3D_ll) -! -!* 1. RETRIEVE LOGICAL UNIT NUMBER -! ---------------------------- -! -ILUOUT = TLUOUT%NLU -! -!------------------------------------------------------------------------------- -! -!* 2. END OF READING -! -------------- -!* 2.1 Read number of forcing fields -! -IF (LFORCING) THEN ! Retrieve the number of time-dependent forcings. - CALL IO_Field_read(TPINIFILE,'FRC',NFRC,IRESP) - IF ( (IRESP /= 0) .OR. (NFRC <=0) ) THEN - WRITE(ILUOUT,'(A/A)') & - "INI_MODEL_n ERROR: you want to read forcing variables from FMfile", & - " but no fields have been found by IO_Field_read" -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','') - END IF -END IF -! -! Modif PP for time evolving adv forcing - IF ( L2D_ADV_FRC ) THEN ! Retrieve the number of time-dependent forcings. - WRITE(ILUOUT,FMT=*) "INI_MODEL_n ENTER ADV_FORCING" - CALL IO_Field_read(TPINIFILE,'NADVFRC1',NADVFRC,IRESP) - IF ( (IRESP /= 0) .OR. (NADVFRC <=0) ) THEN - WRITE(ILUOUT,'(A/A)') & - "INI_MODELn ERROR: you want to read forcing ADV variables from FMfile", & - " but no fields have been found by IO_Field_read" - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','') - END IF - WRITE(ILUOUT,*) 'NADVFRC = ', NADVFRC -END IF -! -IF ( L2D_REL_FRC ) THEN ! Retrieve the number of time-dependent forcings. - WRITE(ILUOUT,FMT=*) "INI_MODEL_n ENTER REL_FORCING" - CALL IO_Field_read(TPINIFILE,'NRELFRC1',NRELFRC,IRESP) - IF ( (IRESP /= 0) .OR. (NRELFRC <=0) ) THEN - WRITE(ILUOUT,'(A/A)') & - "INI_MODELn ERROR: you want to read forcing REL variables from FMfile", & - " but no fields have been found by IO_Field_read" - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','') - END IF - WRITE(ILUOUT,*) 'NRELFRC = ', NRELFRC -END IF -!* 2.2 Checks the position of vertical absorbing layer -! -IKU=NKMAX+2*JPVEXT -! -ALLOCATE(XZHAT(IKU)) -CALL IO_Field_read(TPINIFILE,'ZHAT',XZHAT) -CALL IO_Field_read(TPINIFILE,'ZTOP',XZTOP) -IF (XALZBOT>=XZHAT(IKU) .AND. LVE_RELAX) THEN - WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR: you want to use vertical relaxation" - WRITE(ILUOUT,FMT=*) " but bottom of layer XALZBOT(",XALZBOT,")" - WRITE(ILUOUT,FMT=*) " is upper than model top (",XZHAT(IKU),")" -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','') -END IF -IF (LVE_RELAX) THEN - IF (XALZBOT>=XZHAT(IKU-4) ) THEN - WRITE(ILUOUT,FMT=*) "INI_MODEL_n WARNING: you want to use vertical relaxation" - WRITE(ILUOUT,FMT=*) " but the layer defined by XALZBOT(",XALZBOT,")" - WRITE(ILUOUT,FMT=*) " contains less than 5 model levels" - END IF -END IF -DEALLOCATE(XZHAT) -! -!* 2.3 Compute sizes of arrays of the extended sub-domain -! -CALL GET_DIM_EXT_ll('B',IIU,IJU) -IIU_ll=NIMAX_ll + 2 * JPHEXT -IJU_ll=NJMAX_ll + 2 * JPHEXT -! initialize NIMAX and NJMAX for not updated versions regarding the parallelism -! spawning,... -CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX) -! -CALL GET_INDICE_ll( IIB,IJB,IIE,IJE) -IDIMX = IIE - IIB + 1 -IDIMY = IJE - IJB + 1 -! -NRR=0 -NRRL=0 -NRRI=0 -IF (CGETRVT /= 'SKIP' ) THEN - NRR = NRR+1 - IDX_RVT = NRR -END IF -IF (CGETRCT /= 'SKIP' ) THEN - NRR = NRR+1 - NRRL = NRRL+1 - IDX_RCT = NRR -END IF -IF (CGETRRT /= 'SKIP' ) THEN - NRR = NRR+1 - NRRL = NRRL+1 - IDX_RRT = NRR -END IF -IF (CGETRIT /= 'SKIP' ) THEN - NRR = NRR+1 - NRRI = NRRI+1 - IDX_RIT = NRR -END IF -IF (CGETRST /= 'SKIP' ) THEN - NRR = NRR+1 - NRRI = NRRI+1 - IDX_RST = NRR -END IF -IF (CGETRGT /= 'SKIP' ) THEN - NRR = NRR+1 - NRRI = NRRI+1 - IDX_RGT = NRR -END IF -IF (CGETRHT /= 'SKIP' ) THEN - NRR = NRR+1 - NRRI = NRRI+1 - IDX_RHT = NRR -END IF -IF (NVERB >= 5) THEN - WRITE (UNIT=ILUOUT,FMT='("THERE ARE ",I2," WATER VARIABLES")') NRR - WRITE (UNIT=ILUOUT,FMT='("THERE ARE ",I2," LIQUID VARIABLES")') NRRL - WRITE (UNIT=ILUOUT,FMT='("THERE ARE ",I2," SOLID VARIABLES")') NRRI -END IF -! -!* 2.4 Update NSV and floating indices for the current model -! -! -CALL UPDATE_NSV(KMI) -! -!------------------------------------------------------------------------------- -! -!* 3. ALLOCATE MEMORY -! ----------------- -! * Module RECYCL -! -IF (LRECYCL) THEN -! - NR_COUNT = 0 -! - ALLOCATE(XUMEANW(IJU,IKU,NNUMBELT)) ; XUMEANW = 0.0 - ALLOCATE(XVMEANW(IJU,IKU,NNUMBELT)) ; XVMEANW = 0.0 - ALLOCATE(XWMEANW(IJU,IKU,NNUMBELT)) ; XWMEANW = 0.0 - ALLOCATE(XUMEANN(IIU,IKU,NNUMBELT)) ; XUMEANN = 0.0 - ALLOCATE(XVMEANN(IIU,IKU,NNUMBELT)) ; XVMEANN = 0.0 - ALLOCATE(XWMEANN(IIU,IKU,NNUMBELT)) ; XWMEANN = 0.0 - ALLOCATE(XUMEANE(IJU,IKU,NNUMBELT)) ; XUMEANE = 0.0 - ALLOCATE(XVMEANE(IJU,IKU,NNUMBELT)) ; XVMEANE = 0.0 - ALLOCATE(XWMEANE(IJU,IKU,NNUMBELT)) ; XWMEANE = 0.0 - ALLOCATE(XUMEANS(IIU,IKU,NNUMBELT)) ; XUMEANS = 0.0 - ALLOCATE(XVMEANS(IIU,IKU,NNUMBELT)) ; XVMEANS = 0.0 - ALLOCATE(XWMEANS(IIU,IKU,NNUMBELT)) ; XWMEANS = 0.0 - ALLOCATE(XTBV(IIU,IJU,IKU)) ; XTBV = 0.0 -ELSE - ALLOCATE(XUMEANW(0,0,0)) - ALLOCATE(XVMEANW(0,0,0)) - ALLOCATE(XWMEANW(0,0,0)) - ALLOCATE(XUMEANN(0,0,0)) - ALLOCATE(XVMEANN(0,0,0)) - ALLOCATE(XWMEANN(0,0,0)) - ALLOCATE(XUMEANE(0,0,0)) - ALLOCATE(XVMEANE(0,0,0)) - ALLOCATE(XWMEANE(0,0,0)) - ALLOCATE(XUMEANS(0,0,0)) - ALLOCATE(XVMEANS(0,0,0)) - ALLOCATE(XWMEANS(0,0,0)) - ALLOCATE(XTBV (0,0,0)) -END IF -! -! -!* 3.1 Module MODD_FIELD_n -! -IF (LMEAN_FIELD) THEN -! - MEAN_COUNT = 0 -! - ALLOCATE(XUM_MEAN(IIU,IJU,IKU)) ; XUM_MEAN = 0.0 - ALLOCATE(XVM_MEAN(IIU,IJU,IKU)) ; XVM_MEAN = 0.0 - ALLOCATE(XWM_MEAN(IIU,IJU,IKU)) ; XWM_MEAN = 0.0 - ALLOCATE(XTHM_MEAN(IIU,IJU,IKU)) ; XTHM_MEAN = 0.0 - ALLOCATE(XTEMPM_MEAN(IIU,IJU,IKU)) ; XTEMPM_MEAN = 0.0 - ALLOCATE(XSVT_MEAN(IIU,IJU,IKU)) ; XSVT_MEAN = 0.0 - IF (CTURB/='NONE') THEN - ALLOCATE(XTKEM_MEAN(IIU,IJU,IKU)) - XTKEM_MEAN = 0.0 - ELSE - ALLOCATE(XTKEM_MEAN(0,0,0)) - END IF - ALLOCATE(XPABSM_MEAN(IIU,IJU,IKU)) ; XPABSM_MEAN = 0.0 - ALLOCATE(XQ_MEAN(IIU,IJU,IKU)) ; XQ_MEAN = 0.0 - ALLOCATE(XRH_W_MEAN(IIU,IJU,IKU)) ; XRH_W_MEAN = 0.0 - ALLOCATE(XRH_I_MEAN(IIU,IJU,IKU)) ; XRH_I_MEAN = 0.0 - ALLOCATE(XRH_P_MEAN(IIU,IJU,IKU)) ; XRH_P_MEAN = 0.0 - ALLOCATE(XRH_W_MAXCOL_MEAN(IIU,IJU)) ; XRH_W_MAXCOL_MEAN = 0.0 - ALLOCATE(XRH_I_MAXCOL_MEAN(IIU,IJU)) ; XRH_I_MAXCOL_MEAN = 0.0 - ALLOCATE(XRH_P_MAXCOL_MEAN(IIU,IJU)) ; XRH_P_MAXCOL_MEAN = 0.0 - ALLOCATE(XWIFF_MEAN(IIU,IJU,IKU)) ; XWIFF_MEAN = 0.0 - ALLOCATE(XWIDD_MEAN(IIU,IJU,IKU)) ; XWIDD_MEAN = 0.0 - ALLOCATE(XWIFF_MAX (IIU,IJU,IKU)) ; XWIFF_MAX = 0.0 - ALLOCATE(XWIDD_MAX (IIU,IJU,IKU)) ; XWIDD_MAX = 0.0 -! - ALLOCATE(XU2_M2(IIU,IJU,IKU)) ; XU2_M2 = 0.0 -! - ALLOCATE(XU2_M2(IIU,IJU,IKU)) ; XU2_M2 = 0.0 - ALLOCATE(XV2_M2(IIU,IJU,IKU)) ; XV2_M2 = 0.0 - ALLOCATE(XW2_M2(IIU,IJU,IKU)) ; XW2_M2 = 0.0 - ALLOCATE(XTH2_M2(IIU,IJU,IKU)) ; XTH2_M2 = 0.0 - ALLOCATE(XTEMP2_M2(IIU,IJU,IKU)) ; XTEMP2_M2 = 0.0 - ALLOCATE(XPABS2_M2(IIU,IJU,IKU)) ; XPABS2_M2 = 0.0 -! - IF (LCOV_FIELD) THEN - ALLOCATE(XUV_MEAN(IIU,IJU,IKU)) ; XUV_MEAN = 0.0 - ALLOCATE(XUW_MEAN(IIU,IJU,IKU)) ; XUW_MEAN = 0.0 - ALLOCATE(XVW_MEAN(IIU,IJU,IKU)) ; XVW_MEAN = 0.0 - ALLOCATE(XWTH_MEAN(IIU,IJU,IKU)) ; XWTH_MEAN = 0.0 - END IF -! - ALLOCATE(XUM_MAX(IIU,IJU,IKU)) ; XUM_MAX = -1.E20 - ALLOCATE(XVM_MAX(IIU,IJU,IKU)) ; XVM_MAX = -1.E20 - ALLOCATE(XWM_MAX(IIU,IJU,IKU)) ; XWM_MAX = -1.E20 - ALLOCATE(XTHM_MAX(IIU,IJU,IKU)) ; XTHM_MAX = 0.0 - ALLOCATE(XTEMPM_MAX(IIU,IJU,IKU)) ; XTEMPM_MAX = 0.0 - IF (CTURB/='NONE') THEN - ALLOCATE(XTKEM_MAX(IIU,IJU,IKU)) - XTKEM_MAX = 0.0 - ELSE - ALLOCATE(XTKEM_MAX(0,0,0)) - END IF - ALLOCATE(XPABSM_MAX(IIU,IJU,IKU)) ; XPABSM_MAX = 0.0 -ELSE -! - ALLOCATE(XUM_MEAN(0,0,0)) - ALLOCATE(XVM_MEAN(0,0,0)) - ALLOCATE(XWM_MEAN(0,0,0)) - ALLOCATE(XTHM_MEAN(0,0,0)) - ALLOCATE(XTEMPM_MEAN(0,0,0)) - ALLOCATE(XSVT_MEAN(0,0,0)) - ALLOCATE(XTKEM_MEAN(0,0,0)) - ALLOCATE(XPABSM_MEAN(0,0,0)) -! - ALLOCATE(XU2_M2(0,0,0)) - ALLOCATE(XV2_M2(0,0,0)) - ALLOCATE(XW2_M2(0,0,0)) - ALLOCATE(XTH2_M2(0,0,0)) - ALLOCATE(XTEMP2_M2(0,0,0)) - ALLOCATE(XPABS2_M2(0,0,0)) -! - IF (LCOV_FIELD) THEN - ALLOCATE(XUV_MEAN(0,0,0)) - ALLOCATE(XUW_MEAN(0,0,0)) - ALLOCATE(XVW_MEAN(0,0,0)) - ALLOCATE(XWTH_MEAN(0,0,0)) - END IF -! - ALLOCATE(XUM_MAX(0,0,0)) - ALLOCATE(XVM_MAX(0,0,0)) - ALLOCATE(XWM_MAX(0,0,0)) - ALLOCATE(XTHM_MAX(0,0,0)) - ALLOCATE(XTEMPM_MAX(0,0,0)) - ALLOCATE(XTKEM_MAX(0,0,0)) - ALLOCATE(XPABSM_MAX(0,0,0)) -END IF -! -IF ((CUVW_ADV_SCHEME(1:3)=='CEN') .AND. (CTEMP_SCHEME == 'LEFR') ) THEN - ALLOCATE(XUM(IIU,IJU,IKU)) - ALLOCATE(XVM(IIU,IJU,IKU)) - ALLOCATE(XWM(IIU,IJU,IKU)) - ALLOCATE(XDUM(IIU,IJU,IKU)) - ALLOCATE(XDVM(IIU,IJU,IKU)) - ALLOCATE(XDWM(IIU,IJU,IKU)) - IF (CCONF == 'START') THEN - XUM = 0.0 - XVM = 0.0 - XWM = 0.0 - XDUM = 0.0 - XDVM = 0.0 - XDWM = 0.0 - END IF -ELSE - ALLOCATE(XUM(0,0,0)) - ALLOCATE(XVM(0,0,0)) - ALLOCATE(XWM(0,0,0)) - ALLOCATE(XDUM(0,0,0)) - ALLOCATE(XDVM(0,0,0)) - ALLOCATE(XDWM(0,0,0)) -END IF -! -ALLOCATE(XUT(IIU,IJU,IKU)) ; XUT = 0.0 -ALLOCATE(XVT(IIU,IJU,IKU)) ; XVT = 0.0 -ALLOCATE(XWT(IIU,IJU,IKU)) ; XWT = 0.0 -ALLOCATE(XTHT(IIU,IJU,IKU)) ; XTHT = 0.0 -ALLOCATE(XRUS(IIU,IJU,IKU)) ; XRUS = 0.0 -ALLOCATE(XRVS(IIU,IJU,IKU)) ; XRVS = 0.0 -ALLOCATE(XRWS(IIU,IJU,IKU)) ; XRWS = 0.0 -ALLOCATE(XRUS_PRES(IIU,IJU,IKU)); XRUS_PRES = 0.0 -ALLOCATE(XRVS_PRES(IIU,IJU,IKU)); XRVS_PRES = 0.0 -ALLOCATE(XRWS_PRES(IIU,IJU,IKU)); XRWS_PRES = 0.0 -ALLOCATE(XRTHS(IIU,IJU,IKU)) ; XRTHS = 0.0 -ALLOCATE(XRTHS_CLD(IIU,IJU,IKU)); XRTHS_CLD = 0.0 - -IF ( LIBM ) THEN - ALLOCATE(ZIBM_LS(IIU,IJU,IKU)) ; ZIBM_LS = 0.0 - ALLOCATE(XIBM_XMUT(IIU,IJU,IKU)); XIBM_XMUT = 0.0 -ELSE - ALLOCATE(ZIBM_LS (0,0,0)) - ALLOCATE(XIBM_XMUT(0,0,0)) -END IF - -IF ( LRECYCL ) THEN - ALLOCATE(XFLUCTUNW(IJU,IKU)) ; XFLUCTUNW = 0.0 - ALLOCATE(XFLUCTVNN(IIU,IKU)) ; XFLUCTVNN = 0.0 - ALLOCATE(XFLUCTUTN(IIU,IKU)) ; XFLUCTUTN = 0.0 - ALLOCATE(XFLUCTVTW(IJU,IKU)) ; XFLUCTVTW = 0.0 - ALLOCATE(XFLUCTUNE(IJU,IKU)) ; XFLUCTUNE = 0.0 - ALLOCATE(XFLUCTVNS(IIU,IKU)) ; XFLUCTVNS = 0.0 - ALLOCATE(XFLUCTUTS(IIU,IKU)) ; XFLUCTUTS = 0.0 - ALLOCATE(XFLUCTVTE(IJU,IKU)) ; XFLUCTVTE = 0.0 - ALLOCATE(XFLUCTWTW(IJU,IKU)) ; XFLUCTWTW = 0.0 - ALLOCATE(XFLUCTWTN(IIU,IKU)) ; XFLUCTWTN = 0.0 - ALLOCATE(XFLUCTWTE(IJU,IKU)) ; XFLUCTWTE = 0.0 - ALLOCATE(XFLUCTWTS(IIU,IKU)) ; XFLUCTWTS = 0.0 -ELSE - ALLOCATE(XFLUCTUNW(0,0)) - ALLOCATE(XFLUCTVNN(0,0)) - ALLOCATE(XFLUCTUTN(0,0)) - ALLOCATE(XFLUCTVTW(0,0)) - ALLOCATE(XFLUCTUNE(0,0)) - ALLOCATE(XFLUCTVNS(0,0)) - ALLOCATE(XFLUCTUTS(0,0)) - ALLOCATE(XFLUCTVTE(0,0)) - ALLOCATE(XFLUCTWTW(0,0)) - ALLOCATE(XFLUCTWTN(0,0)) - ALLOCATE(XFLUCTWTE(0,0)) - ALLOCATE(XFLUCTWTS(0,0)) -END IF -! -IF (CTURB /= 'NONE') THEN - ALLOCATE(XTKET(IIU,IJU,IKU)) - ALLOCATE(XRTKES(IIU,IJU,IKU)) - ALLOCATE(XRTKEMS(IIU,IJU,IKU)); XRTKEMS = 0.0 - ALLOCATE(XWTHVMF(IIU,IJU,IKU)) - ALLOCATE(XDYP(IIU,IJU,IKU)) - ALLOCATE(XTHP(IIU,IJU,IKU)) - ALLOCATE(XTR(IIU,IJU,IKU)) - ALLOCATE(XDISS(IIU,IJU,IKU)) - ALLOCATE(XLEM(IIU,IJU,IKU)) -ELSE - ALLOCATE(XTKET(0,0,0)) - ALLOCATE(XRTKES(0,0,0)) - ALLOCATE(XRTKEMS(0,0,0)) - ALLOCATE(XWTHVMF(0,0,0)) - ALLOCATE(XDYP(0,0,0)) - ALLOCATE(XTHP(0,0,0)) - ALLOCATE(XTR(0,0,0)) - ALLOCATE(XDISS(0,0,0)) - ALLOCATE(XLEM(0,0,0)) -END IF -IF (CTOM == 'TM06') THEN - ALLOCATE(XBL_DEPTH(IIU,IJU)) -ELSE - ALLOCATE(XBL_DEPTH(0,0)) -END IF -IF (LRMC01) THEN - ALLOCATE(XSBL_DEPTH(IIU,IJU)) -ELSE - ALLOCATE(XSBL_DEPTH(0,0)) -END IF -! -ALLOCATE(XPABSM(IIU,IJU,IKU)) ; XPABSM = 0.0 -ALLOCATE(XPABST(IIU,IJU,IKU)) ; XPABST = 0.0 -! -ALLOCATE(XRT(IIU,IJU,IKU,NRR)) ; XRT = 0.0 -ALLOCATE(XRRS(IIU,IJU,IKU,NRR)) ; XRRS = 0.0 -ALLOCATE(XRRS_CLD(IIU,IJU,IKU,NRR)); XRRS_CLD = 0.0 -! -IF (CTURB /= 'NONE' .AND. NRR>1) THEN - ALLOCATE(XSRCT(IIU,IJU,IKU)) - ALLOCATE(XSIGS(IIU,IJU,IKU)) -ELSE - ALLOCATE(XSRCT(0,0,0)) - ALLOCATE(XSIGS(0,0,0)) -END IF -IF (CCLOUD == 'ICE3'.OR.CCLOUD == 'ICE4') THEN - ALLOCATE(XHLC_HRC(IIU,IJU,IKU)) - ALLOCATE(XHLC_HCF(IIU,IJU,IKU)) - ALLOCATE(XHLI_HRI(IIU,IJU,IKU)) - ALLOCATE(XHLI_HCF(IIU,IJU,IKU)) - XHLC_HRC(:,:,:)=0. - XHLC_HCF(:,:,:)=0. - XHLI_HRI(:,:,:)=0. - XHLI_HCF(:,:,:)=0. -ELSE - ALLOCATE(XHLC_HRC(0,0,0)) - ALLOCATE(XHLC_HCF(0,0,0)) - ALLOCATE(XHLI_HRI(0,0,0)) - ALLOCATE(XHLI_HCF(0,0,0)) -END IF -! -IF (NRR>1) THEN - ALLOCATE(XCLDFR(IIU,IJU,IKU)); XCLDFR (:, :, :) = 0. - ALLOCATE(XICEFR(IIU,IJU,IKU)); XICEFR (:, :, :) = 0. - ALLOCATE(XRAINFR(IIU,IJU,IKU)); XRAINFR(:, :, :) = 0. -ELSE - ALLOCATE(XCLDFR(0,0,0)) - ALLOCATE(XICEFR(0,0,0)) - ALLOCATE(XRAINFR(0,0,0)) -END IF -! -ALLOCATE(XSVT(IIU,IJU,IKU,NSV)) ; XSVT = 0. -ALLOCATE(XRSVS(IIU,IJU,IKU,NSV)); XRSVS = 0. -ALLOCATE(XRSVS_CLD(IIU,IJU,IKU,NSV)); XRSVS_CLD = 0.0 -ALLOCATE(XZWS(IIU,IJU)) ; XZWS(:,:) = XZWS_DEFAULT -! -IF (LPASPOL) THEN - ALLOCATE( XATC(IIU,IJU,IKU,NSV_PP) ) - XATC = 0. -ELSE - ALLOCATE( XATC(0,0,0,0)) -END IF -! -IF(LBLOWSNOW) THEN - ALLOCATE(XSNWCANO(IIU,IJU,NBLOWSNOW_2D)) - ALLOCATE(XRSNWCANOS(IIU,IJU,NBLOWSNOW_2D)) - XSNWCANO(:,:,:) = 0.0 - XRSNWCANOS(:,:,:) = 0.0 -ELSE - ALLOCATE(XSNWCANO(0,0,0)) - ALLOCATE(XRSNWCANOS(0,0,0)) -END IF -! -!* 3.2 Module MODD_GRID_n and MODD_METRICS_n -! -IF (LCARTESIAN) THEN - ALLOCATE(XLON(0,0)) - ALLOCATE(XLAT(0,0)) - ALLOCATE(XMAP(0,0)) -ELSE - ALLOCATE(XLON(IIU,IJU)) - ALLOCATE(XLAT(IIU,IJU)) - ALLOCATE(XMAP(IIU,IJU)) -END IF -ALLOCATE(XXHAT(IIU)) -ALLOCATE(XDXHAT(IIU)) -ALLOCATE(XYHAT(IJU)) -ALLOCATE(XDYHAT(IJU)) -ALLOCATE(XXHATM(IIU)) -ALLOCATE(XYHATM(IJU)) -ALLOCATE(XZS(IIU,IJU)) -ALLOCATE(XZSMT(IIU,IJU)) -ALLOCATE(XZZ(IIU,IJU,IKU)) -ALLOCATE(XZHAT(IKU)) -ALLOCATE(XZHATM(IKU)) -ALLOCATE(XDIRCOSZW(IIU,IJU)) -ALLOCATE(XDIRCOSXW(IIU,IJU)) -ALLOCATE(XDIRCOSYW(IIU,IJU)) -ALLOCATE(XCOSSLOPE(IIU,IJU)) -ALLOCATE(XSINSLOPE(IIU,IJU)) -! -ALLOCATE(XDXX(IIU,IJU,IKU)) -ALLOCATE(XDYY(IIU,IJU,IKU)) -ALLOCATE(XDZX(IIU,IJU,IKU)) -ALLOCATE(XDZY(IIU,IJU,IKU)) -ALLOCATE(XDZZ(IIU,IJU,IKU)) -! -!* 3.3 Modules MODD_REF and MODD_REF_n -! -! Different reference states for Ocean and Atmosphere models -! For the moment, same reference states for O and A -!IF ((KMI == 1).OR.LCOUPLES) THEN -IF (KMI==1) THEN - ALLOCATE(XRHODREFZ(IKU),XTHVREFZ(IKU)) -ELSE IF (LCOUPLES) THEN -! in coupled O-A case, need different variables for ocean - ALLOCATE(XRHODREFZO(IKU),XTHVREFZO(IKU)) -ELSE - !Do not allocate XRHODREFZ and XTHVREFZ because they are the same on all grids (not 'n' variables) -END IF -! -ALLOCATE(XPHIT(IIU,IJU,IKU)) -ALLOCATE(XRHODREF(IIU,IJU,IKU)) -ALLOCATE(XTHVREF(IIU,IJU,IKU)) -ALLOCATE(XEXNREF(IIU,IJU,IKU)) -ALLOCATE(XRHODJ(IIU,IJU,IKU)) -IF (CEQNSYS=='DUR' .AND. LUSERV) THEN - ALLOCATE(XRVREF(IIU,IJU,IKU)) -ELSE - ALLOCATE(XRVREF(0,0,0)) -END IF -! -!* 3.4 Module MODD_CURVCOR_n -! -IF (LTHINSHELL) THEN - ALLOCATE(XCORIOX(0,0)) - ALLOCATE(XCORIOY(0,0)) -ELSE - ALLOCATE(XCORIOX(IIU,IJU)) - ALLOCATE(XCORIOY(IIU,IJU)) -END IF - ALLOCATE(XCORIOZ(IIU,IJU)) -IF (LCARTESIAN) THEN - ALLOCATE(XCURVX(0,0)) - ALLOCATE(XCURVY(0,0)) -ELSE - ALLOCATE(XCURVX(IIU,IJU)) - ALLOCATE(XCURVY(IIU,IJU)) -END IF -! -!* 3.5 Module MODD_DYN_n -! -CALL GET_DIM_EXT_ll('Y',IIY,IJY) -IF (L2D) THEN - ALLOCATE(XBFY(IIY,IJY,IKU)) -ELSE - ALLOCATE(XBFY(IJY,IIY,IKU)) ! transposition needed by the optimisation of the - ! FFT solver -END IF -CALL GET_DIM_EXT_ll('B',IIU_B,IJU_B) -ALLOCATE(XBFB(IIU_B,IJU_B,IKU)) -CALL GET_DIM_EXTZ_ll('SXP2_YP1_Z',IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll) -ALLOCATE(XBF_SXP2_YP1_Z(IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll)) -ALLOCATE(XAF(IKU),XCF(IKU)) -ALLOCATE(XTRIGSX(3*IIU_ll)) -ALLOCATE(XTRIGSY(3*IJU_ll)) -ALLOCATE(XRHOM(IKU)) -ALLOCATE(XALK(IKU)) -ALLOCATE(XALKW(IKU)) -ALLOCATE(XALKBAS(IKU)) -ALLOCATE(XALKWBAS(IKU)) -! -IF ( LHORELAX_UVWTH .OR. LHORELAX_RV .OR. & - LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI .OR. LHORELAX_RS .OR. & - LHORELAX_RG .OR. LHORELAX_RH .OR. LHORELAX_TKE .OR. & - ANY(LHORELAX_SV) ) THEN - ALLOCATE(XKURELAX(IIU,IJU)) - ALLOCATE(XKVRELAX(IIU,IJU)) - ALLOCATE(XKWRELAX(IIU,IJU)) - ALLOCATE(LMASK_RELAX(IIU,IJU)) -ELSE - ALLOCATE(XKURELAX(0,0)) - ALLOCATE(XKVRELAX(0,0)) - ALLOCATE(XKWRELAX(0,0)) - ALLOCATE(LMASK_RELAX(0,0)) -END IF -! -! Additional fields for truly horizontal diffusion (Module MODD_DYNZD$n) -IF (LZDIFFU) THEN - CALL INIT_TYPE_ZDIFFU_HALO2(XZDIFFU_HALO2) -ELSE - CALL INIT_TYPE_ZDIFFU_HALO2(XZDIFFU_HALO2,0) -ENDIF -! -!* 3.6 Larger Scale variables (Module MODD_LSFIELD$n) -! -! -! upper relaxation part -! -ALLOCATE(XLSUM(IIU,IJU,IKU)) ; XLSUM = 0.0 -ALLOCATE(XLSVM(IIU,IJU,IKU)) ; XLSVM = 0.0 -ALLOCATE(XLSWM(IIU,IJU,IKU)) ; XLSWM = 0.0 -ALLOCATE(XLSTHM(IIU,IJU,IKU)) ; XLSTHM = 0.0 -IF ( NRR > 0 ) THEN - ALLOCATE(XLSRVM(IIU,IJU,IKU)) ; XLSRVM = 0.0 -ELSE - ALLOCATE(XLSRVM(0,0,0)) -END IF -ALLOCATE(XLSZWSM(IIU,IJU)) ; XLSZWSM = -1. -! -! lbc part -! -IF ( L1D) THEN ! 1D case -! - NSIZELBX_ll=0 - NSIZELBXU_ll=0 - NSIZELBY_ll=0 - NSIZELBYV_ll=0 - NSIZELBXTKE_ll=0 - NSIZELBXR_ll=0 - NSIZELBXSV_ll=0 - NSIZELBYTKE_ll=0 - NSIZELBYR_ll=0 - NSIZELBYSV_ll=0 - ALLOCATE(XLBXUM(0,0,0)) - ALLOCATE(XLBYUM(0,0,0)) - ALLOCATE(XLBXVM(0,0,0)) - ALLOCATE(XLBYVM(0,0,0)) - ALLOCATE(XLBXWM(0,0,0)) - ALLOCATE(XLBYWM(0,0,0)) - ALLOCATE(XLBXTHM(0,0,0)) - ALLOCATE(XLBYTHM(0,0,0)) - ALLOCATE(XLBXTKEM(0,0,0)) - ALLOCATE(XLBYTKEM(0,0,0)) - ALLOCATE(XLBXRM(0,0,0,0)) - ALLOCATE(XLBYRM(0,0,0,0)) - ALLOCATE(XLBXSVM(0,0,0,0)) - ALLOCATE(XLBYSVM(0,0,0,0)) -! -ELSEIF( L2D ) THEN ! 2D case -! - NSIZELBY_ll=0 - NSIZELBYV_ll=0 - NSIZELBYTKE_ll=0 - NSIZELBYR_ll=0 - NSIZELBYSV_ll=0 - ALLOCATE(XLBYUM(0,0,0)) - ALLOCATE(XLBYVM(0,0,0)) - ALLOCATE(XLBYWM(0,0,0)) - ALLOCATE(XLBYTHM(0,0,0)) - ALLOCATE(XLBYTKEM(0,0,0)) - ALLOCATE(XLBYRM(0,0,0,0)) - ALLOCATE(XLBYSVM(0,0,0,0)) -! - CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX, & - IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, & - IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2) -! - IF ( LHORELAX_UVWTH ) THEN - NSIZELBX_ll=2*NRIMX+2*JPHEXT - NSIZELBXU_ll=2*NRIMX+2*JPHEXT - ALLOCATE(XLBXUM(IISIZEXFU,IJSIZEXFU,IKU)) - ALLOCATE(XLBXVM(IISIZEXF,IJSIZEXF,IKU)) - ALLOCATE(XLBXWM(IISIZEXF,IJSIZEXF,IKU)) - ALLOCATE(XLBXTHM(IISIZEXF,IJSIZEXF,IKU)) - ELSE - NSIZELBX_ll=2*JPHEXT ! 2 - NSIZELBXU_ll=2*(JPHEXT+1) ! 4 - ALLOCATE(XLBXUM(IISIZEX4,IJSIZEX4,IKU)) - ALLOCATE(XLBXVM(IISIZEX2,IJSIZEX2,IKU)) - ALLOCATE(XLBXWM(IISIZEX2,IJSIZEX2,IKU)) - ALLOCATE(XLBXTHM(IISIZEX2,IJSIZEX2,IKU)) - END IF -! - IF (CTURB /= 'NONE') THEN - IF ( LHORELAX_TKE) THEN - NSIZELBXTKE_ll=2* NRIMX+2*JPHEXT - ALLOCATE(XLBXTKEM(IISIZEXF,IJSIZEXF,IKU)) - ELSE - NSIZELBXTKE_ll=2*JPHEXT ! 2 - ALLOCATE(XLBXTKEM(IISIZEX2,IJSIZEX2,IKU)) - END IF - ELSE - NSIZELBXTKE_ll=0 - ALLOCATE(XLBXTKEM(0,0,0)) - END IF - ! - IF ( NRR > 0 ) THEN - IF (LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI & - .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH & - ) THEN - NSIZELBXR_ll=2* NRIMX+2*JPHEXT - ALLOCATE(XLBXRM(IISIZEXF,IJSIZEXF,IKU,NRR)) - ELSE - NSIZELBXR_ll=2*JPHEXT ! 2 - ALLOCATE(XLBXRM(IISIZEX2,IJSIZEX2,IKU,NRR)) - ENDIF - ELSE - NSIZELBXR_ll=0 - ALLOCATE(XLBXRM(0,0,0,0)) - END IF - ! - IF ( NSV > 0 ) THEN - IF ( ANY( LHORELAX_SV(:)) ) THEN - NSIZELBXSV_ll=2* NRIMX+2*JPHEXT - ALLOCATE(XLBXSVM(IISIZEXF,IJSIZEXF,IKU,NSV)) - ELSE - NSIZELBXSV_ll=2*JPHEXT ! 2 - ALLOCATE(XLBXSVM(IISIZEX2,IJSIZEX2,IKU,NSV)) - END IF - ELSE - NSIZELBXSV_ll=0 - ALLOCATE(XLBXSVM(0,0,0,0)) - END IF -! -ELSE ! 3D case -! -! - CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX, & - IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, & - IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2) - CALL GET_SIZEY_LB(NIMAX_ll,NJMAX_ll,NRIMY, & - IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV, & - IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2) -! -! check if local domain not to small for NRIMX NRIMY -! - IF ( CLBCX(1) /= 'CYCL' ) THEN - IF ( NRIMX .GT. IDIMX ) THEN - WRITE(*,'(A,I8,A/A,2I8,/A)') "Processor=", IP-1, & - " :: INI_MODEL_n ERROR: ( NRIMX > IDIMX ) ", & - " Local domain to small for relaxation NRIMX,IDIMX ", & - NRIMX,IDIMX ,& - " change relaxation parameters or number of processors " - call Print_msg(NVERB_FATAL,'GEN','INI_MODEL_n','') - END IF - END IF - IF ( CLBCY(1) /= 'CYCL' ) THEN - IF ( NRIMY .GT. IDIMY ) THEN - WRITE(*,'(A,I8,A/A,2I8,/A)') "Processor=", IP-1, & - " :: INI_MODEL_n ERROR: ( NRIMY > IDIMY ) ", & - " Local domain to small for relaxation NRIMY,IDIMY ", & - NRIMY,IDIMY ,& - " change relaxation parameters or number of processors " - call Print_msg(NVERB_FATAL,'GEN','INI_MODEL_n','') - END IF - END IF -IF ( LHORELAX_UVWTH ) THEN - NSIZELBX_ll=2*NRIMX+2*JPHEXT - NSIZELBXU_ll=2*NRIMX+2*JPHEXT - NSIZELBY_ll=2*NRIMY+2*JPHEXT - NSIZELBYV_ll=2*NRIMY+2*JPHEXT - ALLOCATE(XLBXUM(IISIZEXFU,IJSIZEXFU,IKU)) - ALLOCATE(XLBYUM(IISIZEYF,IJSIZEYF,IKU)) - ALLOCATE(XLBXVM(IISIZEXF,IJSIZEXF,IKU)) - ALLOCATE(XLBYVM(IISIZEYFV,IJSIZEYFV,IKU)) - ALLOCATE(XLBXWM(IISIZEXF,IJSIZEXF,IKU)) - ALLOCATE(XLBYWM(IISIZEYF,IJSIZEYF,IKU)) - ALLOCATE(XLBXTHM(IISIZEXF,IJSIZEXF,IKU)) - ALLOCATE(XLBYTHM(IISIZEYF,IJSIZEYF,IKU)) - ELSE - NSIZELBX_ll=2*JPHEXT ! 2 - NSIZELBXU_ll=2*(JPHEXT+1) ! 4 - NSIZELBY_ll=2*JPHEXT ! 2 - NSIZELBYV_ll=2*(JPHEXT+1) ! 4 - ALLOCATE(XLBXUM(IISIZEX4,IJSIZEX4,IKU)) - ALLOCATE(XLBYUM(IISIZEY2,IJSIZEY2,IKU)) - ALLOCATE(XLBXVM(IISIZEX2,IJSIZEX2,IKU)) - ALLOCATE(XLBYVM(IISIZEY4,IJSIZEY4,IKU)) - ALLOCATE(XLBXWM(IISIZEX2,IJSIZEX2,IKU)) - ALLOCATE(XLBYWM(IISIZEY2,IJSIZEY2,IKU)) - ALLOCATE(XLBXTHM(IISIZEX2,IJSIZEX2,IKU)) - ALLOCATE(XLBYTHM(IISIZEY2,IJSIZEY2,IKU)) - END IF - ! - IF (CTURB /= 'NONE') THEN - IF ( LHORELAX_TKE) THEN - NSIZELBXTKE_ll=2*NRIMX+2*JPHEXT - NSIZELBYTKE_ll=2*NRIMY+2*JPHEXT - ALLOCATE(XLBXTKEM(IISIZEXF,IJSIZEXF,IKU)) - ALLOCATE(XLBYTKEM(IISIZEYF,IJSIZEYF,IKU)) - ELSE - NSIZELBXTKE_ll=2*JPHEXT ! 2 - NSIZELBYTKE_ll=2*JPHEXT ! 2 - ALLOCATE(XLBXTKEM(IISIZEX2,IJSIZEX2,IKU)) - ALLOCATE(XLBYTKEM(IISIZEY2,IJSIZEY2,IKU)) - END IF - ELSE - NSIZELBXTKE_ll=0 - NSIZELBYTKE_ll=0 - ALLOCATE(XLBXTKEM(0,0,0)) - ALLOCATE(XLBYTKEM(0,0,0)) - END IF - ! - IF ( NRR > 0 ) THEN - IF (LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI & - .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH & - ) THEN - NSIZELBXR_ll=2*NRIMX+2*JPHEXT - NSIZELBYR_ll=2*NRIMY+2*JPHEXT - ALLOCATE(XLBXRM(IISIZEXF,IJSIZEXF,IKU,NRR)) - ALLOCATE(XLBYRM(IISIZEYF,IJSIZEYF,IKU,NRR)) - ELSE - NSIZELBXR_ll=2*JPHEXT ! 2 - NSIZELBYR_ll=2*JPHEXT ! 2 - ALLOCATE(XLBXRM(IISIZEX2,IJSIZEX2,IKU,NRR)) - ALLOCATE(XLBYRM(IISIZEY2,IJSIZEY2,IKU,NRR)) - ENDIF - ELSE - NSIZELBXR_ll=0 - NSIZELBYR_ll=0 - ALLOCATE(XLBXRM(0,0,0,0)) - ALLOCATE(XLBYRM(0,0,0,0)) - END IF - ! - IF ( NSV > 0 ) THEN - IF ( ANY( LHORELAX_SV(:)) ) THEN - NSIZELBXSV_ll=2*NRIMX+2*JPHEXT - NSIZELBYSV_ll=2*NRIMY+2*JPHEXT - ALLOCATE(XLBXSVM(IISIZEXF,IJSIZEXF,IKU,NSV)) - ALLOCATE(XLBYSVM(IISIZEYF,IJSIZEYF,IKU,NSV)) - ELSE - NSIZELBXSV_ll=2*JPHEXT ! 2 - NSIZELBYSV_ll=2*JPHEXT ! 2 - ALLOCATE(XLBXSVM(IISIZEX2,IJSIZEX2,IKU,NSV)) - ALLOCATE(XLBYSVM(IISIZEY2,IJSIZEY2,IKU,NSV)) - END IF - ELSE - NSIZELBXSV_ll=0 - NSIZELBYSV_ll=0 - ALLOCATE(XLBXSVM(0,0,0,0)) - ALLOCATE(XLBYSVM(0,0,0,0)) - END IF -END IF ! END OF THE IF STRUCTURE ON THE MODEL DIMENSION -! -! -IF ( KMI > 1 ) THEN - ! it has been assumed that the THeta field used the largest rim area compared - ! to the others prognostic variables, if it is not the case, you must change - ! these lines - ALLOCATE(XCOEFLIN_LBXM(SIZE(XLBXTHM,1),SIZE(XLBXTHM,2),SIZE(XLBXTHM,3))) - ALLOCATE( NKLIN_LBXM(SIZE(XLBXTHM,1),SIZE(XLBXTHM,2),SIZE(XLBXTHM,3))) - ALLOCATE(XCOEFLIN_LBYM(SIZE(XLBYTHM,1),SIZE(XLBYTHM,2),SIZE(XLBYTHM,3))) - ALLOCATE( NKLIN_LBYM(SIZE(XLBYTHM,1),SIZE(XLBYTHM,2),SIZE(XLBYTHM,3))) - ALLOCATE(XCOEFLIN_LBXU(SIZE(XLBXUM,1),SIZE(XLBXUM,2),SIZE(XLBXUM,3))) - ALLOCATE( NKLIN_LBXU(SIZE(XLBXUM,1),SIZE(XLBXUM,2),SIZE(XLBXUM,3))) - ALLOCATE(XCOEFLIN_LBYU(SIZE(XLBYUM,1),SIZE(XLBYUM,2),SIZE(XLBYUM,3))) - ALLOCATE( NKLIN_LBYU(SIZE(XLBYUM,1),SIZE(XLBYUM,2),SIZE(XLBYUM,3))) - ALLOCATE(XCOEFLIN_LBXV(SIZE(XLBXVM,1),SIZE(XLBXVM,2),SIZE(XLBXVM,3))) - ALLOCATE( NKLIN_LBXV(SIZE(XLBXVM,1),SIZE(XLBXVM,2),SIZE(XLBXVM,3))) - ALLOCATE(XCOEFLIN_LBYV(SIZE(XLBYVM,1),SIZE(XLBYVM,2),SIZE(XLBYVM,3))) - ALLOCATE( NKLIN_LBYV(SIZE(XLBYVM,1),SIZE(XLBYVM,2),SIZE(XLBYVM,3))) - ALLOCATE(XCOEFLIN_LBXW(SIZE(XLBXWM,1),SIZE(XLBXWM,2),SIZE(XLBXWM,3))) - ALLOCATE( NKLIN_LBXW(SIZE(XLBXWM,1),SIZE(XLBXWM,2),SIZE(XLBXWM,3))) - ALLOCATE(XCOEFLIN_LBYW(SIZE(XLBYWM,1),SIZE(XLBYWM,2),SIZE(XLBYWM,3))) - ALLOCATE( NKLIN_LBYW(SIZE(XLBYWM,1),SIZE(XLBYWM,2),SIZE(XLBYWM,3))) -ELSE - ALLOCATE(XCOEFLIN_LBXM(0,0,0)) - ALLOCATE( NKLIN_LBXM(0,0,0)) - ALLOCATE(XCOEFLIN_LBYM(0,0,0)) - ALLOCATE( NKLIN_LBYM(0,0,0)) - ALLOCATE(XCOEFLIN_LBXU(0,0,0)) - ALLOCATE( NKLIN_LBXU(0,0,0)) - ALLOCATE(XCOEFLIN_LBYU(0,0,0)) - ALLOCATE( NKLIN_LBYU(0,0,0)) - ALLOCATE(XCOEFLIN_LBXV(0,0,0)) - ALLOCATE( NKLIN_LBXV(0,0,0)) - ALLOCATE(XCOEFLIN_LBYV(0,0,0)) - ALLOCATE( NKLIN_LBYV(0,0,0)) - ALLOCATE(XCOEFLIN_LBXW(0,0,0)) - ALLOCATE( NKLIN_LBXW(0,0,0)) - ALLOCATE(XCOEFLIN_LBYW(0,0,0)) - ALLOCATE( NKLIN_LBYW(0,0,0)) -END IF -! -! allocation of the LS fields for vertical relaxation and numerical diffusion -IF( .NOT. LSTEADYLS ) THEN -! - ALLOCATE(XLSUS(SIZE(XLSUM,1),SIZE(XLSUM,2),SIZE(XLSUM,3))) - ALLOCATE(XLSVS(SIZE(XLSVM,1),SIZE(XLSVM,2),SIZE(XLSVM,3))) - ALLOCATE(XLSWS(SIZE(XLSWM,1),SIZE(XLSWM,2),SIZE(XLSWM,3))) - ALLOCATE(XLSTHS(SIZE(XLSTHM,1),SIZE(XLSTHM,2),SIZE(XLSTHM,3))) - ALLOCATE(XLSRVS(SIZE(XLSRVM,1),SIZE(XLSRVM,2),SIZE(XLSRVM,3))) - ALLOCATE(XLSZWSS(SIZE(XLSZWSM,1),SIZE(XLSZWSM,2))) -! -ELSE -! - ALLOCATE(XLSUS(0,0,0)) - ALLOCATE(XLSVS(0,0,0)) - ALLOCATE(XLSWS(0,0,0)) - ALLOCATE(XLSTHS(0,0,0)) - ALLOCATE(XLSRVS(0,0,0)) - ALLOCATE(XLSZWSS(0,0)) -! -END IF -! allocation of the LB fields for horizontal relaxation and Lateral Boundaries -IF( .NOT. ( LSTEADYLS .AND. KMI==1 ) ) THEN -! - ALLOCATE(XLBXTKES(SIZE(XLBXTKEM,1),SIZE(XLBXTKEM,2),SIZE(XLBXTKEM,3))) - ALLOCATE(XLBYTKES(SIZE(XLBYTKEM,1),SIZE(XLBYTKEM,2),SIZE(XLBYTKEM,3))) - ALLOCATE(XLBXUS(SIZE(XLBXUM,1),SIZE(XLBXUM,2),SIZE(XLBXUM,3))) - ALLOCATE(XLBYUS(SIZE(XLBYUM,1),SIZE(XLBYUM,2),SIZE(XLBYUM,3))) - ALLOCATE(XLBXVS(SIZE(XLBXVM,1),SIZE(XLBXVM,2),SIZE(XLBXVM,3))) - ALLOCATE(XLBYVS(SIZE(XLBYVM,1),SIZE(XLBYVM,2),SIZE(XLBYVM,3))) - ALLOCATE(XLBXWS(SIZE(XLBXWM,1),SIZE(XLBXWM,2),SIZE(XLBXWM,3))) - ALLOCATE(XLBYWS(SIZE(XLBYWM,1),SIZE(XLBYWM,2),SIZE(XLBYWM,3))) - ALLOCATE(XLBXTHS(SIZE(XLBXTHM,1),SIZE(XLBXTHM,2),SIZE(XLBXTHM,3))) - ALLOCATE(XLBYTHS(SIZE(XLBYTHM,1),SIZE(XLBYTHM,2),SIZE(XLBYTHM,3))) - ALLOCATE(XLBXRS(SIZE(XLBXRM,1),SIZE(XLBXRM,2),SIZE(XLBXRM,3),SIZE(XLBXRM,4))) - ALLOCATE(XLBYRS(SIZE(XLBYRM,1),SIZE(XLBYRM,2),SIZE(XLBYRM,3),SIZE(XLBYRM,4))) - ALLOCATE(XLBXSVS(SIZE(XLBXSVM,1),SIZE(XLBXSVM,2),SIZE(XLBXSVM,3),SIZE(XLBXSVM,4))) - ALLOCATE(XLBYSVS(SIZE(XLBYSVM,1),SIZE(XLBYSVM,2),SIZE(XLBYSVM,3),SIZE(XLBYSVM,4))) -! -ELSE -! - ALLOCATE(XLBXTKES(0,0,0)) - ALLOCATE(XLBYTKES(0,0,0)) - ALLOCATE(XLBXUS(0,0,0)) - ALLOCATE(XLBYUS(0,0,0)) - ALLOCATE(XLBXVS(0,0,0)) - ALLOCATE(XLBYVS(0,0,0)) - ALLOCATE(XLBXWS(0,0,0)) - ALLOCATE(XLBYWS(0,0,0)) - ALLOCATE(XLBXTHS(0,0,0)) - ALLOCATE(XLBYTHS(0,0,0)) - ALLOCATE(XLBXRS(0,0,0,0)) - ALLOCATE(XLBYRS(0,0,0,0)) - ALLOCATE(XLBXSVS(0,0,0,0)) - ALLOCATE(XLBYSVS(0,0,0,0)) -! -END IF -! -! -!* 3.7 Module MODD_RADIATIONS_n (except XOZON and XAER) -! -! Initialization of SW bands -NSWB_OLD = 6 ! Number of bands in ECMWF original scheme (from Fouquart et Bonnel (1980)) - ! then modified through INI_RADIATIONS_ECMWF but remains equal to 6 practically - -#ifdef MNH_ECRAD -#if ( VER_ECRAD == 140 ) -NLWB_OLD = 16 ! For XEMIS initialization (should be spectral in the future) -#endif -#endif - -NLWB_MNH = 16 ! For XEMIS initialization (should be spectral in the future) - -IF (CRAD == 'ECRA') THEN - NSWB_MNH = 14 -#ifdef MNH_ECRAD -#if ( VER_ECRAD == 140 ) - NLWB_MNH = 16 -#endif -#endif -ELSE - NSWB_MNH = NSWB_OLD -#ifdef MNH_ECRAD -#if ( VER_ECRAD == 140 ) - NLWB_MNH = NLWB_OLD -#endif -#endif -END IF - -ALLOCATE(XSW_BANDS (NSWB_MNH)) -ALLOCATE(XLW_BANDS (NLWB_MNH)) -ALLOCATE(XZENITH (IIU,IJU)) -ALLOCATE(XAZIM (IIU,IJU)) -ALLOCATE(XALBUV (IIU,IJU)) -XALBUV(:,:) = NALBUV_DEFAULT !Set to an arbitrary low value (XALBUV is needed in CH_INTERP_JVALUES even if no radiation) -ALLOCATE(XDIRSRFSWD(IIU,IJU,NSWB_MNH)) -ALLOCATE(XSCAFLASWD(IIU,IJU,NSWB_MNH)) -ALLOCATE(XFLALWD (IIU,IJU)) -! -IF (CRAD /= 'NONE') THEN - ALLOCATE(XSLOPANG(IIU,IJU)) - ALLOCATE(XSLOPAZI(IIU,IJU)) - ALLOCATE(XDTHRAD(IIU,IJU,IKU)) - ALLOCATE(XDIRFLASWD(IIU,IJU,NSWB_MNH)) - ALLOCATE(XDIR_ALB(IIU,IJU,NSWB_MNH)) - ALLOCATE(XSCA_ALB(IIU,IJU,NSWB_MNH)) - ALLOCATE(XEMIS (IIU,IJU,NLWB_MNH)) - ALLOCATE(XTSRAD (IIU,IJU)) ; XTSRAD = XUNDEF_SFX - ALLOCATE(XSEA (IIU,IJU)) - ALLOCATE(XZS_XY (IIU,IJU)) - ALLOCATE(NCLEARCOL_TM1(IIU,IJU)) - ALLOCATE(XSWU(IIU,IJU,IKU)) - ALLOCATE(XSWD(IIU,IJU,IKU)) - ALLOCATE(XLWU(IIU,IJU,IKU)) - ALLOCATE(XLWD(IIU,IJU,IKU)) - ALLOCATE(XDTHRADSW(IIU,IJU,IKU)) - ALLOCATE(XDTHRADLW(IIU,IJU,IKU)) - ALLOCATE(XRADEFF(IIU,IJU,IKU)) -ELSE - ALLOCATE(XSLOPANG(0,0)) - ALLOCATE(XSLOPAZI(0,0)) - ALLOCATE(XDTHRAD(0,0,0)) - ALLOCATE(XDIRFLASWD(0,0,0)) - ALLOCATE(XDIR_ALB(0,0,0)) - ALLOCATE(XSCA_ALB(0,0,0)) - ALLOCATE(XEMIS (0,0,0)) - ALLOCATE(XTSRAD (0,0)) - ALLOCATE(XSEA (0,0)) - ALLOCATE(XZS_XY (0,0)) - ALLOCATE(NCLEARCOL_TM1(0,0)) - ALLOCATE(XSWU(0,0,0)) - ALLOCATE(XSWD(0,0,0)) - ALLOCATE(XLWU(0,0,0)) - ALLOCATE(XLWD(0,0,0)) - ALLOCATE(XDTHRADSW(0,0,0)) - ALLOCATE(XDTHRADLW(0,0,0)) - ALLOCATE(XRADEFF(0,0,0)) -END IF - -IF (CRAD == 'ECMW' .OR. CRAD == 'ECRA') THEN - ALLOCATE(XSTROATM(31,6)) - ALLOCATE(XSMLSATM(31,6)) - ALLOCATE(XSMLWATM(31,6)) - ALLOCATE(XSPOSATM(31,6)) - ALLOCATE(XSPOWATM(31,6)) - ALLOCATE(XSTATM(31,6)) -ELSE - ALLOCATE(XSTROATM(0,0)) - ALLOCATE(XSMLSATM(0,0)) - ALLOCATE(XSMLWATM(0,0)) - ALLOCATE(XSPOSATM(0,0)) - ALLOCATE(XSPOWATM(0,0)) - ALLOCATE(XSTATM(0,0)) -END IF -! -!* 3.8 Module MODD_DEEP_CONVECTION_n -! -IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN - ALLOCATE(NCOUNTCONV(IIU,IJU)) - ALLOCATE(XDTHCONV(IIU,IJU,IKU)) - ALLOCATE(XDRVCONV(IIU,IJU,IKU)) - ALLOCATE(XDRCCONV(IIU,IJU,IKU)) - ALLOCATE(XDRICONV(IIU,IJU,IKU)) - ALLOCATE(XPRCONV(IIU,IJU)) - ALLOCATE(XPACCONV(IIU,IJU)) - ALLOCATE(XPRSCONV(IIU,IJU)) - ! diagnostics - IF (LCH_CONV_LINOX) THEN - ALLOCATE(XIC_RATE(IIU,IJU)) - ALLOCATE(XCG_RATE(IIU,IJU)) - ALLOCATE(XIC_TOTAL_NUMBER(IIU,IJU)) - ALLOCATE(XCG_TOTAL_NUMBER(IIU,IJU)) - ELSE - ALLOCATE(XIC_RATE(0,0)) - ALLOCATE(XCG_RATE(0,0)) - ALLOCATE(XIC_TOTAL_NUMBER(0,0)) - ALLOCATE(XCG_TOTAL_NUMBER(0,0)) - END IF - IF ( LDIAGCONV ) THEN - ALLOCATE(XUMFCONV(IIU,IJU,IKU)) - ALLOCATE(XDMFCONV(IIU,IJU,IKU)) - ALLOCATE(XPRLFLXCONV(IIU,IJU,IKU)) - ALLOCATE(XPRSFLXCONV(IIU,IJU,IKU)) - ALLOCATE(XCAPE(IIU,IJU)) - ALLOCATE(NCLTOPCONV(IIU,IJU)) - ALLOCATE(NCLBASCONV(IIU,IJU)) - ELSE - ALLOCATE(XUMFCONV(0,0,0)) - ALLOCATE(XDMFCONV(0,0,0)) - ALLOCATE(XPRLFLXCONV(0,0,0)) - ALLOCATE(XPRSFLXCONV(0,0,0)) - ALLOCATE(XCAPE(0,0)) - ALLOCATE(NCLTOPCONV(0,0)) - ALLOCATE(NCLBASCONV(0,0)) - END IF -ELSE - ALLOCATE(NCOUNTCONV(0,0)) - ALLOCATE(XDTHCONV(0,0,0)) - ALLOCATE(XDRVCONV(0,0,0)) - ALLOCATE(XDRCCONV(0,0,0)) - ALLOCATE(XDRICONV(0,0,0)) - ALLOCATE(XPRCONV(0,0)) - ALLOCATE(XPACCONV(0,0)) - ALLOCATE(XPRSCONV(0,0)) - ALLOCATE(XIC_RATE(0,0)) - ALLOCATE(XCG_RATE(0,0)) - ALLOCATE(XIC_TOTAL_NUMBER(0,0)) - ALLOCATE(XCG_TOTAL_NUMBER(0,0)) - ALLOCATE(XUMFCONV(0,0,0)) - ALLOCATE(XDMFCONV(0,0,0)) - ALLOCATE(XPRLFLXCONV(0,0,0)) - ALLOCATE(XPRSFLXCONV(0,0,0)) - ALLOCATE(XCAPE(0,0)) - ALLOCATE(NCLTOPCONV(0,0)) - ALLOCATE(NCLBASCONV(0,0)) -END IF -! -IF ((CDCONV == 'KAFR' .OR. CSCONV == 'KAFR') & - .AND. LSUBG_COND .AND. LSIG_CONV) THEN - ALLOCATE(XMFCONV(IIU,IJU,IKU)) -ELSE - ALLOCATE(XMFCONV(0,0,0)) -ENDIF -! -IF ((CDCONV == 'KAFR' .OR. CSCONV == 'KAFR') & - .AND. LCHTRANS .AND. NSV > 0 ) THEN - ALLOCATE(XDSVCONV(IIU,IJU,IKU,NSV)) -ELSE - ALLOCATE(XDSVCONV(0,0,0,0)) -END IF -! -ALLOCATE(XCF_MF(IIU,IJU,IKU)) ; XCF_MF=0.0 -ALLOCATE(XRC_MF(IIU,IJU,IKU)) ; XRC_MF=0.0 -ALLOCATE(XRI_MF(IIU,IJU,IKU)) ; XRI_MF=0.0 -! -!* 3.9 Local variables -! -ALLOCATE(ZJ(IIU,IJU,IKU)) -! -!* 3.10 Forcing variables (Module MODD_FRC and MODD_FRCn) -! -IF ( LFORCING ) THEN - ALLOCATE(XWTFRC(IIU,IJU,IKU)) ; XWTFRC = XUNDEF - ALLOCATE(XUFRC_PAST(IIU,IJU,IKU)) ; XUFRC_PAST = XUNDEF - ALLOCATE(XVFRC_PAST(IIU,IJU,IKU)) ; XVFRC_PAST = XUNDEF -ELSE - ALLOCATE(XWTFRC(0,0,0)) - ALLOCATE(XUFRC_PAST(0,0,0)) - ALLOCATE(XVFRC_PAST(0,0,0)) -END IF -! -IF (KMI == 1) THEN - IF ( LFORCING ) THEN - ALLOCATE(TDTFRC(NFRC)) - ALLOCATE(XUFRC(IKU,NFRC)) - ALLOCATE(XVFRC(IKU,NFRC)) - ALLOCATE(XWFRC(IKU,NFRC)) - ALLOCATE(XTHFRC(IKU,NFRC)) - ALLOCATE(XRVFRC(IKU,NFRC)) - ALLOCATE(XTENDTHFRC(IKU,NFRC)) - ALLOCATE(XTENDRVFRC(IKU,NFRC)) - ALLOCATE(XGXTHFRC(IKU,NFRC)) - ALLOCATE(XGYTHFRC(IKU,NFRC)) - ALLOCATE(XPGROUNDFRC(NFRC)) - ALLOCATE(XTENDUFRC(IKU,NFRC)) - ALLOCATE(XTENDVFRC(IKU,NFRC)) - ELSE - ALLOCATE(TDTFRC(0)) - ALLOCATE(XUFRC(0,0)) - ALLOCATE(XVFRC(0,0)) - ALLOCATE(XWFRC(0,0)) - ALLOCATE(XTHFRC(0,0)) - ALLOCATE(XRVFRC(0,0)) - ALLOCATE(XTENDTHFRC(0,0)) - ALLOCATE(XTENDRVFRC(0,0)) - ALLOCATE(XGXTHFRC(0,0)) - ALLOCATE(XGYTHFRC(0,0)) - ALLOCATE(XPGROUNDFRC(0)) - ALLOCATE(XTENDUFRC(0,0)) - ALLOCATE(XTENDVFRC(0,0)) - END IF -ELSE - !Do not allocate because they are the same on all grids (not 'n' variables) -END IF -! ---------------------------------------------------------------------- -! -IF (L2D_ADV_FRC) THEN - WRITE(ILUOUT,*) 'L2D_ADV_FRC IS SET TO', L2D_ADV_FRC - WRITE(ILUOUT,*) 'ADV FRC WILL BE SET' - ALLOCATE(TDTADVFRC(NADVFRC)) - ALLOCATE(XDTHFRC(IIU,IJU,IKU,NADVFRC)) ; XDTHFRC=0. - ALLOCATE(XDRVFRC(IIU,IJU,IKU,NADVFRC)) ; XDRVFRC=0. -ELSE - ALLOCATE(TDTADVFRC(0)) - ALLOCATE(XDTHFRC(0,0,0,0)) - ALLOCATE(XDRVFRC(0,0,0,0)) -ENDIF - -IF (L2D_REL_FRC) THEN - WRITE(ILUOUT,*) 'L2D_REL_FRC IS SET TO', L2D_REL_FRC - WRITE(ILUOUT,*) 'REL FRC WILL BE SET' - ALLOCATE(TDTRELFRC(NRELFRC)) - ALLOCATE(XTHREL(IIU,IJU,IKU,NRELFRC)) ; XTHREL=0. - ALLOCATE(XRVREL(IIU,IJU,IKU,NRELFRC)) ; XRVREL=0. -ELSE - ALLOCATE(TDTRELFRC(0)) - ALLOCATE(XTHREL(0,0,0,0)) - ALLOCATE(XRVREL(0,0,0,0)) -ENDIF -! -!* 4.11 BIS: Eddy fluxes allocation -! -IF ( LTH_FLX ) THEN - ALLOCATE(XVTH_FLUX_M(IIU,IJU,IKU)) ; XVTH_FLUX_M = 0. - ALLOCATE(XWTH_FLUX_M(IIU,IJU,IKU)) ; XWTH_FLUX_M = 0. - IF (KMI /= 1) THEN - ALLOCATE(XRTHS_EDDY_FLUX(IIU,IJU,IKU)) - XRTHS_EDDY_FLUX = 0. - ELSE - ALLOCATE(XRTHS_EDDY_FLUX(0,0,0)) - ENDIF -ELSE - ALLOCATE(XVTH_FLUX_M(0,0,0)) - ALLOCATE(XWTH_FLUX_M(0,0,0)) - ALLOCATE(XRTHS_EDDY_FLUX(0,0,0)) -END IF -! -IF ( LUV_FLX) THEN - ALLOCATE(XVU_FLUX_M(IIU,IJU,IKU)) ; XVU_FLUX_M = 0. - IF (KMI /= 1) THEN - ALLOCATE(XRVS_EDDY_FLUX(IIU,IJU,IKU)) - XRVS_EDDY_FLUX = 0. - ELSE - ALLOCATE(XRVS_EDDY_FLUX(0,0,0)) - ENDIF -ELSE - ALLOCATE(XVU_FLUX_M(0,0,0)) - ALLOCATE(XRVS_EDDY_FLUX(0,0,0)) -END IF -! -!* 3.11 Module MODD_ICE_CONC_n -! -IF ( (CCLOUD == 'ICE3'.OR.CCLOUD == 'ICE4') .AND. & - (CPROGRAM == 'DIAG '.OR.CPROGRAM == 'MESONH')) THEN - ALLOCATE(XCIT(IIU,IJU,IKU)) -ELSE - ALLOCATE(XCIT(0,0,0)) -END IF -! -IF ( CCLOUD == 'KHKO' .OR. CCLOUD == 'C2R2') THEN - ALLOCATE(XSUPSAT(IIU,IJU,IKU)) - ALLOCATE(XNACT(IIU,IJU,IKU)) - ALLOCATE(XNPRO(IIU,IJU,IKU)) - ALLOCATE(XSSPRO(IIU,IJU,IKU)) -ELSE - ALLOCATE(XSUPSAT(0,0,0)) - ALLOCATE(XNACT(0,0,0)) - ALLOCATE(XNPRO(0,0,0)) - ALLOCATE(XSSPRO(0,0,0)) -END IF -! -!* 3.12 Module MODD_TURB_CLOUD -! -IF (LCLOUDMODIFLM) THEN - ALLOCATE(XCEI(IIU,IJU,IKU)) -ELSE - ALLOCATE(XCEI(0,0,0)) -ENDIF -! -!* 3.13 Module MODD_CH_PH_n -! -IF (LUSECHAQ.AND.(CPROGRAM == 'DIAG '.OR.CPROGRAM == 'MESONH')) THEN - IF (LCH_PH) THEN - ALLOCATE(XPHC(IIU,IJU,IKU)) - IF (NRRL==2) THEN - ALLOCATE(XPHR(IIU,IJU,IKU)) - ALLOCATE(XACPHR(IIU,IJU)) - XACPHR(:,:) = 0. - ENDIF - ENDIF - IF (NRRL==2) THEN - ALLOCATE(XACPRAQ(IIU,IJU,NSV_CHAC/2)) - XACPRAQ(:,:,:) = 0. - ENDIF -ENDIF -IF (.NOT.(ASSOCIATED(XPHC))) ALLOCATE(XPHC(0,0,0)) -IF (.NOT.(ASSOCIATED(XPHR))) ALLOCATE(XPHR(0,0,0)) -IF (.NOT.(ASSOCIATED(XACPHR))) ALLOCATE(XACPHR(0,0)) -IF (.NOT.(ASSOCIATED(XACPRAQ))) ALLOCATE(XACPRAQ(0,0,0)) -IF ((LUSECHEM).AND.(CPROGRAM == 'DIAG ')) THEN - ALLOCATE(XCHFLX(IIU,IJU,NSV_CHEM)) - XCHFLX(:,:,:) = 0. -ELSE - ALLOCATE(XCHFLX(0,0,0)) -END IF -! -!* 3.14 Module MODD_DRAG -! -IF (LDRAG) THEN - ALLOCATE(XDRAG(IIU,IJU)) -ELSE - ALLOCATE(XDRAG(0,0)) -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 4. INITIALIZE BUDGET VARIABLES -! --------------------------- -! -gles = lles_mean .or. lles_resolved .or. lles_subgrid .or. lles_updraft & - .or. lles_downdraft .or. lles_spectra -!Called if budgets are enabled via NAM_BUDGET -!or if LES budgets are enabled via NAM_LES (condition on kmi==1 to call it max once) -if ( ( cbutype /= "NONE" .and. nbumod == kmi ) .or. ( ( gles .or. lcheck ) .and. kmi == 1 ) ) THEN - call Budget_preallocate() -end if -CALL TBUCONF_ASSOCIATE() -IF ( CBUTYPE /= "NONE" .AND. NBUMOD == KMI ) THEN - CALL Ini_budget(ILUOUT,XTSTEP,NSV,NRR, & - LNUMDIFU,LNUMDIFTH,LNUMDIFSV, & - LHORELAX_UVWTH,LHORELAX_RV, LHORELAX_RC,LHORELAX_RR, & - LHORELAX_RI,LHORELAX_RS,LHORELAX_RG, LHORELAX_RH,LHORELAX_TKE, & - LHORELAX_SV, LVE_RELAX, LVE_RELAX_GRD, & - LCHTRANS,LNUDGING,LDRAGTREE,LDEPOTREE,LDRAGBLDG,LMAIN_EOL, & - CRAD,CDCONV,CSCONV,CTURB,CTURBDIM,CCLOUD ) -END IF -! -!------------------------------------------------------------------------------- -! -! -!* 5. INITIALIZE INTERPOLATION COEFFICIENTS -! -CALL INI_BIKHARDT_n (NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),KMI) -! -!------------------------------------------------------------------------------- -! -!* 6. BUILT THE GENERIC OUTPUT NAME -! ---------------------------- -! -IF (KMI == 1) THEN - DO IMI = 1 , NMODEL - WRITE(IO_SURF_MNH_MODEL(IMI)%COUTFILE,'(A,".",I1,".",A)') CEXP,IMI,TRIM(ADJUSTL(CSEG)) - WRITE(YNAME, '(A,".",I1,".",A)') CEXP,IMI,TRIM(ADJUSTL(CSEG))//'.000' - CALL IO_File_add2list(LUNIT_MODEL(IMI)%TDIAFILE,YNAME,'MNHDIACHRONIC','WRITE', & - HDIRNAME=CIO_DIR, & - KLFINPRAR=INT(50,KIND=LFIINT),KLFITYPE=1,KLFIVERB=NVERB, & - TPDADFILE=LUNIT_MODEL(NDAD(IMI))%TDIAFILE ) - END DO - ! - TDIAFILE => LUNIT_MODEL(KMI)%TDIAFILE !Necessary because no call to GOTO_MODEL before needing it - ! - IF (CPROGRAM=='MESONH') THEN - IF ( NDAD(KMI) == 1) CDAD_NAME(KMI) = CEXP//'.1.'//CSEG - IF ( NDAD(KMI) == 2) CDAD_NAME(KMI) = CEXP//'.2.'//CSEG - IF ( NDAD(KMI) == 3) CDAD_NAME(KMI) = CEXP//'.3.'//CSEG - IF ( NDAD(KMI) == 4) CDAD_NAME(KMI) = CEXP//'.4.'//CSEG - IF ( NDAD(KMI) == 5) CDAD_NAME(KMI) = CEXP//'.5.'//CSEG - IF ( NDAD(KMI) == 6) CDAD_NAME(KMI) = CEXP//'.6.'//CSEG - IF ( NDAD(KMI) == 7) CDAD_NAME(KMI) = CEXP//'.7.'//CSEG - IF ( NDAD(KMI) == 8) CDAD_NAME(KMI) = CEXP//'.8.'//CSEG - END IF -END IF -! -!------------------------------------------------------------------------------- -! -!* 7. INITIALIZE GRIDS AND METRIC COEFFICIENTS -! ---------------------------------------- -! -CALL SET_GRID( KMI, TPINIFILE, IKU, NIMAX_ll, NJMAX_ll, & - XTSTEP, XSEGLEN, & - XLONORI, XLATORI, XLON, XLAT, & - XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM, & - XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, & - XHAT_BOUND, XHATM_BOUND, & - XMAP, XZS, XZZ, XZHAT, XZHATM, XZTOP, LSLEVE, & - XLEN1, XLEN2, XZSMT, ZJ, & - TDTMOD, TDTCUR, NSTOP, NBAK_NUMB, NOUT_NUMB, TBACKUPN, TOUTPUTN ) -! -CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -!* update halos of metric coefficients -! -! -CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -! -CALL SET_DIRCOS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,TZINITHALO2D_ll, & - XDIRCOSXW,XDIRCOSYW,XDIRCOSZW,XCOSSLOPE,XSINSLOPE ) -! -! grid nesting initializations -IF ( KMI == 1 ) THEN - XTSTEP_MODEL1=XTSTEP -END IF -! -NDT_2_WAY(KMI)=4 -! -!------------------------------------------------------------------------------- -! -!* 8. INITIALIZE DATA FOR JVALUES AND AEROSOLS -! -IF ( LUSECHEM .OR. LCHEMDIAG ) THEN - IF ((KMI==1).AND.(CPROGRAM == "MESONH".OR.CPROGRAM == "DIAG ")) & - CALL CH_INIT_JVALUES(TDTCUR%nday, TDTCUR%nmonth, & - TDTCUR%nyear, ILUOUT, XCH_TUV_DOBNEW) -! - IF (LORILAM) THEN - CALL CH_AER_MOD_INIT - ENDIF -END IF -IF (.NOT.(ASSOCIATED(XMI))) ALLOCATE(XMI(0,0,0,0)) -IF (.NOT.(ASSOCIATED(XSOLORG))) ALLOCATE(XSOLORG(0,0,0,0)) -! -IF (CCLOUD=='LIMA') CALL INIT_AEROSOL_PROPERTIES -! -! -! -! -!------------------------------------------------------------------------------- -! -!* 9. FIRE initializations -! -------------------- -! -IF(LBLAZE) THEN - ! - ! 9.1 Array allocation - ! ---------------- - ! - ! Level Set function - ALLOCATE(XLSPHI(IIU,IJU,NREFINX*NREFINY)); XLSPHI(:,:,:) = 0. - - ! BMap array - ! BMap default value - ! -1 = The fire is not here yet - ALLOCATE(XBMAP(IIU,IJU,NREFINX*NREFINY)); XBMAP(:,:,:) = -1. - - ! A array - ALLOCATE(XFMRFA(IIU,IJU,NREFINX*NREFINY)); XFMRFA(:,:,:) = 0. - - ! Wf0 array - ALLOCATE(XFMWF0(IIU,IJU,NREFINX*NREFINY)); XFMWF0(:,:,:) = 0. - - ! R0 array - ALLOCATE(XFMR0(IIU,IJU,NREFINX*NREFINY)); XFMR0(:,:,:) = 0. - - ! r00 array - ALLOCATE(XFMR00(IIU,IJU,NREFINX*NREFINY)); XFMR00(:,:,:) = 0. - - ! Ignition - ! Default value as 1E6 : Ignition long after simulation end time - ! 1E6 should be enough as it is more than 11 days - ALLOCATE(XFMIGNITION(IIU,IJU,NREFINX*NREFINY)); XFMIGNITION(:,:,:) = 1.E6 - - ! Fuel type - ALLOCATE(XFMFUELTYPE(IIU,IJU,NREFINX*NREFINY)); XFMFUELTYPE(:,:,:) = 0. - - ! Residence time function - ALLOCATE(XFIRETAU(IIU,IJU,NREFINX*NREFINY)); XFIRETAU(:,:,:) = 0. - - ! Rate of spread with wind - ALLOCATE(XFIRERW(IIU,IJU,NREFINX*NREFINY)); XFIRERW(:,:,:) = 0. - - ! Sensible heat flux parameters - ! get number of parameters - SELECT CASE(CHEAT_FLUX_MODEL) - CASE('CST') - ! 1 parameter for model : nominal injection value - INBPARAMSENSIBLE = 1 - - CASE('EXP') - ! 2 parameters for model : Max value and characteristic time - INBPARAMSENSIBLE = 2 - - CASE('EXS') - ! 3 parameters for model : Max value and characteristic time, smoldering injection value - INBPARAMSENSIBLE = 3 - END SELECT - - ALLOCATE(XFLUXPARAMH(IIU,IJU,NREFINX*NREFINY,INBPARAMSENSIBLE)); - XFLUXPARAMH(:,:,:,:) = 0. - - ! Latent heat flux parameters - ! get number of parameters - SELECT CASE(CLATENT_FLUX_MODEL) - CASE('CST') - ! 1 parameter for model : nominal injection value - INBPARAMLATENT = 1 - - CASE('EXP') - ! 2 parameters for model : Max value and characteristic time - INBPARAMLATENT = 2 - END SELECT - - ALLOCATE(XFLUXPARAMW(IIU,IJU,NREFINX*NREFINY,INBPARAMLATENT)); - XFLUXPARAMW(:,:,:,:) = 0. - - ! Available Sensible energy - ALLOCATE(XFMASE(IIU,IJU,NREFINX*NREFINY)); XFMASE(:,:,:) = 0. - - ! Available Latent energy - ALLOCATE(XFMAWC(IIU,IJU,NREFINX*NREFINY)); XFMAWC(:,:,:) = 0. - - ! Walking Ignition map (Arrival time matrix for ignition) - ALLOCATE(XFMWALKIG(IIU,IJU,NREFINX*NREFINY)); XFMWALKIG(:,:,:) = -1. - - ! Sensible heat flux (W/m2) - ALLOCATE(XFMFLUXHDH(IIU,IJU,NREFINX*NREFINY)); XFMFLUXHDH(:,:,:) = 0. - - ! Latent heat flux (kg/s/m2) - ALLOCATE(XFMFLUXHDW(IIU,IJU,NREFINX*NREFINY)); XFMFLUXHDW(:,:,:) = 0. - - ! filtered wind on front normal (m/s) - ALLOCATE(XFMHWS(IIU,IJU,NREFINX*NREFINY)); XFMHWS(:,:,:) = 0. - - ! filtered wind U (m/s) - ALLOCATE(XFMWINDU(IIU,IJU,NREFINX*NREFINY)); XFMWINDU(:,:,:) = 0. - - ! filtered wind V (m/s) - ALLOCATE(XFMWINDV(IIU,IJU,NREFINX*NREFINY)); XFMWINDV(:,:,:) = 0. - - ! filtered wind W (m/s) - ALLOCATE(XFMWINDW(IIU,IJU,NREFINX*NREFINY)); XFMWINDW(:,:,:) = 0. - - ! Gradient of Level Set on x - ALLOCATE(XGRADLSPHIX(IIU,IJU,NREFINX*NREFINY)); XGRADLSPHIX(:,:,:) = 0. - - ! Gradient of Level Set on y - ALLOCATE(XGRADLSPHIY(IIU,IJU,NREFINX*NREFINY)); XGRADLSPHIY(:,:,:) = 0. - - ! Wind for fire - ALLOCATE(XFIREWIND(IIU,IJU,NREFINX*NREFINY)); XFIREWIND(:,:,:) = 0. - - ! Orographic gradient on fire mesh - ALLOCATE(XFMGRADOROX(IIU,IJU,NREFINX*NREFINY)); XFMGRADOROX(:,:,:) = 0. - ALLOCATE(XFMGRADOROY(IIU,IJU,NREFINX*NREFINY)); XFMGRADOROY(:,:,:) = 0. - ! - ! 9.2 Array 2d fire mesh allocation - ! ----------------------------- - ! - ! Level Set 2d - ALLOCATE(XLSPHI2D(IIU*NREFINX,IJU*NREFINY)); XLSPHI2D(:,:) = 0. - ! Gradient of Level Set on x 2d - ALLOCATE(XGRADLSPHIX2D(IIU*NREFINX,IJU*NREFINY)); XGRADLSPHIX2D(:,:) = 0. - - ! Gradient of Level Set on y 2d - ALLOCATE(XGRADLSPHIY2D(IIU*NREFINX,IJU*NREFINY)); XGRADLSPHIY2D(:,:) = 0. - - ! Level Set mask on x 2d - ALLOCATE(XGRADMASKX(IIU*NREFINX,IJU*NREFINY)); XGRADMASKX(:,:) = 0. - - ! Level Set mask on y 2d - ALLOCATE(XGRADMASKY(IIU*NREFINX,IJU*NREFINY)); XGRADMASKY(:,:) = 0. - - ! burnt surface ratio 2d - ALLOCATE(XSURFRATIO2D(IIU*NREFINX,IJU*NREFINY)); XSURFRATIO2D(:,:) = 0. - - ! Level Set diffusuon x 2d - ALLOCATE(XLSDIFFUX2D(IIU*NREFINX,IJU*NREFINY)); XLSDIFFUX2D(:,:) = 0. - - ! Level Set diffusion y 2d - ALLOCATE(XLSDIFFUY2D(IIU*NREFINX,IJU*NREFINY)); XLSDIFFUY2D(:,:) = 0. - - ! ROS diffusion 2d - ALLOCATE(XFIRERW2D(IIU*NREFINX,IJU*NREFINY)); XFIRERW2D(:,:) = 0. - ! - ! 9.3 Compute fire mesh size - ! ---------------------- - ! - XFIREMESHSIZE(1) = (XXHAT(2) - XXHAT(1)) / REAL(NREFINX) - XFIREMESHSIZE(2) = (XYHAT(2) - XYHAT(1)) / REAL(NREFINY) - ! -ELSE - ! - ! 9.4 Default allocation - ! ------------------ - ! - ! 3d array - ALLOCATE(XLSPHI(0,0,0)) - ALLOCATE(XBMAP(0,0,0)) - ALLOCATE(XFMRFA(0,0,0)) - ALLOCATE(XFMR0(0,0,0)) - ALLOCATE(XFMWF0(0,0,0)) - ALLOCATE(XFMR00(0,0,0)) - ALLOCATE(XFMIGNITION(0,0,0)) - ALLOCATE(XFMFUELTYPE(0,0,0)) - ALLOCATE(XFIRETAU(0,0,0)) - ALLOCATE(XFIRERW(0,0,0)) - ALLOCATE(XFLUXPARAMH(0,0,0,0)) - ALLOCATE(XFLUXPARAMW(0,0,0,0)) - ALLOCATE(XFMASE(0,0,0)) - ALLOCATE(XFMAWC(0,0,0)) - ALLOCATE(XFMWALKIG(0,0,0)) - ALLOCATE(XFMFLUXHDH(0,0,0)) - ALLOCATE(XFMFLUXHDW(0,0,0)) - ALLOCATE(XFMHWS(0,0,0)) - ALLOCATE(XFMWINDU(0,0,0)) - ALLOCATE(XFMWINDV(0,0,0)) - ALLOCATE(XFMWINDW(0,0,0)) - ALLOCATE(XGRADLSPHIX(0,0,0)) - ALLOCATE(XGRADLSPHIY(0,0,0)) - ALLOCATE(XFIREWIND(0,0,0)) - ALLOCATE(XFMGRADOROX(0,0,0)) - ALLOCATE(XFMGRADOROY(0,0,0)) - ! 2d array - ALLOCATE(XLSPHI2D(0,0)) - ALLOCATE(XGRADLSPHIX2D(0,0)) - ALLOCATE(XGRADLSPHIY2D(0,0)) - ALLOCATE(XGRADMASKX(0,0)) - ALLOCATE(XGRADMASKY(0,0)) - ALLOCATE(XSURFRATIO2D(0,0)) - ALLOCATE(XLSDIFFUX2D(0,0)) - ALLOCATE(XLSDIFFUY2D(0,0)) - ALLOCATE(XFIRERW2D(0,0)) -END IF -! -! -!------------------------------------------------------------------------------- -! -!* 9. INITIALIZE THE PROGNOSTIC FIELDS -! -------------------------------- -! -CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before read_field::XUT",PRECISION) -CALL READ_FIELD(KMI,TPINIFILE,IIU,IJU,IKU, & - CGETTKET,CGETRVT,CGETRCT,CGETRRT,CGETRIT,CGETCIT,CGETZWS, & - CGETRST,CGETRGT,CGETRHT,CGETSVT,CGETSRCT,CGETSIGS,CGETCLDFR, & - CGETICEFR, CGETBL_DEPTH,CGETSBL_DEPTH,CGETPHC,CGETPHR, & - CUVW_ADV_SCHEME, CTEMP_SCHEME, & - NSIZELBX_ll, NSIZELBXU_ll, NSIZELBY_ll, NSIZELBYV_ll, & - NSIZELBXTKE_ll,NSIZELBYTKE_ll, & - NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll, & - XUM,XVM,XWM,XDUM,XDVM,XDWM, & - XUT,XVT,XWT,XTHT,XPABST,XTKET,XRTKEMS, & - XRT,XSVT,XZWS,XCIT,XDRYMASST,XDRYMASSS, & - XSIGS,XSRCT,XCLDFR,XICEFR, XBL_DEPTH,XSBL_DEPTH,XWTHVMF, & - XPHC,XPHR, XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM, & - XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM, & - XLBXRM,XLBXSVM, & - XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM, & - XLBYRM,XLBYSVM, & - NFRC,TDTFRC,XUFRC,XVFRC,XWFRC,XTHFRC,XRVFRC, & - XTENDTHFRC,XTENDRVFRC,XGXTHFRC,XGYTHFRC, & - XPGROUNDFRC, XATC, & - XTENDUFRC, XTENDVFRC, & - NADVFRC,TDTADVFRC,XDTHFRC,XDRVFRC, & - NRELFRC,TDTRELFRC,XTHREL,XRVREL, & - XVTH_FLUX_M,XWTH_FLUX_M,XVU_FLUX_M, & - XRUS_PRES,XRVS_PRES,XRWS_PRES,XRTHS_CLD,XRRS_CLD,XRSVS_CLD, & - ZIBM_LS,XIBM_XMUT,XUMEANW,XVMEANW,XWMEANW,XUMEANN,XVMEANN, & - XWMEANN,XUMEANE,XVMEANE,XWMEANE,XUMEANS,XVMEANS,XWMEANS, & - XLSPHI, XBMAP, XFMASE, XFMAWC, XFMWINDU, XFMWINDV, XFMWINDW, XFMHWS ) - -! -!------------------------------------------------------------------------------- -! -! -!* 10. INITIALIZE REFERENCE STATE -! --------------------------- -! -! -CALL SET_REF( KMI, TPINIFILE, & - XZZ, XZHATM, ZJ, XDXX, XDYY, CLBCX, CLBCY, & - XREFMASS, XMASS_O_PHI0, XLINMASS, & - XRHODREF, XTHVREF, XRVREF, XEXNREF, XRHODJ ) -! -!------------------------------------------------------------------------------- -! -!* 10.1 INITIALIZE THE TURBULENCE VARIABLES -! ----------------------------------- -! -IF(LSTATNW) THEN - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','LSTATNW option not tested in Meso-NH') -ENDIF -CALL INI_TURB(CPROGRAM) -IF ((CTURB == 'TKEL').AND.(CCONF=='START')) THEN - CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before ini_tke_eps::XUT",PRECISION) - CALL INI_TKE_EPS(CGETTKET,XTHVREF,XZZ, & - XUT,XVT,XTHT, & - XTKET,TZINITHALO3D_ll ) - CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-after ini_tke_eps::XUT",PRECISION) -END IF -! -! -!* 10.2 INITIALIZE THE LES VARIABLES -! ---------------------------- -! -CALL INI_LES_n -! -!------------------------------------------------------------------------------- -! -!* 11. INITIALIZE THE SOURCE OF TOTAL DRY MASS Md -! ------------------------------------------ -! -IF((KMI==1).AND.LSTEADYLS .AND. (CCONF=='START') ) THEN - XDRYMASSS = 0. -END IF -! -!------------------------------------------------------------------------------- -! -!* 12. INITIALIZE THE MICROPHYSICS -! ---------------------------- -! -IF (CELEC == 'NONE') THEN - CALL INI_MICRO_n(TPINIFILE,ILUOUT) -! -!------------------------------------------------------------------------------- -! -!* 13. INITIALIZE THE ATMOSPHERIC ELECTRICITY -! -------------------------------------- -! -ELSE - CALL INI_ELEC_n(ILUOUT, CELEC, CCLOUD, TPINIFILE, & - XTSTEP, XZZ, & - XDXX, XDYY, XDZZ, XDZX, XDZY ) -! - WRITE (UNIT=ILUOUT,& - FMT='(/,"ELECTRIC VARIABLES ARE BETWEEN INDEX",I2," AND ",I2)')& - NSV_ELECBEG, NSV_ELECEND -! - IF( CGETSVT(NSV_ELECBEG)=='INIT' ) THEN - XSVT(:,:,:,NSV_ELECBEG) = XCION_POS_FW(:,:,:) ! Nb/kg - XSVT(:,:,:,NSV_ELECEND) = XCION_NEG_FW(:,:,:) -! - XSVT(:,:,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 - ELSE ! Convert elec_variables per m3 into elec_variables per kg of air - DO JSV = NSV_ELECBEG, NSV_ELECEND - XSVT(:,:,:,JSV) = XSVT(:,:,:,JSV) / XRHODREF(:,:,:) - ENDDO - END IF -END IF -! -!------------------------------------------------------------------------------- -! -!* 14. INITIALIZE THE LARGE SCALE SOURCES -! ---------------------------------- -! -IF ((KMI==1).AND.(.NOT. LSTEADYLS)) THEN - CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before ini_cpl::XUT",PRECISION) - CALL INI_CPL(NSTOP,XTSTEP,LSTEADYLS,CCONF, & - CGETTKET, & - CGETRVT,CGETRCT,CGETRRT,CGETRIT, & - CGETRST,CGETRGT,CGETRHT,CGETSVT,LCH_INIT_FIELD, & - NSV,NIMAX_ll,NJMAX_ll, & - NSIZELBX_ll,NSIZELBXU_ll,NSIZELBY_ll,NSIZELBYV_ll, & - NSIZELBXTKE_ll,NSIZELBYTKE_ll, & - NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,XDRYMASST, & - XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & - XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,XLSZWSS,XDRYMASSS, & - XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS, & - XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS ) - CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-after ini_cpl::XUT",PRECISION) -! - DO JSV=NSV_CHEMBEG,NSV_CHEMEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_LNOXBEG,NSV_LNOXEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_AERBEG,NSV_AEREND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_DSTBEG,NSV_DSTEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_DSTDEPBEG,NSV_DSTDEPEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_SLTBEG,NSV_SLTEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_SLTDEPBEG,NSV_SLTDEPEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_PPBEG,NSV_PPEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! -#ifdef MNH_FOREFIRE - DO JSV=NSV_FFBEG,NSV_FFEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! -#endif -! Blaze smoke -DO JSV=NSV_FIREBEG,NSV_FIREEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) -ENDDO -! - DO JSV=NSV_CSBEG,NSV_CSEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO -! -END IF -! -IF ( KMI > 1) THEN - ! Use dummy pointers to correct an ifort BUG - DPTR_XBMX1=>XBMX1 - DPTR_XBMX2=>XBMX2 - DPTR_XBMX3=>XBMX3 - DPTR_XBMX4=>XBMX4 - DPTR_XBMY1=>XBMY1 - DPTR_XBMY2=>XBMY2 - DPTR_XBMY3=>XBMY3 - DPTR_XBMY4=>XBMY4 - DPTR_XBFX1=>XBFX1 - DPTR_XBFX2=>XBFX2 - DPTR_XBFX3=>XBFX3 - DPTR_XBFX4=>XBFX4 - DPTR_XBFY1=>XBFY1 - DPTR_XBFY2=>XBFY2 - DPTR_XBFY3=>XBFY3 - DPTR_XBFY4=>XBFY4 - DPTR_CLBCX=>CLBCX - DPTR_CLBCY=>CLBCY - ! - DPTR_XZZ=>XZZ - DPTR_XZHAT=>XZHAT - DPTR_XLSUM=>XLSUM - DPTR_XLSVM=>XLSVM - DPTR_XLSWM=>XLSWM - DPTR_XLSTHM=>XLSTHM - DPTR_XLSRVM=>XLSRVM - DPTR_XLSZWSM=>XLSZWSM - DPTR_XLSUS=>XLSUS - DPTR_XLSVS=>XLSVS - DPTR_XLSWS=>XLSWS - DPTR_XLSTHS=>XLSTHS - DPTR_XLSRVS=>XLSRVS - DPTR_XLSZWSS=>XLSZWSS - ! - DPTR_NKLIN_LBXU=>NKLIN_LBXU - DPTR_XCOEFLIN_LBXU=>XCOEFLIN_LBXU - DPTR_NKLIN_LBYU=>NKLIN_LBYU - DPTR_XCOEFLIN_LBYU=>XCOEFLIN_LBYU - DPTR_NKLIN_LBXV=>NKLIN_LBXV - DPTR_XCOEFLIN_LBXV=>XCOEFLIN_LBXV - DPTR_NKLIN_LBYV=>NKLIN_LBYV - DPTR_XCOEFLIN_LBYV=>XCOEFLIN_LBYV - DPTR_NKLIN_LBXW=>NKLIN_LBXW - DPTR_XCOEFLIN_LBXW=>XCOEFLIN_LBXW - DPTR_NKLIN_LBYW=>NKLIN_LBYW - DPTR_XCOEFLIN_LBYW=>XCOEFLIN_LBYW - DPTR_NKLIN_LBXM=>NKLIN_LBXM - DPTR_XCOEFLIN_LBXM=>XCOEFLIN_LBXM - DPTR_NKLIN_LBYM=>NKLIN_LBYM - DPTR_XCOEFLIN_LBYM=>XCOEFLIN_LBYM - ! - CALL INI_SPAWN_LS_n(NDAD(KMI),XTSTEP,KMI, & - DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4, & - DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4, & - NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI), & - DPTR_CLBCX,DPTR_CLBCY,DPTR_XZZ,DPTR_XZHAT, & - LSLEVE,XLEN1,XLEN2, & - DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM,DPTR_XLSZWSM, & - DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS,DPTR_XLSZWSS, & - DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU, & - DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV, & - DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW, & - DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM ) - ! - DPTR_XLBXUM=>XLBXUM - DPTR_XLBYUM=>XLBYUM - DPTR_XLBXVM=>XLBXVM - DPTR_XLBYVM=>XLBYVM - DPTR_XLBXWM=>XLBXWM - DPTR_XLBYWM=>XLBYWM - DPTR_XLBXTHM=>XLBXTHM - DPTR_XLBYTHM=>XLBYTHM - DPTR_XLBXTKEM=>XLBXTKEM - DPTR_XLBYTKEM=>XLBYTKEM - DPTR_XLBXRM=>XLBXRM - DPTR_XLBYRM=>XLBYRM - DPTR_XLBXSVM=>XLBXSVM - DPTR_XLBYSVM=>XLBYSVM - IF (CCONF=='START') THEN - CALL INI_ONE_WAY_n(NDAD(KMI),KMI, & - DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4, & - DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4, & - NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI), & - DPTR_CLBCX,DPTR_CLBCY,NRIMX,NRIMY, & - DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU, & - DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV, & - DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW, & - DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM, & - CCLOUD, LUSECHAQ, LUSECHIC, & - DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM,DPTR_XLBXWM,DPTR_XLBYWM, & - DPTR_XLBXTHM,DPTR_XLBYTHM, & - DPTR_XLBXTKEM,DPTR_XLBYTKEM, & - DPTR_XLBXRM,DPTR_XLBYRM,DPTR_XLBXSVM,DPTR_XLBYSVM ) - ENDIF -END IF -! -! -!------------------------------------------------------------------------------- -! -!* 15. INITIALIZE THE SCALAR VARIABLES -! ------------------------------- -! -IF (LLG .AND. LINIT_LG .AND. CPROGRAM=='MESONH') & - CALL INI_LG( XXHATM, XYHATM, XZZ, XSVT, XLBXSVM, XLBYSVM ) - -! -!------------------------------------------------------------------------------- -! -!* 16. INITIALIZE THE PARAMETERS FOR THE DYNAMICS -! ------------------------------------------ -! -CALL INI_DYNAMICS(XLON,XLAT,XRHODJ,XTHVREF,XMAP,XZZ,XDXHAT,XDYHAT, & - XZHAT,XZHATM,CLBCX,CLBCY,XTSTEP, & - LVE_RELAX,LVE_RELAX_GRD,LHORELAX_UVWTH,LHORELAX_RV, & - LHORELAX_RC,LHORELAX_RR,LHORELAX_RI,LHORELAX_RS,LHORELAX_RG, & - LHORELAX_RH,LHORELAX_TKE,LHORELAX_SV, & - LHORELAX_SVC2R2,LHORELAX_SVC1R3,LHORELAX_SVELEC,LHORELAX_SVLG, & - LHORELAX_SVCHEM,LHORELAX_SVAER,LHORELAX_SVDST,LHORELAX_SVSLT, & - LHORELAX_SVPP,LHORELAX_SVCS,LHORELAX_SVCHIC,LHORELAX_SVSNW, & -#ifdef MNH_FOREFIRE - LHORELAX_SVFF, & -#endif - XRIMKMAX,NRIMX,NRIMY, & - XALKTOP,XALKGRD,XALZBOT,XALZBAS, & - XT4DIFU,XT4DIFTH,XT4DIFSV, & - XCORIOX,XCORIOY,XCORIOZ,XCURVX,XCURVY, & - XDXHATM,XDYHATM,XRHOM,XAF,XBFY,XCF,XTRIGSX,XTRIGSY,NIFAXX,NIFAXY,& - XALK,XALKW,NALBOT,XALKBAS,XALKWBAS,NALBAS, & - LMASK_RELAX,XKURELAX,XKVRELAX,XKWRELAX, & - XDK2U,XDK4U,XDK2TH,XDK4TH,XDK2SV,XDK4SV, & - LZDIFFU,XZDIFFU_HALO2, & - XBFB,XBF_SXP2_YP1_Z ) -! -! -!* 16.1 Initialize the XDRAG array -! ------------- -IF (LDRAG) THEN - CALL INI_DRAG(LMOUNT,XZS,XHSTART,NSTART,XDRAG) -ENDIF -!* 16.2 Initialize the LevelSet function -! ------------- -IF (LIBM) THEN - ALLOCATE(XIBM_LS(IIU,IJU,IKU,4)) ; XIBM_LS = -XIBM_IEPS - XIBM_LS(:,:,:,1)=ZIBM_LS(:,:,:) - DEALLOCATE(ZIBM_LS) -ENDIF -!------------------------------------------------------------------------------- -! -!* 17. SURFACE FIELDS -! -------------- -! -!* 17.1 Radiative setup -! --------------- -! -IF (CRAD /= 'NONE') THEN - IF (CGETRAD =='INIT') THEN - GINIRAD =.TRUE. - ELSE - GINIRAD =.FALSE. - END IF - CALL INI_RADIATIONS(TPINIFILE,GINIRAD,TDTCUR,TDTEXP,XZZ, & - XDXX, XDYY, & - XSINDEL,XCOSDEL,XTSIDER,XCORSOL, & - XSLOPANG,XSLOPAZI, & - XDTHRAD,XDIRFLASWD,XSCAFLASWD, & - XFLALWD,XDIRSRFSWD,NCLEARCOL_TM1, & - XZENITH,XAZIM, & - TDTRAD_FULL,TDTRAD_CLONLY, & - TZINITHALO2D_ll, & - XRADEFF,XSWU,XSWD,XLWU, & - XLWD,XDTHRADSW,XDTHRADLW ) - ! - IF (GINIRAD) CALL SUNPOS_n(XZENITH,PAZIMSOL=XAZIM) - CALL SURF_SOLAR_GEOM (XZS, XZS_XY) - ! - ALLOCATE(XZS_ll (IIU_ll,IJU_ll)) - ALLOCATE(XZS_XY_ll (IIU_ll,IJU_ll)) - ! - CALL GATHERALL_FIELD_ll('XY',XZS,XZS_ll,IRESP) - CALL GATHERALL_FIELD_ll('XY',XZS_XY,XZS_XY_ll,IRESP) - XZS_MAX_ll=MAXVAL(XZS_ll) -ELSE - XAZIM = XPI - XZENITH = XPI/2. - XDIRSRFSWD = 0. - XSCAFLASWD = 0. - XFLALWD = 300. ! W/m2 - XTSIDER = 0. -END IF -! -! -CALL INI_SW_SETUP (CRAD,NSWB_MNH,XSW_BANDS) -CALL INI_LW_SETUP (CRAD,NLWB_MNH,XLW_BANDS) -! -! -! 17.1.1 Special initialisation for CO2 content -! CO2 (molar mass=44) horizontally and vertically homogeneous at 360 ppm -! -XCCO2 = 360.0E-06 * 44.0E-03 / XMD -#ifdef MNH_ECRAD -RCCO2 = 360.0E-06 * 44.0E-03 / XMD -#endif -! -! -!* 17.2 Externalized surface fields -! --------------------------- -! -ALLOCATE(ZCO2(IIU,IJU)) -ZCO2(:,:) = XCCO2 -! - -ALLOCATE(ZDIR_ALB(IIU,IJU,NSWB_MNH)) -ALLOCATE(ZSCA_ALB(IIU,IJU,NSWB_MNH)) -ALLOCATE(ZEMIS (IIU,IJU,NLWB_MNH)) -ALLOCATE(ZTSRAD (IIU,IJU)) -! -IF (LCOUPLES.AND.(KMI>1))THEN - CSURF ="NONE" -ELSE - IF ((TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)>=6) .OR. TPINIFILE%NMNHVERSION(1)>4) THEN - CALL IO_Field_read(TPINIFILE,'SURF',CSURF) - ELSE - CSURF = "EXTE" - END IF -END IF -! -! -IF (CSURF=='EXTE' .AND. (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG ')) THEN - ! ouverture du fichier PGD - IF ( LEN_TRIM(CINIFILEPGD) > 0 ) THEN - CALL IO_File_add2list(TINIFILEPGD,TRIM(CINIFILEPGD),'PGD','READ',KLFITYPE=2,KLFIVERB=NVERB) - CALL IO_File_open(TINIFILEPGD,KRESP=IRESP) - LUNIT_MODEL(KMI)%TINIFILEPGD => TINIFILEPGD - IF (IRESP/=0) THEN - WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR TO OPEN THE FILE CINIFILEPGD=",CINIFILEPGD - WRITE(ILUOUT,FMT=*) "CHECK YOUR NAMELIST NAM_LUNITn" - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','') - ENDIF - ELSE - ! case after a spawning - CINIFILEPGD = TPINIFILE%CNAME - END IF - ! - CALL GOTO_SURFEX(KMI) -#ifdef CPLOASIS - CALL SFX_OASIS_READ_NAM(CPROGRAM,XTSTEP) - WRITE(*,*) 'SFX-OASIS: READ NAM_SFX_SEA_CPL OK' -#endif - !* initialization of surface - CALL INIT_GROUND_PARAM_n ('ALL',SIZE(CSV),CSV,ZCO2, & - XZENITH,XAZIM,XSW_BANDS,XLW_BANDS,ZDIR_ALB,ZSCA_ALB, & - ZEMIS,ZTSRAD ) - ! - IF (SIZE(XEMIS)>0) THEN - XDIR_ALB = ZDIR_ALB - XSCA_ALB = ZSCA_ALB - XEMIS = ZEMIS - XTSRAD = ZTSRAD - CALL MNHGET_SURF_PARAM_n (PSEA=XSEA) - END IF -ELSE - !* fields not physically necessary, but must be initialized - IF (SIZE(XEMIS)>0) THEN - XDIR_ALB = 0. - XSCA_ALB = 0. - XEMIS = 1. - XTSRAD = XTT - XSEA = 1. - END IF -END IF -IF (CSURF=='EXTE' .AND. (CPROGRAM=='SPAWN ')) THEN - ! ouverture du fichier PGD - CALL IO_File_add2list(TINIFILEPGD,TRIM(CINIFILEPGD),'PGD','READ',KLFITYPE=2,KLFIVERB=NVERB) - CALL IO_File_open(TINIFILEPGD,KRESP=IRESP) - LUNIT_MODEL(KMI)%TINIFILEPGD => TINIFILEPGD - IF (IRESP/=0) THEN - WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR TO OPEN THE FILE CINIFILEPGD=",CINIFILEPGD - WRITE(ILUOUT,FMT=*) "CHECK YOUR NAMELIST NAM_LUNIT2_SPA" - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','') - ENDIF -ENDIF -! -IF (.NOT.ASSOCIATED(TINIFILEPGD)) TINIFILEPGD => TFILE_DUMMY -! - !* special case after spawning in prep_real_case -IF (CSURF=='EXRM' .AND. CPROGRAM=='REAL ') CSURF = 'EXTE' -! -DEALLOCATE(ZDIR_ALB) -DEALLOCATE(ZSCA_ALB) -DEALLOCATE(ZEMIS ) -DEALLOCATE(ZTSRAD ) -! -DEALLOCATE(ZCO2) -! -! -!* in a RESTART case, reads surface radiative quantities in the MESONH file -! -IF ((CRAD == 'ECMW' .OR. CRAD == 'ECRA') .AND. CGETRAD=='READ') THEN - CALL INI_SURF_RAD(TPINIFILE, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD) -END IF -! -! -!* 17.3 Mesonh fields -! ------------- -! -IF (CPROGRAM/='REAL ') CALL MNHREAD_ZS_DUMMY_n(TINIFILEPGD) -! -!------------------------------------------------------------------------------- -! -!* 18. INITIALIZE THE PARAMETERS FOR THE PHYSICS -! ----------------------------------------- -! -IF (CRAD == 'ECMW') THEN -! -!* get cover mask for aerosols -! - IF (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG ') THEN -! - IF ( CAOP=='EXPL' .AND. LDUST .AND. KMI==1) THEN - ALLOCATE( XEXT_COEFF_WVL_LKT_DUST( NMAX_RADIUS_LKT_DUST, NMAX_SIGMA_LKT_DUST, NMAX_WVL_SW_DUST ) ) - ALLOCATE( XEXT_COEFF_550_LKT_DUST( NMAX_RADIUS_LKT_DUST, NMAX_SIGMA_LKT_DUST ) ) - ALLOCATE( XPIZA_LKT_DUST ( NMAX_RADIUS_LKT_DUST, NMAX_SIGMA_LKT_DUST, NMAX_WVL_SW_DUST ) ) - ALLOCATE( XCGA_LKT_DUST ( NMAX_RADIUS_LKT_DUST, NMAX_SIGMA_LKT_DUST, NMAX_WVL_SW_DUST ) ) - END IF -! - IF ( CAOP=='EXPL' .AND. LSALT .AND. KMI==1) THEN - ALLOCATE( XEXT_COEFF_WVL_LKT_SALT( NMAX_RADIUS_LKT_SALT, NMAX_SIGMA_LKT_SALT, NMAX_WVL_SW_SALT ) ) - ALLOCATE( XEXT_COEFF_550_LKT_SALT( NMAX_RADIUS_LKT_SALT, NMAX_SIGMA_LKT_SALT ) ) - ALLOCATE( XPIZA_LKT_SALT ( NMAX_RADIUS_LKT_SALT, NMAX_SIGMA_LKT_SALT, NMAX_WVL_SW_SALT ) ) - ALLOCATE( XCGA_LKT_SALT ( NMAX_RADIUS_LKT_SALT, NMAX_SIGMA_LKT_SALT, NMAX_WVL_SW_SALT ) ) - END IF -! - CALL INI_RADIATIONS_ECMWF (XZHAT,XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP, & - CLW,NDLON,NFLEV,NFLUX,NRAD,NSWB_OLD,CAER,NAER,NSTATM, & - XSTATM, XOZON, XAER,XDST_WL, LSUBG_COND ) -! - ALLOCATE (XAER_CLIM(SIZE(XAER,1),SIZE(XAER,2),SIZE(XAER,3),SIZE(XAER,4))) - XAER_CLIM(:,:,:,:) =XAER(:,:,:,:) -! - END IF - -ELSE IF (CRAD == 'ECRA') THEN -#ifdef MNH_ECRAD -!* get cover mask for aerosols -! - IF (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG ') THEN -! - CALL INI_RADIATIONS_ECRAD (XZHAT,XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP, & - CLW,NDLON,NFLEV,NFLUX,NRAD,NSWB_OLD,CAER,NAER,NSTATM, & - XSTATM, XOZON, XAER,XDST_WL, LSUBG_COND ) - - ALLOCATE (XAER_CLIM(SIZE(XAER,1),SIZE(XAER,2),SIZE(XAER,3),SIZE(XAER,4))) - XAER_CLIM(:,:,:,:) = XAER(:,:,:,:) -! - END IF -#endif -ELSE - ALLOCATE (XOZON(0,0,0)) - ALLOCATE (XAER(0,0,0,0)) - ALLOCATE (XDST_WL(0,0,0,0)) - ALLOCATE (XAER_CLIM(0,0,0,0)) -END IF -! -! -! -IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN - IF (CGETCONV=='INIT') THEN - GINIDCONV=.TRUE. - ELSE - GINIDCONV=.FALSE. - END IF -! -! commensurability between convection calling time and time step -! - XDTCONV=XTSTEP*REAL( INT( (MIN(XDTCONV,1800.)+1.E-10)/XTSTEP ) ) - XDTCONV=MAX( XDTCONV, XTSTEP ) - IF (NVERB>=10) THEN - WRITE(ILUOUT,*) 'XDTCONV has been set to : ',XDTCONV - END IF - CALL INI_DEEP_CONVECTION (TPINIFILE,GINIDCONV,TDTCUR, & - NCOUNTCONV,XDTHCONV,XDRVCONV,XDRCCONV, & - XDRICONV,XPRCONV,XPRSCONV,XPACCONV, & - XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV,& - XCAPE,NCLTOPCONV,NCLBASCONV, & - TDTDCONV, CGETSVCONV, XDSVCONV, & - LCH_CONV_LINOX, XIC_RATE, XCG_RATE, & - XIC_TOTAL_NUMBER, XCG_TOTAL_NUMBER ) - -END IF -! -! -! -IF (CSCONV == 'EDKF') THEN - CALL INI_MFSHALL() -ENDIF -! -!------------------------------------------------------------------------------- -! -! -!* 19. ALLOCATION OF THE TEMPORAL SERIES -! --------------------------------- -! -IF (LSERIES .AND. CPROGRAM/='DIAG ') CALL INI_SERIES_n -! -!------------------------------------------------------------------------------- -! -! -!* 20. (re)initialize scalar variables -! ------------------------------- -! -! -IF ( LUSECHEM .OR. LCHEMDIAG ) THEN - IF (CPROGRAM=='MESONH'.AND.CCONF=='RESTA') LCH_INIT_FIELD =.FALSE. - IF (CPROGRAM=='MESONH'.OR. CPROGRAM=='DIAG ' .OR. CPROGRAM=='IDEAL ') & - CALL CH_INIT_FIELD_n(KMI, ILUOUT, NVERB) -END IF -! -!------------------------------------------------------------------------------- -! -!* 21. UPDATE HALO -! ----------- -! -! -CALL UPDATE_HALO_ll(TZINITHALO3D_ll,IINFO_ll) -CALL UPDATE_HALO_ll(TZINITHALO2D_ll,IINFO_ll) -CALL CLEANLIST_ll(TZINITHALO3D_ll) -CALL CLEANLIST_ll(TZINITHALO2D_ll) -! -! -!------------------------------------------------------------------------------- -! -!* 22. DEALLOCATION -! ------------- -! -DEALLOCATE(ZJ) -! -DEALLOCATE(XSTROATM) -DEALLOCATE(XSMLSATM) -DEALLOCATE(XSMLWATM) -DEALLOCATE(XSPOSATM) -DEALLOCATE(XSPOWATM) -! -!------------------------------------------------------------------------------- -! -!* 23. BALLOON and AIRCRAFT initializations -! ------------------------------------ -! -CALL INI_AIRCRAFT_BALLOON( TPINIFILE, XLATORI, XLONORI ) -! -!------------------------------------------------------------------------------- -! -!* 24. STATION initializations -! ----------------------- -! -CALL INI_SURFSTATION_n( ) -! -!------------------------------------------------------------------------------- -! -!* 25. PROFILER initializations -! ------------------------ -! -CALL INI_POSPROFILER_n( ) -! -!------------------------------------------------------------------------------- -! -!* 26. Prognostic aerosols -! ------------------------ -! -IF ( ( CRAD=='ECMW' .OR. CRAD=='ECRA' ) .AND. CAOP=='EXPL' .AND. LORILAM ) THEN - IF(.NOT.ALLOCATED(POLYTAU)) ALLOCATE(POLYTAU(6,10,8,6,13)) - IF(.NOT.ALLOCATED(POLYSSA)) ALLOCATE(POLYSSA(6,10,8,6,13)) - IF(.NOT.ALLOCATED(POLYG)) ALLOCATE(POLYG (6,10,8,6,13)) - CALL INI_AEROSET1 - CALL INI_AEROSET2 - CALL INI_AEROSET3 - CALL INI_AEROSET4 - CALL INI_AEROSET5 - CALL INI_AEROSET6 -END IF -#ifdef MNH_FOREFIRE -! -!------------------------------------------------------------------------------- -! -!* 27. FOREFIRE initializations -! ------------------------ -! - -! Coupling with ForeFire if resolution is low enough -!--------------------------------------------------- -IF ( LFOREFIRE .AND. 0.5*(XXHAT(2)-XXHAT(1)+XYHAT(2)-XYHAT(1)) < COUPLINGRES ) THEN - FFCOUPLING = .TRUE. -ELSE - FFCOUPLING = .FALSE. -ENDIF - -! Initializing the ForeFire variables -!------------------------------------ -IF ( LFOREFIRE ) THEN - CALL INIT_FOREFIRE_n(KMI, ILUOUT, IP & - , TDTCUR%nyear, TDTCUR%nmonth, TDTCUR%nday, TDTCUR%xtime, XTSTEP) -END IF -#endif - -!------------------------------------------------------------------------------- -! -!* 30. Total production/Loss for chemical species -! -IF (LCHEMDIAG) THEN - CALL CH_INIT_PRODLOSSTOT_n(ILUOUT) - IF (NEQ_PLT>0) THEN - ALLOCATE(XPROD(IIU,IJU,IKU,NEQ_PLT)) - ALLOCATE(XLOSS(IIU,IJU,IKU,NEQ_PLT)) - XPROD=0.0 - XLOSS=0.0 - ELSE - ALLOCATE(XPROD(0,0,0,0)) - ALLOCATE(XLOSS(0,0,0,0)) - END IF -ELSE - ALLOCATE(XPROD(0,0,0,0)) - ALLOCATE(XLOSS(0,0,0,0)) -END IF -! -!------------------------------------------------------------------------------- -! -!* 31. Extended production/loss terms for chemical species -! -IF (LCHEMDIAG) THEN - CALL CH_INIT_BUDGET_n(ILUOUT) - IF (NEQ_BUDGET>0) THEN - ALLOCATE(IINDEX(2,NNONZEROTERMS)) - ALLOCATE(IIND(NEQ_BUDGET)) - CALL CH_NONZEROTERMS(KMI,IINDEX,NNONZEROTERMS) - ALLOCATE(XTCHEM(NEQ_BUDGET)) - DO JM=1,NEQ_BUDGET - IIND(JM)=COUNT((IINDEX(1,:))==NSPEC_BUDGET(JM)) - ALLOCATE(XTCHEM(JM)%NB_REAC(IIND(JM))) - ALLOCATE(XTCHEM(JM)%XB_REAC(IIU,IJU,IKU,IIND(JM))) - END DO - DEALLOCATE(IIND) - DEALLOCATE(IINDEX) - ELSE - ALLOCATE(XTCHEM(0)) - END IF -ELSE - ALLOCATE(XTCHEM(0)) -END IF -!------------------------------------------------------------------------------- -! -!* 32. Wind turbine -! -IF (LMAIN_EOL .AND. KMI == NMODEL_EOL) THEN - ALLOCATE(XFX_RG(IIU,IJU,IKU)) - ALLOCATE(XFY_RG(IIU,IJU,IKU)) - ALLOCATE(XFZ_RG(IIU,IJU,IKU)) - ALLOCATE(XFX_SMR_RG(IIU,IJU,IKU)) - ALLOCATE(XFY_SMR_RG(IIU,IJU,IKU)) - ALLOCATE(XFZ_SMR_RG(IIU,IJU,IKU)) - SELECT CASE(CMETH_EOL) - CASE('ADNR') - CALL INI_EOL_ADNR - CASE('ALM') - CALL INI_EOL_ALM(XDXX,XDYY) - END SELECT -END IF -! -!* 33. Auto-coupling Atmos-Ocean LES NH -! -IF (LCOUPLES) THEN - ALLOCATE(XSSUFL_C(IIU,IJU,1)); XSSUFL_C=0.0 - ALLOCATE(XSSVFL_C(IIU,IJU,1)); XSSVFL_C=0.0 - ALLOCATE(XSSTFL_C(IIU,IJU,1)); XSSTFL_C=0.0 - ALLOCATE(XSSRFL_C(IIU,IJU,1)); XSSRFL_C=0. -ELSE - ALLOCATE(XSSUFL_C(0,0,0)) - ALLOCATE(XSSVFL_C(0,0,0)) - ALLOCATE(XSSTFL_C(0,0,0)) - ALLOCATE(XSSRFL_C(0,0,0)) -END IF -! -END SUBROUTINE INI_MODEL_n diff --git a/src/PHYEX/ext/ini_nsv.f90 b/src/PHYEX/ext/ini_nsv.f90 deleted file mode 100644 index 0d7358737..000000000 --- a/src/PHYEX/ext/ini_nsv.f90 +++ /dev/null @@ -1,1237 +0,0 @@ -!MNH_LIC Copyright 2001-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ################### - MODULE MODI_INI_NSV -! ################### -INTERFACE -! - SUBROUTINE INI_NSV(KMI) - INTEGER, INTENT(IN) :: KMI ! model index - END SUBROUTINE INI_NSV -! -END INTERFACE -! -END MODULE MODI_INI_NSV -! -! -! ########################### - SUBROUTINE INI_NSV(KMI) -! ########################### -! -!!**** *INI_NSV* - compute NSV_* values and indices for model KMI -!! -!! PURPOSE -!! ------- -! -! -! -!!** METHOD -!! ------ -!! -!! This routine is called from any routine which stores values in -!! the first model module (for example READ_EXSEG). -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_NSV : contains NSV_A array variable -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! D. Gazen * LA * -!! -!! MODIFICATIONS -!! ------------- -!! Original 01/02/01 -!! Modification 29/11/02 (Pinty) add SV for C3R5 and ELEC -!! Modification 01/2004 (Masson) add scalar names -!! Modification 03/2006 (O.Geoffroy) add KHKO scheme -!! Modification 04/2007 (Leriche) add SV for aqueous chemistry -!! M. Chong 26/01/10 Add Small ions -!! Modification 07/2010 (Leriche) add SV for ice chemistry -!! X.Pialat & J.Escobar 11/2012 remove deprecated line NSV_A(KMI) = ISV -!! Modification 15/02/12 (Pialat/Tulet) Add SV for ForeFire scalars -!! 03/2013 (C.Lac) add supersaturation as -!! the 4th C2R2 scalar variable -!! J.escobar 04/08/2015 suit Pb with writ_lfin JSA increment , modif in ini_nsv to have good order initialization -!! Modification 01/2016 (JP Pinty) Add LIMA and LUSECHEM condition -!! Modification 07/2017 (V. Vionnet) Add blowing snow condition -! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv -! P. Wautelet 10/03/2021: move scalar variable name initializations to ini_nsv -! P. Wautelet 30/03/2021: move NINDICE_CCN_IMM and NIMM initializations from init_aerosol_properties to ini_nsv -! B. Vie 06/2021: add prognostic supersaturation for LIMA -! P. Wautelet 26/11/2021: initialize TSVLIST_A -! A. Costes 12/2021: smoke tracer for fire model -! P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables -! + NSV_CHEM_LIST(_A) the size of the list -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_BLOWSNOW, ONLY: CSNOWNAMES, LBLOWSNOW, NBLOWSNOW3D, YPSNOW_INI -USE MODD_CH_AEROSOL -! USE MODD_CH_AEROSOL, ONLY: CAERONAMES, CDEAERNAMES, JPMODE, LAERINIT, LDEPOS_AER, LORILAM, & -! LVARSIGI, LVARSIGJ, NCARB, NM6_AER, NSOA, NSP -USE MODD_CH_M9_n, ONLY: CICNAMES, CNAMES, NEQ, NEQAQ -USE MODD_CH_MNHC_n, ONLY: LCH_PH, LUSECHEM, LUSECHAQ, LUSECHIC, CCH_SCHEME, LCH_CONV_LINOX -USE MODD_CONDSAMP, ONLY: LCONDSAMP, NCONDSAMP -USE MODD_CONF, ONLY: LLG, CPROGRAM, NVERB -USE MODD_CST, ONLY: XMNH_TINY -USE MODD_DIAG_FLAG, ONLY: LCHEMDIAG, LCHAQDIAG -USE MODD_DUST, ONLY: CDEDSTNAMES, CDUSTNAMES, JPDUSTORDER, LDEPOS_DST, LDSTINIT, LDSTPRES, LDUST, & - LRGFIX_DST, LVARSIG, NMODE_DST, YPDEDST_INI, YPDUST_INI -USE MODD_DYN_n, ONLY: LHORELAX_SV,LHORELAX_SVC2R2,LHORELAX_SVC1R3, & - LHORELAX_SVFIRE, LHORELAX_SVLIMA, & - LHORELAX_SVELEC,LHORELAX_SVCHEM,LHORELAX_SVLG, & - LHORELAX_SVDST,LHORELAX_SVAER, LHORELAX_SVSLT, & - LHORELAX_SVPP,LHORELAX_SVCS, LHORELAX_SVCHIC, & - LHORELAX_SVSNW -#ifdef MNH_FOREFIRE -USE MODD_DYN_n, ONLY: LHORELAX_SVFF -#endif -USE MODD_ELEC_DESCR, ONLY: LLNOX_EXPLICIT -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL -USE MODD_FIRE_n -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE -#endif -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES -USE MODD_LG, ONLY: CLGNAMES, XLG1MIN, XLG2MIN, XLG3MIN -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_NSV -USE MODD_PARAM_C2R2, ONLY: LSUPSAT -USE MODD_PARAMETERS, ONLY: NCOMMENTLGTMAX, NLONGNAMELGTMAX, NUNITLGTMAX -USE MODD_PARAM_LIMA, ONLY: NINDICE_CCN_IMM, NIMM, NMOD_CCN, NMOD_IFN, NMOD_IMM, PARAM_LIMA_ALLOCATE, PARAM_LIMA_DEALLOCATE -USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES -USE MODD_PARAM_LIMA_WARM, ONLY: CAERO_MASS, CLIMA_WARM_NAMES -USE MODD_PARAM_n, ONLY: CCLOUD, CELEC -USE MODD_PASPOL, ONLY: LPASPOL, NRELEASE -USE MODD_PREP_REAL, ONLY: XT_LS -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_SALT, ONLY: CSALTNAMES, CDESLTNAMES, JPSALTORDER, & - LRGFIX_SLT, LSALT, LSLTINIT, LSLTPRES, LDEPOS_SLT, LVARSIG_SLT, NMODE_SLT, YPDESLT_INI, YPSALT_INI - -USE MODE_MSG -USE MODE_LIMA_UPDATE_NSV, ONLY: LIMA_UPDATE_NSV - -USE MODI_CH_AER_INIT_SOA, ONLY: CH_AER_INIT_SOA -USE MODI_CH_INIT_SCHEME_n, ONLY: CH_INIT_SCHEME_n -USE MODI_UPDATE_NSV, ONLY: UPDATE_NSV -! -IMPLICIT NONE -! -!------------------------------------------------------------------------------- -! -!* 0.1 Declarations of arguments -! -INTEGER, INTENT(IN) :: KMI ! model index -! -!* 0.2 Declarations of local variables -! -CHARACTER(LEN=2) :: YNUM2 -CHARACTER(LEN=3) :: YNUM3 -CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT -CHARACTER(LEN=NUNITLGTMAX) :: YUNITS -CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YAEROLONGNAMES -CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YDUSTLONGNAMES -CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YSALTLONGNAMES -INTEGER :: ILUOUT -INTEGER :: ICHIDX ! Index for position in CSV_CHEM_LIST_A array -INTEGER :: ISV ! total number of scalar variables -INTEGER :: IMODEIDX -INTEGER :: JAER -INTEGER :: JI, JJ, JSV -INTEGER :: JMODE, JMOM, JSV_NAME -INTEGER :: INMOMENTS_DST, INMOMENTS_SLT !Number of moments for dust or salt -! -!------------------------------------------------------------------------------- -! - -!Associate the pointers -CALL NSV_ASSOCIATE -! -LINI_NSV(KMI) = .TRUE. - -ILUOUT = TLUOUT%NLU - -ICHIDX = 0 -NSV_CHEM_LIST_A(KMI) = 0 -! -! Users scalar variables are first considered -! -NSV_USER_A(KMI) = NSV_USER -ISV = NSV_USER -! -! scalar variables used in microphysical schemes C2R2,KHKO and C3R5 -! -IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' ) THEN - IF ((CCLOUD == 'C2R2' .AND. LSUPSAT) .OR. (CCLOUD == 'KHKO'.AND. LSUPSAT)) THEN - ! 4th scalar field = supersaturation - NSV_C2R2_A(KMI) = 4 - ELSE - NSV_C2R2_A(KMI) = 3 - END IF - NSV_C2R2BEG_A(KMI) = ISV+1 - NSV_C2R2END_A(KMI) = ISV+NSV_C2R2_A(KMI) - ISV = NSV_C2R2END_A(KMI) - IF (CCLOUD == 'C3R5') THEN ! the SVs for C2R2 and C1R3 must be contiguous - NSV_C1R3_A(KMI) = 2 - NSV_C1R3BEG_A(KMI) = ISV+1 - NSV_C1R3END_A(KMI) = ISV+NSV_C1R3_A(KMI) - ISV = NSV_C1R3END_A(KMI) - ELSE - NSV_C1R3_A(KMI) = 0 - ! force First index to be superior to last index - ! in order to create a null section - NSV_C1R3BEG_A(KMI) = 1 - NSV_C1R3END_A(KMI) = 0 - END IF -ELSE - NSV_C2R2_A(KMI) = 0 - NSV_C1R3_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_C2R2BEG_A(KMI) = 1 - NSV_C2R2END_A(KMI) = 0 - NSV_C1R3BEG_A(KMI) = 1 - NSV_C1R3END_A(KMI) = 0 -END IF -! -! scalar variables used in the LIMA microphysical scheme -! -CALL LIMA_UPDATE_NSV(LDINIT=.TRUE., KMI=KMI, KSV=ISV, CDCLOUD=CCLOUD, LDUPDATE=.FALSE.) -IF (CCLOUD == 'LIMA' ) THEN - - IF ( NMOD_IFN > 0 ) THEN - IF ( .NOT. ASSOCIATED( NIMM ) ) CALL PARAM_LIMA_ALLOCATE('NIMM', NMOD_CCN) - NIMM(:) = 0 - IF ( ASSOCIATED( NINDICE_CCN_IMM ) ) CALL PARAM_LIMA_DEALLOCATE('NINDICE_CCN_IMM') - CALL PARAM_LIMA_ALLOCATE('NINDICE_CCN_IMM', MAX( 1, NMOD_IMM )) - IF (NMOD_IMM > 0 ) THEN - DO JI = 0, NMOD_IMM - 1 - NIMM(NMOD_CCN - JI) = 1 - NINDICE_CCN_IMM(NMOD_IMM - JI) = NMOD_CCN - JI - END DO -! ELSE IF (NMOD_IMM == 0) THEN ! PNIS exists but is 0 for the call to resolved_cloud -! NMOD_IMM = 1 -! NINDICE_CCN_IMM(1) = 0 - END IF - END IF -END IF ! CCLOUD = LIMA -! -! -! Add one scalar for negative ion -! First variable: positive ion (NSV_ELECBEG_A index number) -! Last --------: negative ion (NSV_ELECEND_A index number) -! Correspondence for ICE3: -! Relative index 1 2 3 4 5 6 7 -! Charge for ion+ cloud rain ice snow graupel ion- -! -! Correspondence for ICE4: -! Relative index 1 2 3 4 5 6 7 8 -! Charge for ion+ cloud rain ice snow graupel hail ion- -! -IF (CELEC /= 'NONE') THEN - IF (CCLOUD == 'ICE3') THEN - NSV_ELEC_A(KMI) = 7 - NSV_ELECBEG_A(KMI)= ISV+1 - NSV_ELECEND_A(KMI)= ISV+NSV_ELEC_A(KMI) - ISV = NSV_ELECEND_A(KMI) - CELECNAMES(7) = CELECNAMES(8) - ELSE IF (CCLOUD == 'ICE4') THEN - NSV_ELEC_A(KMI) = 8 - NSV_ELECBEG_A(KMI)= ISV+1 - NSV_ELECEND_A(KMI)= ISV+NSV_ELEC_A(KMI) - ISV = NSV_ELECEND_A(KMI) - END IF -ELSE - NSV_ELEC_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_ELECBEG_A(KMI) = 1 - NSV_ELECEND_A(KMI) = 0 -END IF -! -! scalar variables used as lagragian variables -! -IF (LLG) THEN - NSV_LG_A(KMI) = 3 - NSV_LGBEG_A(KMI) = ISV+1 - NSV_LGEND_A(KMI) = ISV+NSV_LG_A(KMI) - ISV = NSV_LGEND_A(KMI) -ELSE - NSV_LG_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_LGBEG_A(KMI) = 1 - NSV_LGEND_A(KMI) = 0 -END IF -! -! scalar variables used as LiNOX passive tracer -! -! In case without chemistry -IF (LPASPOL) THEN - NSV_PP_A(KMI) = NRELEASE - NSV_PPBEG_A(KMI)= ISV+1 - NSV_PPEND_A(KMI)= ISV+NSV_PP_A(KMI) - ISV = NSV_PPEND_A(KMI) -ELSE - NSV_PP_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_PPBEG_A(KMI)= 1 - NSV_PPEND_A(KMI)= 0 -END IF -! -#ifdef MNH_FOREFIRE -! ForeFire tracers -IF (LFOREFIRE .AND. NFFSCALARS .GT. 0) THEN - NSV_FF_A(KMI) = NFFSCALARS - NSV_FFBEG_A(KMI) = ISV+1 - NSV_FFEND_A(KMI) = ISV+NSV_FF_A(KMI) - ISV = NSV_FFEND_A(KMI) -ELSE - NSV_FF_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_FFBEG_A(KMI)= 1 - NSV_FFEND_A(KMI)= 0 -END IF -#endif -! Blaze tracers -IF (LBLAZE .AND. NNBSMOKETRACER .GT. 0) THEN - NSV_FIRE_A(KMI) = NNBSMOKETRACER - NSV_FIREBEG_A(KMI) = ISV+1 - NSV_FIREEND_A(KMI) = ISV+NSV_FIRE_A(KMI) - ISV = NSV_FIREEND_A(KMI) -ELSE - NSV_FIRE_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_FIREBEG_A(KMI)= 1 - NSV_FIREEND_A(KMI)= 0 -END IF -! -! Conditional sampling variables -IF (LCONDSAMP) THEN - NSV_CS_A(KMI) = NCONDSAMP - NSV_CSBEG_A(KMI)= ISV+1 - NSV_CSEND_A(KMI)= ISV+NSV_CS_A(KMI) - ISV = NSV_CSEND_A(KMI) -ELSE - NSV_CS_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_CSBEG_A(KMI)= 1 - NSV_CSEND_A(KMI)= 0 -END IF -! -! scalar variables used in chemical core system -! -IF (LUSECHEM) THEN - CALL CH_INIT_SCHEME_n(KMI,LUSECHAQ,LUSECHIC,LCH_PH,ILUOUT,NVERB) - IF (LORILAM) CALL CH_AER_INIT_SOA(ILUOUT, NVERB) -END IF - -IF (LUSECHEM .AND.(NEQ .GT. 0)) THEN - NSV_CHEM_A(KMI) = NEQ - NSV_CHEMBEG_A(KMI)= ISV+1 - NSV_CHEMEND_A(KMI)= ISV+NSV_CHEM_A(KMI) - ISV = NSV_CHEMEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_CHEM_A(KMI) -ELSE - NSV_CHEM_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_CHEMBEG_A(KMI)= 1 - NSV_CHEMEND_A(KMI)= 0 -END IF -! -! aqueous chemistry (part of the "chem" variables) -! -IF ((LUSECHAQ .OR. LCHAQDIAG).AND.(NEQ .GT. 0)) THEN - NSV_CHGS_A(KMI) = NEQ-NEQAQ - NSV_CHGSBEG_A(KMI)= NSV_CHEMBEG_A(KMI) - NSV_CHGSEND_A(KMI)= NSV_CHEMBEG_A(KMI)+(NEQ-NEQAQ)-1 - NSV_CHAC_A(KMI) = NEQAQ - NSV_CHACBEG_A(KMI)= NSV_CHGSEND_A(KMI)+1 - NSV_CHACEND_A(KMI)= NSV_CHEMEND_A(KMI) -! ice phase chemistry - IF (LUSECHIC) THEN - NSV_CHIC_A(KMI) = NEQAQ/2. -1. - NSV_CHICBEG_A(KMI)= ISV+1 - NSV_CHICEND_A(KMI)= ISV+NSV_CHIC_A(KMI) - ISV = NSV_CHICEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_CHIC_A(KMI) - ELSE - NSV_CHIC_A(KMI) = 0 - NSV_CHICBEG_A(KMI)= 1 - NSV_CHICEND_A(KMI)= 0 - ENDIF -ELSE - IF (NEQ .GT. 0) THEN - NSV_CHGS_A(KMI) = NEQ-NEQAQ - NSV_CHGSBEG_A(KMI)= NSV_CHEMBEG_A(KMI) - NSV_CHGSEND_A(KMI)= NSV_CHEMBEG_A(KMI)+(NEQ-NEQAQ)-1 - NSV_CHAC_A(KMI) = 0 - NSV_CHACBEG_A(KMI)= 1 - NSV_CHACEND_A(KMI)= 0 - NSV_CHIC_A(KMI) = 0 - NSV_CHICBEG_A(KMI)= 1 - NSV_CHICEND_A(KMI)= 0 - ELSE - NSV_CHGS_A(KMI) = 0 - NSV_CHGSBEG_A(KMI)= 1 - NSV_CHGSEND_A(KMI)= 0 - NSV_CHAC_A(KMI) = 0 - NSV_CHACBEG_A(KMI)= 1 - NSV_CHACEND_A(KMI)= 0 - NSV_CHIC_A(KMI) = 0 - NSV_CHICBEG_A(KMI)= 1 - NSV_CHICEND_A(KMI)= 0 - ENDIF -END IF -! aerosol variables -IF (LORILAM.AND.(NEQ .GT. 0)) THEN - NM6_AER = 0 - IF (LVARSIGI) NM6_AER = 1 - IF (LVARSIGJ) NM6_AER = NM6_AER + 1 - NSV_AER_A(KMI) = (NSP+NCARB+NSOA+1)*JPMODE + NM6_AER - NSV_AERBEG_A(KMI)= ISV+1 - NSV_AEREND_A(KMI)= ISV+NSV_AER_A(KMI) - ISV = NSV_AEREND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_AER_A(KMI) - - ALLOCATE( YAEROLONGNAMES(NSV_AER_A(KMI)) ) -ELSE - NSV_AER_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_AERBEG_A(KMI)= 1 - NSV_AEREND_A(KMI)= 0 -END IF -IF (LORILAM .AND. LDEPOS_AER(KMI)) THEN - NSV_AERDEP_A(KMI) = JPMODE*2 - NSV_AERDEPBEG_A(KMI)= ISV+1 - NSV_AERDEPEND_A(KMI)= ISV+NSV_AERDEP_A(KMI) - ISV = NSV_AERDEPEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_AERDEP_A(KMI) -ELSE - NSV_AERDEP_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_AERDEPBEG_A(KMI)= 1 - NSV_AERDEPEND_A(KMI)= 0 -! force First index to be superior to last index -! in order to create a null section -END IF -! -! scalar variables used in dust model -! -IF (LDUST) THEN - IF (ALLOCATED(XT_LS).AND. .NOT.(LDSTPRES)) LDSTINIT=.TRUE. - IF (CPROGRAM == 'IDEAL ') LVARSIG = .TRUE. - IF ((CPROGRAM == 'REAL ').AND.LDSTINIT) LVARSIG = .TRUE. - !Determine number of moments - IF ( LRGFIX_DST ) THEN - INMOMENTS_DST = 1 - IF ( LVARSIG ) CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'LVARSIG forced to FALSE because LRGFIX_DST is TRUE' ) - LVARSIG = .FALSE. - ELSE IF ( LVARSIG ) THEN - INMOMENTS_DST = 3 - ELSE - INMOMENTS_DST = 2 - END IF - !Number of entries = number of moments multiplied by number of modes - NSV_DST_A(KMI) = NMODE_DST * INMOMENTS_DST - NSV_DSTBEG_A(KMI)= ISV+1 - NSV_DSTEND_A(KMI)= ISV+NSV_DST_A(KMI) - ISV = NSV_DSTEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_DST_A(KMI) -ELSE - NSV_DST_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_DSTBEG_A(KMI)= 1 - NSV_DSTEND_A(KMI)= 0 -END IF -IF ( LDUST .AND. LDEPOS_DST(KMI) ) THEN - NSV_DSTDEP_A(KMI) = NMODE_DST*2 - NSV_DSTDEPBEG_A(KMI)= ISV+1 - NSV_DSTDEPEND_A(KMI)= ISV+NSV_DSTDEP_A(KMI) - ISV = NSV_DSTDEPEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_DSTDEP_A(KMI) -ELSE - NSV_DSTDEP_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_DSTDEPBEG_A(KMI)= 1 - NSV_DSTDEPEND_A(KMI)= 0 -! force First index to be superior to last index -! in order to create a null section - - END IF -! scalar variables used in sea salt model -! -IF (LSALT) THEN - IF (ALLOCATED(XT_LS).AND. .NOT.(LSLTPRES)) LSLTINIT=.TRUE. - IF (CPROGRAM == 'IDEAL ') LVARSIG_SLT = .TRUE. - IF ((CPROGRAM == 'REAL ').AND. LSLTINIT ) LVARSIG_SLT = .TRUE. - !Determine number of moments - IF ( LRGFIX_SLT ) THEN - INMOMENTS_SLT = 1 - IF ( LVARSIG_SLT ) CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'LVARSIG_SLT forced to FALSE because LRGFIX_SLT is TRUE' ) - LVARSIG_SLT = .FALSE. - ELSE IF ( LVARSIG_SLT ) THEN - INMOMENTS_SLT = 3 - ELSE - INMOMENTS_SLT = 2 - END IF - !Number of entries = number of moments multiplied by number of modes - NSV_SLT_A(KMI) = NMODE_SLT * INMOMENTS_SLT - NSV_SLTBEG_A(KMI)= ISV+1 - NSV_SLTEND_A(KMI)= ISV+NSV_SLT_A(KMI) - ISV = NSV_SLTEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_SLT_A(KMI) -ELSE - NSV_SLT_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_SLTBEG_A(KMI)= 1 - NSV_SLTEND_A(KMI)= 0 -END IF -IF ( LSALT .AND. LDEPOS_SLT(KMI) ) THEN - NSV_SLTDEP_A(KMI) = NMODE_SLT*2 - NSV_SLTDEPBEG_A(KMI)= ISV+1 - NSV_SLTDEPEND_A(KMI)= ISV+NSV_SLTDEP_A(KMI) - ISV = NSV_SLTDEPEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_SLTDEP_A(KMI) -ELSE - NSV_SLTDEP_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_SLTDEPBEG_A(KMI)= 1 - NSV_SLTDEPEND_A(KMI)= 0 -! force First index to be superior to last index -! in order to create a null section -END IF -! -! scalar variables used in blowing snow model -! -IF (LBLOWSNOW) THEN - NSV_SNW_A(KMI) = NBLOWSNOW3D - NSV_SNWBEG_A(KMI)= ISV+1 - NSV_SNWEND_A(KMI)= ISV+NSV_SNW_A(KMI) - ISV = NSV_SNWEND_A(KMI) -ELSE - NSV_SNW_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_SNWBEG_A(KMI)= 1 - NSV_SNWEND_A(KMI)= 0 -END IF -! -! scalar variables used as LiNOX passive tracer -! -! In case without chemistry -IF (.NOT.(LUSECHEM.OR.LCHEMDIAG) .AND. (LCH_CONV_LINOX.OR.LLNOX_EXPLICIT)) THEN - NSV_LNOX_A(KMI) = 1 - NSV_LNOXBEG_A(KMI)= ISV+1 - NSV_LNOXEND_A(KMI)= ISV+NSV_LNOX_A(KMI) - ISV = NSV_LNOXEND_A(KMI) - NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_LNOX_A(KMI) -ELSE - NSV_LNOX_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_LNOXBEG_A(KMI)= 1 - NSV_LNOXEND_A(KMI)= 0 -END IF -! -! Final number of NSV variables -! -NSV_A(KMI) = ISV -! -! -!* Update LHORELAX_SV,CGETSVM,CGETSVT for NON USER SV -! -! C2R2 or KHKO SV case -!*BUG*JPC*MAR2006 -! IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) & -IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' ) & -!*BUG*JPC*MAR2006 -LHORELAX_SV(NSV_C2R2BEG_A(KMI):NSV_C2R2END_A(KMI))=LHORELAX_SVC2R2 -! C3R5 SV case -IF (CCLOUD == 'C3R5') & -LHORELAX_SV(NSV_C1R3BEG_A(KMI):NSV_C1R3END_A(KMI))=LHORELAX_SVC1R3 -! LIMA SV case -IF (CCLOUD == 'LIMA') & -LHORELAX_SV(NSV_LIMA_BEG_A(KMI):NSV_LIMA_END_A(KMI))=LHORELAX_SVLIMA -! Electrical SV case -IF (CELEC /= 'NONE') & -LHORELAX_SV(NSV_ELECBEG_A(KMI):NSV_ELECEND_A(KMI))=LHORELAX_SVELEC -! Chemical SV case -IF (LUSECHEM .OR. LCHEMDIAG) & -LHORELAX_SV(NSV_CHEMBEG_A(KMI):NSV_CHEMEND_A(KMI))=LHORELAX_SVCHEM -! Ice phase Chemical SV case -IF (LUSECHIC) & -LHORELAX_SV(NSV_CHICBEG_A(KMI):NSV_CHICEND_A(KMI))=LHORELAX_SVCHIC -! LINOX SV case -IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) & -LHORELAX_SV(NSV_LNOXBEG_A(KMI):NSV_LNOXEND_A(KMI))=LHORELAX_SVCHEM -! Dust SV case -IF (LDUST) & -LHORELAX_SV(NSV_DSTBEG_A(KMI):NSV_DSTEND_A(KMI))=LHORELAX_SVDST -! Sea Salt SV case -IF (LSALT) & -LHORELAX_SV(NSV_SLTBEG_A(KMI):NSV_SLTEND_A(KMI))=LHORELAX_SVSLT -! Aerosols SV case -IF (LORILAM) & -LHORELAX_SV(NSV_AERBEG_A(KMI):NSV_AEREND_A(KMI))=LHORELAX_SVAER -! Lagrangian variables -IF (LLG) & -LHORELAX_SV(NSV_LGBEG_A(KMI):NSV_LGEND_A(KMI))=LHORELAX_SVLG -! Passive pollutants -IF (LPASPOL) & -LHORELAX_SV(NSV_PPBEG_A(KMI):NSV_PPEND_A(KMI))=LHORELAX_SVPP -#ifdef MNH_FOREFIRE -! Fire pollutants -IF (LFOREFIRE) & -LHORELAX_SV(NSV_FFBEG_A(KMI):NSV_FFEND_A(KMI))=LHORELAX_SVFF -#endif -! Blaze Fire pollutants -IF (LBLAZE) & -LHORELAX_SV(NSV_FIREBEG_A(KMI):NSV_FIREEND_A(KMI))=LHORELAX_SVFIRE -! Conditional sampling -IF (LCONDSAMP) & -LHORELAX_SV(NSV_CSBEG_A(KMI):NSV_CSEND_A(KMI))=LHORELAX_SVCS -! Blowing snow case -IF (LBLOWSNOW) & -LHORELAX_SV(NSV_SNWBEG_A(KMI):NSV_SNWEND_A(KMI))=LHORELAX_SVSNW -! Update NSV* variables for model KMI -CALL UPDATE_NSV(KMI) -! -! SET MINIMUN VALUE FOR DIFFERENT SV GROUPS -! -XSVMIN(1:NSV_USER_A(KMI))=0. -IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' ) & -XSVMIN(NSV_C2R2BEG_A(KMI):NSV_C2R2END_A(KMI))=0. -IF (CCLOUD == 'C3R5') & -XSVMIN(NSV_C1R3BEG_A(KMI):NSV_C1R3END_A(KMI))=0. -IF (CCLOUD == 'LIMA') & -XSVMIN(NSV_LIMA_BEG_A(KMI):NSV_LIMA_END_A(KMI))=0. -IF (CELEC /= 'NONE') & -XSVMIN(NSV_ELECBEG_A(KMI):NSV_ELECEND_A(KMI))=0. -IF (LUSECHEM .OR. LCHEMDIAG) & -XSVMIN(NSV_CHEMBEG_A(KMI):NSV_CHEMEND_A(KMI))=0. -IF (LUSECHIC) & -XSVMIN(NSV_CHICBEG_A(KMI):NSV_CHICEND_A(KMI))=0. -IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) & -XSVMIN(NSV_LNOXBEG_A(KMI):NSV_LNOXEND_A(KMI))=0. -IF (LORILAM .OR. LCHEMDIAG) & -XSVMIN(NSV_AERBEG_A(KMI):NSV_AEREND_A(KMI))=0. -IF (LDUST) XSVMIN(NSV_DSTBEG_A(KMI):NSV_DSTEND_A(KMI))=XMNH_TINY -IF ((LDUST).AND.(LDEPOS_DST(KMI))) & -XSVMIN(NSV_DSTDEPBEG_A(KMI):NSV_DSTDEPEND_A(KMI))=XMNH_TINY -IF (LSALT) XSVMIN(NSV_SLTBEG_A(KMI):NSV_SLTEND_A(KMI))=XMNH_TINY -IF (LLG) THEN - XSVMIN(NSV_LGBEG_A(KMI)) =XLG1MIN - XSVMIN(NSV_LGBEG_A(KMI)+1)=XLG2MIN - XSVMIN(NSV_LGEND_A(KMI)) =XLG3MIN -ENDIF -IF ((LSALT).AND.(LDEPOS_SLT(KMI))) & -XSVMIN(NSV_SLTDEPBEG_A(KMI):NSV_SLTDEPEND_A(KMI))=XMNH_TINY -IF ((LORILAM).AND.(LDEPOS_AER(KMI))) & -XSVMIN(NSV_AERDEPBEG_A(KMI):NSV_AERDEPEND_A(KMI))=XMNH_TINY -IF (LPASPOL) XSVMIN(NSV_PPBEG_A(KMI):NSV_PPEND_A(KMI))=0. -#ifdef MNH_FOREFIRE -IF (LFOREFIRE) XSVMIN(NSV_FFBEG_A(KMI):NSV_FFEND_A(KMI))=0. -#endif -! Blaze smoke -IF (LBLAZE) XSVMIN(NSV_FIREBEG_A(KMI):NSV_FIREEND_A(KMI))=0. -! -IF (LCONDSAMP) XSVMIN(NSV_CSBEG_A(KMI):NSV_CSEND_A(KMI))=0. -IF (LBLOWSNOW) XSVMIN(NSV_SNWBEG_A(KMI):NSV_SNWEND_A(KMI))=XMNH_TINY -! -! NAME OF THE SCALAR VARIABLES IN THE DIFFERENT SV GROUPS -! -CSV_A(:, KMI) = ' ' -IF (LLG) THEN - CSV_A(NSV_LGBEG_A(KMI), KMI) = 'X0 ' - CSV_A(NSV_LGBEG_A(KMI)+1, KMI) = 'Y0 ' - CSV_A(NSV_LGEND_A(KMI), KMI) = 'Z0 ' -ENDIF - -! Initialize scalar variable names for dust -IF ( LDUST ) THEN - IF ( NMODE_DST < 1 .OR. NMODE_DST > 3 ) CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'NMODE_DST must in the 1 to 3 interval' ) - - ! Initialization of dust names - ! Was allocated for previous KMI - ! We assume that if LDUST=T on a model, NSV_DST_A(KMI) is the same for all - IF( .NOT. ALLOCATED( CDUSTNAMES ) ) THEN - ALLOCATE( CDUSTNAMES(NSV_DST_A(KMI)) ) - ELSE IF ( SIZE( CDUSTNAMES ) /= NSV_DST_A(KMI) ) THEN - CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'NSV_DST not the same for different model (if LDUST=T)' ) - DEALLOCATE( CDUSTNAMES ) - ALLOCATE( CDUSTNAMES(NSV_DST_A(KMI)) ) - END IF - ALLOCATE( YDUSTLONGNAMES(NSV_DST_A(KMI)) ) - !Loop on all dust modes - IF ( INMOMENTS_DST == 1 ) THEN - DO JMODE = 1, NMODE_DST - IMODEIDX = JPDUSTORDER(JMODE) - JSV_NAME = ( IMODEIDX - 1 ) * 3 + 2 - CDUSTNAMES(JMODE) = YPDUST_INI(JSV_NAME) - !Add meaning of the ppv unit (here for moment 3) - YDUSTLONGNAMES(JMODE) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]' - END DO - ELSE - DO JMODE = 1,NMODE_DST - !Find which mode we are dealing with - IMODEIDX = JPDUSTORDER(JMODE) - DO JMOM = 1, INMOMENTS_DST - !Find which number this is of the list of scalars - JSV = ( JMODE - 1 ) * INMOMENTS_DST + JMOM - !Find what name this corresponds to, always 3 moments assumed in YPDUST_INI - JSV_NAME = ( IMODEIDX - 1) * 3 + JMOM - !Get the right CDUSTNAMES which should follow the list of scalars transported in XSVM/XSVT - CDUSTNAMES(JSV) = YPDUST_INI(JSV_NAME) - !Add meaning of the ppv unit - IF ( JMOM == 1 ) THEN !Corresponds to moment 0 - YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [nb_aerosols/molec_{air}]' - ELSE IF ( JMOM == 2 ) THEN !Corresponds to moment 3 - YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]' - ELSE IF ( JMOM == 3 ) THEN !Corresponds to moment 6 - YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [um6/molec_{air}*(cm3/m3)]' - ELSE - CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for DUST' ) - YDUSTLONGNAMES(JMODE) = TRIM( YPDUST_INI(JSV_NAME) ) - END IF - ENDDO ! Loop on moments - ENDDO ! Loop on dust modes - END IF - - ! Initialization of deposition scheme names - IF ( LDEPOS_DST(KMI) ) THEN - IF( .NOT. ALLOCATED( CDEDSTNAMES ) ) THEN - ALLOCATE( CDEDSTNAMES(NMODE_DST * 2) ) - DO JMODE = 1, NMODE_DST - IMODEIDX = JPDUSTORDER(JMODE) - CDEDSTNAMES(JMODE) = YPDEDST_INI(IMODEIDX) - CDEDSTNAMES(NMODE_DST + JMODE) = YPDEDST_INI(NMODE_DST + IMODEIDX) - ENDDO - END IF - END IF -END IF - -! Initialize scalar variable names for salt -IF ( LSALT ) THEN - IF ( NMODE_SLT < 1 .OR. NMODE_SLT > 8 ) CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'NMODE_SLT must in the 1 to 8 interval' ) - - ! Was allocated for previous KMI - ! We assume that if LSALT=T on a model, NSV_SLT_A(KMI) is the same for all - IF( .NOT. ALLOCATED( CSALTNAMES ) ) THEN - ALLOCATE( CSALTNAMES(NSV_SLT_A(KMI)) ) - ELSE IF ( SIZE( CSALTNAMES ) /= NSV_SLT_A(KMI) ) THEN - CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'NSV_SLT not the same for different model (if LSALT=T)' ) - DEALLOCATE( CSALTNAMES ) - ALLOCATE( CSALTNAMES(NSV_SLT_A(KMI)) ) - END IF - ALLOCATE( YSALTLONGNAMES(NSV_SLT_A(KMI)) ) - !Loop on all dust modes - IF ( INMOMENTS_SLT == 1 ) THEN - DO JMODE = 1, NMODE_SLT - IMODEIDX = JPSALTORDER(JMODE) - JSV_NAME = ( IMODEIDX - 1 ) * 3 + 2 - CSALTNAMES(JMODE) = YPSALT_INI(JSV_NAME) - !Add meaning of the ppv unit (here for moment 3) - YSALTLONGNAMES(JMODE) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]' - END DO - ELSE - DO JMODE = 1, NMODE_SLT - !Find which mode we are dealing with - IMODEIDX = JPSALTORDER(JMODE) - DO JMOM = 1, INMOMENTS_SLT - !Find which number this is of the list of scalars - JSV = ( JMODE - 1 ) * INMOMENTS_SLT + JMOM - !Find what name this corresponds to, always 3 moments assumed in YPSALT_INI - JSV_NAME = ( IMODEIDX - 1 ) * 3 + JMOM - !Get the right CSALTNAMES which should follow the list of scalars transported in XSVM/XSVT - CSALTNAMES(JSV) = YPSALT_INI(JSV_NAME) - !Add meaning of the ppv unit - IF ( JMOM == 1 ) THEN !Corresponds to moment 0 - YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [nb_aerosols/molec_{air}]' - ELSE IF ( JMOM == 2 ) THEN !Corresponds to moment 3 - YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]' - ELSE IF ( JMOM == 3 ) THEN !Corresponds to moment 6 - YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [um6/molec_{air}*(cm3/m3)]' - ELSE - CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for SALT' ) - YSALTLONGNAMES(JMODE) = TRIM( YPSALT_INI(JSV_NAME) ) - END IF - ENDDO ! Loop on moments - ENDDO ! Loop on dust modes - END IF - - ! Initialization of deposition scheme - IF ( LDEPOS_SLT(KMI) ) THEN - IF( .NOT. ALLOCATED( CDESLTNAMES ) ) THEN - ALLOCATE( CDESLTNAMES(NMODE_SLT * 2) ) - DO JMODE = 1, NMODE_SLT - IMODEIDX = JPSALTORDER(JMODE) - CDESLTNAMES(JMODE) = YPDESLT_INI(IMODEIDX) - CDESLTNAMES(NMODE_SLT + JMODE) = YPDESLT_INI(NMODE_SLT + IMODEIDX) - ENDDO - ENDIF - ENDIF -END IF - -! Initialize scalar variable names for snow -IF ( LBLOWSNOW ) THEN - IF( .NOT. ALLOCATED( CSNOWNAMES ) ) THEN - ALLOCATE( CSNOWNAMES(NSV_SNW_A(KMI)) ) - DO JMOM = 1, NSV_SNW_A(KMI) - CSNOWNAMES(JMOM) = YPSNOW_INI(JMOM) - END DO - END IF -END IF - -!Fill metadata for model KMI -DO JSV = 1, NSV_USER_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'SVUSER' // YNUM3, & - CSTDNAME = '', & - CLONGNAME = 'SVUSER' // YNUM3, & - CUNITS = 'kg kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVUSER' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_C2R2BEG_A(KMI), NSV_C2R2END_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( C2R2NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( C2R2NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), & - CUNITS = 'm-3', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_C1R3BEG_A(KMI), NSV_C1R3END_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( C1R3NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( C1R3NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), & - CUNITS = 'm-3', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_LIMA_BEG_A(KMI), NSV_LIMA_END_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'SV LIMA ' // YNUM3, & - CSTDNAME = '', & - CLONGNAME = '', & - CUNITS = 'kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - - IF ( JSV == NSV_LIMA_NC_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(1) ) - ELSE IF ( JSV == NSV_LIMA_NR_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(2) ) - ELSE IF ( JSV >= NSV_LIMA_CCN_FREE_A(KMI) .AND. JSV < NSV_LIMA_CCN_ACTI_A(KMI) ) THEN - WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_CCN_FREE_A(KMI) + 1 - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(3) ) // YNUM2 - ELSE IF (JSV >= NSV_LIMA_CCN_ACTI_A(KMI) .AND. JSV < ( NSV_LIMA_CCN_ACTI_A(KMI) + NMOD_CCN ) ) THEN - WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_CCN_ACTI_A(KMI) + 1 - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(4) ) // YNUM2 - ELSE IF ( JSV == NSV_LIMA_SCAVMASS_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CAERO_MASS(1) ) - TSVLIST_A(JSV, KMI)%CUNITS = 'kg kg-1' - ELSE IF ( JSV == NSV_LIMA_NI_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(1) ) - ELSE IF ( JSV == NSV_LIMA_NS_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(2) ) - ELSE IF ( JSV == NSV_LIMA_NG_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(3) ) - ELSE IF ( JSV == NSV_LIMA_NH_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(4) ) - ELSE IF ( JSV >= NSV_LIMA_IFN_FREE_A(KMI) .AND. JSV < NSV_LIMA_IFN_NUCL_A(KMI) ) THEN - WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_IFN_FREE_A(KMI) + 1 - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(5) ) // YNUM2 - ELSE IF ( JSV >= NSV_LIMA_IFN_NUCL_A(KMI) .AND. JSV < ( NSV_LIMA_IFN_NUCL_A(KMI) + NMOD_IFN ) ) THEN - WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_IFN_NUCL_A(KMI) + 1 - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(6) ) // YNUM2 - ELSE IF ( JSV >= NSV_LIMA_IMM_NUCL_A(KMI) .AND. JSV < ( NSV_LIMA_IMM_NUCL_A(KMI) + NMOD_IMM ) ) THEN - WRITE( YNUM2, '( I2.2 )' ) NINDICE_CCN_IMM(JSV-NSV_LIMA_IMM_NUCL_A(KMI)+1) - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(7) ) // YNUM2 - ELSE IF ( JSV == NSV_LIMA_HOM_HAZE_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(8) ) - ELSE IF ( JSV == NSV_LIMA_SPRO_A(KMI) ) THEN - TSVLIST_A(JSV, KMI)%CUNITS = '1' - TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(5) ) - ELSE - CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'invalid index for LIMA' ) - END IF - - TSVLIST_A(JSV, KMI)%CLONGNAME = TRIM( TSVLIST_A(JSV, KMI)%CMNHNAME ) -END DO - -DO JSV = NSV_ELECBEG_A(KMI), NSV_ELECEND_A(KMI) - IF ( JSV > NSV_ELECBEG .AND. JSV < NSV_ELECEND ) THEN - YUNITS = 'C kg-1' - WRITE( YCOMMENT, '( A6, A3, I3.3 )' ) 'X_Y_Z_', 'SVT', JSV - ELSE - YUNITS = 'kg-1' - WRITE( YCOMMENT, '( A6, A3, I3.3, A8 )' ) 'X_Y_Z_', 'SVT', JSV, ' (nb ions/kg)' - END IF - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CELECNAMES(JSV-NSV_ELECBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CELECNAMES(JSV-NSV_ELECBEG_A(KMI)+1) ), & - CUNITS = TRIM( YUNITS ), & - CDIR = 'XY', & - CCOMMENT = TRIM( YCOMMENT ), & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_LGBEG_A(KMI), NSV_LGEND_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CLGNAMES(JSV-NSV_LGBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CLGNAMES(JSV-NSV_LGBEG_A(KMI)+1) ), & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_PPBEG_A(KMI), NSV_PPEND_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_PPBEG_A(KMI)+1 - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'SVPP' // YNUM3, & - CSTDNAME = '', & - CLONGNAME = 'SVPP' // YNUM3, & - CUNITS = 'kg kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -#ifdef MNH_FOREFIRE -DO JSV = NSV_FFBEG_A(KMI), NSV_FFEND_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_FFBEG_A(KMI)+1 - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'SVFF' // YNUM3, & - CSTDNAME = '', & - CLONGNAME = 'SVFF' // YNUM3, & - CUNITS = 'kg kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO -#endif - -DO JSV = NSV_FIREBEG_A(KMI), NSV_FIREEND_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_FIREBEG_A(KMI)+1 - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'SVFIRE' // YNUM3, & - CSTDNAME = '', & - CLONGNAME = 'SVFIRE' // YNUM3, & - CUNITS = 'kg kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_CSBEG_A(KMI), NSV_CSEND_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_CSBEG_A(KMI) - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'SVCS' // YNUM3, & - CSTDNAME = '', & - CLONGNAME = 'SVCS' // YNUM3, & - CUNITS = 'kg kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_CHEMBEG_A(KMI), NSV_CHEMEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_CHICBEG_A(KMI), NSV_CHICEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - !Determine moment to add meaning of the ppv unit - JAER = JSV - NSV_AERBEG_A(KMI) + 1 - IF ( ANY( JAER == [JP_CH_M0i, JP_CH_M0j] ) ) THEN - !Moment 0 - YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [nb_aerosols/molec_{air}]' - ELSE IF ( ANY( JAER == [ JP_CH_SO4i, JP_CH_SO4j, JP_CH_NO3i, JP_CH_NO3j, JP_CH_H2Oi, JP_CH_H2Oj, JP_CH_NH3i, JP_CH_NH3j, & - JP_CH_OCi, JP_CH_OCj, JP_CH_BCi, JP_CH_BCj, JP_CH_DSTi, JP_CH_DSTj ] ) & - .OR. ( NSOA == 10 .AND. & - ANY( JAER == [ JP_CH_SOA1i, JP_CH_SOA1j, JP_CH_SOA2i, JP_CH_SOA2j, JP_CH_SOA3i, JP_CH_SOA3j, JP_CH_SOA4i, & - JP_CH_SOA4j, JP_CH_SOA5i, JP_CH_SOA5j, JP_CH_SOA6i, JP_CH_SOA6j, JP_CH_SOA7i, JP_CH_SOA7j, & - JP_CH_SOA8i, JP_CH_SOA8j, JP_CH_SOA9i, JP_CH_SOA9j, JP_CH_SOA10i, JP_CH_SOA10j ] ) ) ) THEN - !Moment 3 - YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [molec_{aer}/molec_{air}]' - ELSE IF ( ( LVARSIGI .AND. JAER == JP_CH_M6i ) .OR. ( LVARSIGJ .AND. JAER == JP_CH_M6j ) ) THEN - !Moment 6 - YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [um6/molec_{air}*(cm3/m3)]' - ELSE - CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for AER' ) - YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) - END IF - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( YAEROLONGNAMES(JSV-NSV_AERBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_AERDEPBEG_A(KMI), NSV_AERDEPEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_DSTBEG_A(KMI), NSV_DSTEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( YDUSTLONGNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_DSTDEPBEG_A(KMI), NSV_DSTDEPEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_SLTBEG_A(KMI), NSV_SLTEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( YSALTLONGNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_SLTDEPBEG_A(KMI), NSV_SLTDEPEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ) - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -DO JSV = NSV_SNWBEG_A(KMI), NSV_SNWEND_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CSNOWNAMES(JSV-NSV_SNWBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CSNOWNAMES(JSV-NSV_SNWBEG_A(KMI)+1) ), & - CUNITS = 'kg kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -!Check if there is at most 1 LINOX scalar variable -!if not, the name must be modified and different for all of them -IF ( NSV_LNOX_A(KMI) > 1 ) & - CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'NSV_LNOX_A>1: problem with the names of the corresponding scalar variables' ) - -DO JSV = NSV_LNOXBEG_A(KMI), NSV_LNOXEND_A(KMI) - ICHIDX = ICHIDX + 1 - CSV_CHEM_LIST_A(ICHIDX, KMI) = 'LINOX' - - WRITE( YNUM3, '( I3.3 )' ) JSV - - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'LINOX', & - CSTDNAME = '', & - CLONGNAME = 'LINOX', & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) -END DO - -IF ( ICHIDX /= NSV_CHEM_LIST_A(KMI) ) & - CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'ICHIDX /= NSV_CHEM_LIST_A(KMI)' ) - -END SUBROUTINE INI_NSV diff --git a/src/PHYEX/ext/ini_radar.f90 b/src/PHYEX/ext/ini_radar.f90 deleted file mode 100644 index efe222510..000000000 --- a/src/PHYEX/ext/ini_radar.f90 +++ /dev/null @@ -1,234 +0,0 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! masdev4_7 BUG1 2007/06/15 17:47:18 -!----------------------------------------------------------------- -! ######################## - MODULE MODI_INI_RADAR -! ######################## -! -INTERFACE - SUBROUTINE INI_RADAR (HPRISTINE_ICE ) -! -CHARACTER (LEN=4), INTENT(IN) :: HPRISTINE_ICE ! Indicator of ice crystal characteristics -! -! -END SUBROUTINE INI_RADAR -! -END INTERFACE -! -END MODULE MODI_INI_RADAR -! ########################################################### - SUBROUTINE INI_RADAR ( HPRISTINE_ICE ) -! ########################################################### -! -!!**** *INI_RADAR * -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to initialize the constants used to -!! compute radar reflectivity (radar_rain_ice.f90 or radar_simulator.f90) -!! for DIAG after PREP_REAL_CASE with AROME file (CCLOUD=NONE) -!! -!!** METHOD -!! ------ -!! The constants useful to radar are initialized to their -!! numerical values as in ini_rain_ice.f90 for ICE3 -!! -!! EXTERNAL -!! -------- -!! GAMMA : gamma function -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST -!! XPI ! -!! XP00 ! Reference pressure -!! XRD ! Gaz constant for dry air -!! XRHOLW ! Liquid water density -!! Module MODD_RAIN_ICE_DESCR -!! -!! -!! AUTHOR -!! ------ -!! G. TANGUY * CNRM * -!! -!! MODIFICATIONS -!! ------------- -!! Original 27/10/2009 -!! P.Scheffknecht 22/04/2015: test missing on already allocated XRTMIN -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_RAIN_ICE_DESCR_n -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -! -CHARACTER (LEN=4), INTENT(IN) :: HPRISTINE_ICE ! Indicator of ice crystal caracteristics -! -!------------------------------------------------------------------------------- -! -! -! -!* 1.1 Raindrop characteristics -! -! -! -XAR = (XPI/6.0)*XRHOLW -XBR = 3.0 -XCR = 842. -XDR = 0.8 -XCCR = 8.E6 -! -!* 1.2 Ice crystal characteristics -! -! -SELECT CASE (HPRISTINE_ICE) - CASE('PLAT') - XAI = 0.82 ! Plates - XBI = 2.5 ! Plates - XC_I = 800. ! Plates - XDI = 1.0 ! Plates - CASE('COLU') - XAI = 2.14E-3 ! Columns - XBI = 1.7 ! Columns - XC_I = 2.1E5 ! Columns - XDI = 1.585 ! Columns - CASE('BURO') - XAI = 44.0 ! Bullet rosettes - XBI = 3.0 ! Bullet rosettes - XC_I = 4.3E5 ! Bullet rosettes - XDI = 1.663 ! Bullet rosettes -END SELECT -! -! -!* 1.3 Snowflakes/aggregates characteristics -! -! -XAS = 0.02 -XBS = 1.9 -XCS = 5.1 -XDS = 0.27 -XCCS = 5.0 -XCXS = 1.0 -! -!* 1.4 Graupel/Frozen drop characteristics -! -! -XAG = 19.6 -XBG = 2.8 -XCG = 124. -XDG = 0.66 -XCCG = 5.E5 -XCXG = -0.5 -! -!* 1.5 Hailstone characteristics -! -! -XAH = 470. -XBH = 3.0 -XCH = 207. -XDH = 0.64 -XCCH = 4.E4 -XCXH = -1.0 -! -!------------------------------------------------------------------------------- -! -!* 2. DIMENSIONAL DISTRIBUTIONS OF THE SPECIES -! ---------------------------------------- -! -!* 2.1 Raindrops distribution -! -XALPHAR = 1.0 ! Exponential law -XNUR = 1.0 ! Exponential law -! -!* 2.2 Ice crystal distribution -! -XALPHAI = 3.0 ! Gamma law for the ice crystal volume -XNUI = 3.0 ! Gamma law with little dispersion -! -XALPHAS = 1.0 ! Exponential law -XNUS = 1.0 ! Exponential law -! -XALPHAG = 1.0 ! Exponential law -XNUG = 1.0 ! Exponential law -! -XALPHAH = 1.0 ! Gamma law -XNUH = 8.0 ! Gamma law with little dispersion -! -!* 2.3 Constants for shape parameter -! -XLBEXR = 1.0/(-1.0-XBR) -XLBR = ( XAR*XCCR*MOMG(XALPHAR,XNUR,XBR) )**(-XLBEXR) -! -XLBEXI = 1.0/(-XBI) -XLBI = ( XAI*MOMG(XALPHAI,XNUI,XBI) )**(-XLBEXI) -! -XNS = 1.0/(XAS*MOMG(XALPHAS,XNUS,XBS)) -XLBEXS = 1.0/(XCXS-XBS) -XLBS = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS) -! -XLBEXG = 1.0/(XCXG-XBG) -XLBG = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG) )**(-XLBEXG) -! -XLBEXH = 1.0/(XCXH-XBH) -XLBH = ( XAH*XCCH*MOMG(XALPHAH,XNUH,XBH) )**(-XLBEXH) -! -!* 2.4 Minimal values allowed for the mixing ratios -! ICE3 -IF(.NOT.ASSOCIATED(XRTMIN)) THEN - CALL RAIN_ICE_DESCR_ALLOCATE(6) -END IF -! -XRTMIN(1) = 1.0E-20 -XRTMIN(2) = 1.0E-20 -XRTMIN(3) = 1.0E-20 -XRTMIN(4) = 1.0E-20 -XRTMIN(5) = 1.0E-15 -XRTMIN(6) = 1.0E-15 - -! -CONTAINS -! -!------------------------------------------------------------------------------ -! - FUNCTION MOMG (PALPHA,PNU,PP) RESULT (PMOMG) -! -! auxiliary routine used to compute the Pth moment order of the generalized -! gamma law -! - USE MODI_GAMMA - - IMPLICIT NONE - - REAL, INTENT(IN) :: PALPHA ! first shape parameter of the dimensionnal distribution - REAL, INTENT(IN) :: PNU ! second shape parameter of the dimensionnal distribution - REAL, INTENT(IN) :: PP ! order of the moment - REAL :: PMOMG ! result: moment of order ZP - -!------------------------------------------------------------------------------ - - - PMOMG = GAMMA(PNU+PP/PALPHA)/GAMMA(PNU) - - END FUNCTION MOMG - -!------------------------------------------------------------------------------- -! -! -END SUBROUTINE INI_RADAR - - diff --git a/src/PHYEX/ext/ini_segn.f90 b/src/PHYEX/ext/ini_segn.f90 deleted file mode 100644 index 9299f713c..000000000 --- a/src/PHYEX/ext/ini_segn.f90 +++ /dev/null @@ -1,483 +0,0 @@ -!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ################### - MODULE MODI_INI_SEG_n -! ################### -! -INTERFACE -! -SUBROUTINE INI_SEG_n(KMI,TPINIFILE,HINIFILEPGD,PTSTEP_ALL) -! -USE MODD_IO, ONLY : TFILEDATA -! -INTEGER, INTENT(IN) :: KMI !Model index -TYPE(TFILEDATA), POINTER, INTENT(OUT) :: TPINIFILE !Initial file -CHARACTER (LEN=28), INTENT(OUT) :: HINIFILEPGD -REAL,DIMENSION(:), INTENT(INOUT) :: PTSTEP_ALL ! Time STEP of ALL models -! -END SUBROUTINE INI_SEG_n -! -END INTERFACE -! -END MODULE MODI_INI_SEG_n -! -! -! -! -! ############################################################# - SUBROUTINE INI_SEG_n(KMI,TPINIFILE,HINIFILEPGD,PTSTEP_ALL) -! ############################################################# -! -!!**** *INI_SEG_n * - routine to read and update the descriptor files for -!! model KMI -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to read the descriptor files in the -! following order : -! - DESFM file which gives informations about the initial file -! (i.e. the description of the segment that produced the initial file -! or the description of the preinitialisation that created the initial file) -! - EXSEG file which gives informations about the segment to perform. -! -! Informations in EXSEG file are completed by DESFM file informations -! and if the informations are not in DESFM file, they are set -! to default values. -! -! The descriptor file EXSEG corresponding to the segment of simulation -! to be performed, is then updated with the combined informations. -! We also store in the updated EXSEG file, the informations on the status -! of the different variables ( skip, init, read) in the namelist NAM_GETn, -! which will be read in the INI_MODELn routine to properly initiliaze the -! model n. Except this last namelist, the informations written in this -! EXSEG file, will be identical to the NAMELIST section of the descriptive -! part of the FM files containing the model outputs. -! -! In order not to duplicate the routines called by ini_seg, we use the -! modules modd, corresponding to the first model to store the informations -! read on the different files ( DESFM and EXSEG ). The final filling of -! the modules modd (MODD_CONFn ....) will be realized in the subroutine -! INI_MODELn. The goal of the INI_SEG_n part of the initialization is to -! built the final EXSEG, which will be associated to the LFI files -! generated during the segment ( and therefore not to fill the modd). -! -! -!!** METHOD -!! ------ -!! For a nested model of index KMI : -!! - Logical unit numbers are associated to output-listing file and -!! descriptor EXSEG file by FMATTR. Then these files are opened. -!! The name of the initial file is read in EXSEG file. -!! - Default values are supplied for variables in descriptor files -!! (by DEFAULT_DESFM). -!! - The Initial file (LFIFM + DESFM) is opened by IO_File_open. -!! - The descriptor DESFM file is read (by READ_DESFM_n). -!! - The descriptor file EXSEG is read (by READ_EXSEG_n) and coherence -!! between the initial file and the description of segment is also checked -!! in this routine. -!! - If there is more than one model the EXSEG file is updated -!! (by WRITE_DESFM$n). This routine prints also EXSEG content on -!! output-listing. -!! - If there is only one model (i.e. no grid-nesting), -!! EXSEG file is also closed (logical unit number associated with this -!! file is also released by FMFREE). -!! -!! -!! -!! EXTERNAL -!! -------- -!! FMATTR : to associate a logical unit number to a file -!! IO_File_open : to open descriptor file or LFI file -!! DEFAULT_DESFM1: to set default values -!! READ_DESFM_n : to read a DESFM file -!! READ_EXSEG_n : to read a EXSEG file -!! WRITE_DESFM1 : to write the DESFM part of the future outputs -!! FMFREE : to release a logical unit number linked to a file -!! -!! Module MODI_DEFAULT_DESFM : Interface for routine DEFAULT_DESFM -!! Module MODI_READ_DESFM_n : Interface for routine READ_DESFM_n -!! Module MODI_READ_EXSEG_n : Interface for routine READ_EXSEG_n -!! Module MODI_WRITE_DESFM1 : Interface for routine WRITE_DESFM1 -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_LUNIT : contains names and logical unit numbers -!! -!! Module MODD_CONF : contains configuration variables -!! CCONF : Configuration of models -!! NMODEL : Number of nested models -!! NVERB : Level of informations on output-listing -!! 0 for minimum of prints -!! 5 for intermediate level of prints -!! 10 for maximum of prints -!! -!! Module MODN_LUNIT1 : contains declarations of namelist NAMLUNITMN -!! and module MODD_LUNIT1 -!! -!! REFERENCE -!! --------- -!! Book2 of documentation (routine INI_SEG) -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/06/94 -!! Modification 26/10/94 remove the NAM_GETn from the namelist present -!! in the EXSEG file (J.Stein) -!! 11/01/95 change the read_exseg and desfm CALLS to add -!! the G1D switch -!! 15/02/95 add the HTURBLEN information (J. Cuxart) -!! 18/08/95 Time STEP change (J. P. Lafore) -!! 02/10/95 add the radiation control (J. Stein) -!! 18/03/96 remove the no write option for WRITE_DESFM -!! (J. Stein) -!! 11/04/96 add the ice conc. control (J.-P. Pinty) -!! 11/01/97 add the deep convection control (J.-P. Pinty) -!! 17/07/96 correction for WRITE_DESFM1 call (J. P. Lafore) -!! 22/07/96 PTSTEP_ALL introduction for nesting (J. P. Lafore) -!! 7/08/98 // (V. Ducrocq) -!! 02/08/99 remove unused argument for read_desfm (J. Stein) -!! 15/03/99 test on execution program (V. Masson) -!! 15/11/00 Add YCLOUD (J.-P. Pinty) -!! 01/03/01 Add GUSECHEM (D. Gazen) -!! 15/10/01 namelists in different orders (I.Mallet) -!! 25/11/02 Add YELEC (P. Jabouille) -!! 01/2004 externalization of surface (V. Masson) -!! 01/2005 add GDUST, GSALT, and GORILAM (P. Tulet) -!! 04/2010 add GUSECHAQ, GCH_PH (M. Leriche) -!! 09/2010 add GUSECHIC (M. Leriche) -!! 02/2012 add GFOREFIRE (Pialat/Tulet) -!! 05/2014 missing reading of IMASDEV before COUPLING -!! test (Escobar) -!! 10/02/15 remove ABORT in parallel case for SPAWNING -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! 01/2015 add GLNOX_EXPLICIT (C. Barthe) -!! 04/2016 add ABORT if CINIFILEPGD is not specified (G.Delautier) -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! 07/2017 add GBLOWSNOW (V. Vionnet) -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! P. Wautelet 19/06/2019: provide KMODEL to INI_FIELD_LIST when known -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -USE MODD_CONF -USE MODD_CONF_n, ONLY: CSTORAGE_TYPE -USE MODN_CONFZ -USE MODD_DYN_n, ONLY : LOCEAN -USE MODD_DYN -USE MODD_IO, ONLY: NVERB_FATAL, NVERB_WARNING, TFILE_OUTPUTLISTING, TFILEDATA -USE MODD_LES, ONLY: LES_ASSOCIATE -USE MODD_LUNIT -USE MODD_LUNIT_n, ONLY: CINIFILE_n=> CINIFILE, TINIFILE_n => TINIFILE, CINIFILEPGD_n=> CINIFILEPGD, TLUOUT, LUNIT_MODEL -USE MODD_PARAM_n, ONLY: CSURF -USE MODD_PARAM_ICE_n -USE MODD_PARAMETERS -USE MODD_REF, ONLY: LBOUSS -! -use mode_field, only: Ini_field_list, Ini_field_scalars -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_IO_FILE, ONLY: IO_File_close, IO_File_open -USE MODE_IO, only: IO_Config_set -USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_add2list -USE MODE_MSG -USE MODE_POS -! -USE MODI_DEFAULT_DESFM_n -USE MODI_READ_DESFM_n -USE MODI_READ_EXSEG_n -USE MODI_WRITE_DESFM_n -! -USE MODN_CONFIO, ONLY: NAM_CONFIO -USE MODN_LUNIT_n -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KMI !Model index -TYPE(TFILEDATA), POINTER, INTENT(OUT) :: TPINIFILE !Initial file -CHARACTER (LEN=28), INTENT(OUT) :: HINIFILEPGD -REAL,DIMENSION(:), INTENT(INOUT) :: PTSTEP_ALL ! Time STEP of ALL models -! -!* 0.1 declarations of local variables -! -LOGICAL :: GFOUND ! Return code when searching namelist -CHARACTER (LEN=28) :: YINIFILE ! name of initial file -CHARACTER (LEN=2) :: YMI ! string for model index -INTEGER :: ILUOUT ! Logical unit number - ! associated with TLUOUT - ! -INTEGER :: IRESP,ILUSEG ! File management variables -CHARACTER (LEN=5) :: YCONF ! Local variables which have -LOGICAL :: GFLAT ! the same definition as the -LOGICAL :: GUSERV,GUSERC,GUSERR,GUSERI ! variables in module MODD_CONF, -LOGICAL :: GUSERS,GUSERG,GUSERH,GUSECI ! MODD_CONFn, MODD_PARAMn, -LOGICAL :: GUSECHEM ! flag for chemistry -LOGICAL :: GUSECHAQ ! flag for aq. phase chemistry -LOGICAL :: GUSECHIC ! flag for ice phase chemistry -LOGICAL :: GCH_PH ! flag for pH -LOGICAL :: GCH_CONV_LINOX -LOGICAL :: GDUST -LOGICAL,DIMENSION(JPMODELMAX) :: GDEPOS_DST, GDEPOS_SLT, GDEPOS_AER -LOGICAL :: GSALT -LOGICAL :: GORILAM -LOGICAL :: GLG -LOGICAL :: GPASPOL -LOGICAL :: GFIRE -#ifdef MNH_FOREFIRE -LOGICAL :: GFOREFIRE -#endif -LOGICAL :: GCONDSAMP -LOGICAL :: GBLOWSNOW -LOGICAL :: GCHTRANS -LOGICAL :: GLNOX_EXPLICIT ! flag for LNOx - ! These variables - ! are used to locally store -INTEGER :: ISV ! the value read in DESFM -INTEGER :: IRIMX,IRIMY ! number of points for the - ! horizontal relaxation -CHARACTER (LEN=4) :: YTURB ! file in order to check the -CHARACTER (LEN=4) :: YRAD ! corresponding informations -CHARACTER (LEN=4) :: YTOM ! read in EXSEG file. -LOGICAL :: GRMC01 -CHARACTER (LEN=4) :: YDCONV -CHARACTER (LEN=4) :: YSCONV -CHARACTER (LEN=4) :: YCLOUD -CHARACTER (LEN=4) :: YELEC -CHARACTER (LEN=3) :: YEQNSYS -TYPE(TFILEDATA),POINTER :: TZFILE_DES -! -TPINIFILE => NULL() -TZFILE_DES => NULL() -!------------------------------------------------------------------------------- -! -!* 1. OPEN OUPTUT-LISTING FILE AND EXSEG FILE -! --------------------------------------- -! -WRITE(YMI,'(I2.0)') KMI -CALL IO_File_add2list(LUNIT_MODEL(KMI)%TLUOUT,'OUTPUT_LISTING'//ADJUSTL(YMI),'OUTPUTLISTING','WRITE') -TLUOUT => LUNIT_MODEL(KMI)%TLUOUT !Necessary because TLUOUT was initially pointing to NULL -CALL IO_File_open(TLUOUT) -! -!Set output file for PRINT_MSG -TFILE_OUTPUTLISTING => TLUOUT -! -ILUOUT=TLUOUT%NLU -! -WRITE(UNIT=ILUOUT,FMT='(50("*"),/,"*",17X,"MODEL ",I1," LISTING",16X,"*",/, & - & 50("*"))') KMI -! -IF (CPROGRAM=='MESONH') THEN - CALL IO_File_add2list(TZFILE_DES,'EXSEG'//TRIM(ADJUSTL(YMI))//'.nam','NML','READ') - CALL IO_File_open(TZFILE_DES) -! -!* 1.3 SPAWNING or SPEC or REAL program case -! --------------------- -! -ELSE IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='REAL '.OR. CPROGRAM=='SPEC ') THEN - YINIFILE = CINIFILE_n - HINIFILEPGD = CINIFILEPGD_n - CALL IO_File_add2list(TPINIFILE,TRIM(YINIFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=NVERB) - CALL IO_File_open(TPINIFILE) - TZFILE_DES => TPINIFILE%TDESFILE -! -!* 1.3bis DIAG program case -! -ELSE IF (CPROGRAM=='DIAG ') THEN - YINIFILE = CINIFILE_n - HINIFILEPGD = CINIFILEPGD_n - CALL IO_File_add2list(TINIFILE_n,TRIM(YINIFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=NVERB) - CALL IO_File_open(TINIFILE_n) - TPINIFILE => TINIFILE_n - TZFILE_DES => TPINIFILE%TDESFILE -! -!* 1.4 Other program cases -! ------------------- -! -ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SEG_n','should not be called for CPROGRAM='//TRIM(CPROGRAM)) -ENDIF -! -ILUSEG = TZFILE_DES%NLU -! -!------------------------------------------------------------------------------- -! -!* 2. SET DEFAULT VALUES -! ------------------ -! -CALL LES_ASSOCIATE() -CALL DEFAULT_DESFM_n(KMI) -! -!------------------------------------------------------------------------------- -! -!* 3. READ INITIAL FILE NAME AND OPEN INITIAL FILE -! -------------------------------------------- -! -CALL POSNAM( TZFILE_DES, 'NAM_LUNITN', GFOUND ) -IF (GFOUND) THEN - CALL INIT_NAM_LUNITn - READ(UNIT=ILUSEG,NML=NAM_LUNITn) - CALL UPDATE_NAM_LUNITn - IF (LEN_TRIM(CINIFILEPGD)==0 .AND. CSURF=='EXTE') THEN - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SEG_n','error in namelist NAM_LUNITn: you need to specify CINIFILEPGD') - ENDIF -END IF - -IF (CPROGRAM=='MESONH') THEN - IF (KMI.EQ.1) THEN - CALL POSNAM( TZFILE_DES, 'NAM_CONFZ', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFZ) - CALL POSNAM( TZFILE_DES, 'NAM_CONFIO', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFIO) - CALL IO_Config_set() - END IF - HINIFILEPGD=CINIFILEPGD_n - YINIFILE=CINIFILE_n - - CALL IO_File_add2list(TPINIFILE,TRIM(YINIFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=NVERB) - TINIFILE_n => TPINIFILE !Necessary because TINIFILE was initially pointing to NULL - CALL IO_File_open(TPINIFILE) -END IF -! -!------------------------------------------------------------------------------- -! -!* 4. READ DESFM FILE -! --------------- -! -CALL READ_DESFM_n(KMI,TPINIFILE,YCONF,GFLAT,GUSERV,GUSERC, & - GUSERR,GUSERI,GUSECI,GUSERS,GUSERG,GUSERH,GUSECHEM,GUSECHAQ,& - GUSECHIC,GCH_PH,GCH_CONV_LINOX,GSALT,GDEPOS_SLT,GDUST, & - GDEPOS_DST, GCHTRANS, GORILAM, & - GDEPOS_AER, GLG, GPASPOL,GFIRE, & -#ifdef MNH_FOREFIRE - GFOREFIRE, & -#endif - GLNOX_EXPLICIT, & - GCONDSAMP,GBLOWSNOW, IRIMX,IRIMY,ISV, & - YTURB,YTOM,GRMC01,YRAD,YDCONV,YSCONV,YCLOUD,YELEC,YEQNSYS ) -! -!------------------------------------------------------------------------------- -! -!* 5. Initialize fieldlist -! -------------------- -! -IF (KMI==1) THEN !Do this only 1 time - IF ( CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG ' .OR. CPROGRAM=='SPEC ' & - .OR. ( CPROGRAM/='REAL ' .AND. CPROGRAM/='IDEAL ' ) ) THEN - CALL INI_FIELD_LIST() - END IF - - IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG ' .OR. CPROGRAM=='SPEC ' .OR. CPROGRAM=='MESONH') THEN - CALL INI_FIELD_SCALARS() - END IF -END IF -! -!------------------------------------------------------------------------------- -! -!* 6. READ in the LFI file SOME VARIABLES of MODD_CONF -! ------------------------------------------------ -! -IF (CPROGRAM=='MESONH' .OR. CPROGRAM=='SPAWN ') THEN - IF ((TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)>9) .OR. TPINIFILE%NMNHVERSION(1)>4) THEN - CALL IO_Field_read(TPINIFILE,'COUPLING',LCOUPLING) - IF (LCOUPLING) THEN - WRITE(ILUOUT,*) 'Error with the initial file' - WRITE(ILUOUT,*) 'The file',YINIFILE,' was created with LCOUPLING=.TRUE.' - WRITE(ILUOUT,*) 'You can not use it as initial file, only as coupling file' - WRITE(ILUOUT,*) 'Run PREP_REAL_CASE with LCOUPLING=.FALSE.' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SEG_n','') - ENDIF - ENDIF -END IF -! -! Read the storage type - CALL IO_Field_read(TPINIFILE,'STORAGE_TYPE',CSTORAGE_TYPE,IRESP) - IF (IRESP /= 0) THEN - WRITE(ILUOUT,FMT=9002) 'STORAGE_TYPE',IRESP -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SEG_n','') - END IF -IF (KMI == 1) THEN -! Read the geometry kind - CALL IO_Field_read(TPINIFILE,'CARTESIAN',LCARTESIAN) -! Read the thinshell approximation - CALL IO_Field_read(TPINIFILE,'THINSHELL',LTHINSHELL) -! - IF ((TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)>=6) .OR. TPINIFILE%NMNHVERSION(1)>4) THEN - CALL IO_Field_read(TPINIFILE,'L1D',L1D,IRESP) - IF (IRESP/=0) L1D=.FALSE. -! - CALL IO_Field_read(TPINIFILE,'L2D',L2D,IRESP) - IF (IRESP/=0) L2D=.FALSE. -! - CALL IO_Field_read(TPINIFILE,'PACK',LPACK,IRESP) - IF (IRESP/=0) LPACK=.TRUE. - ELSE - L1D=.FALSE. - L2D=.FALSE. - LPACK=.TRUE. - END IF - IF ((TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)>=10) .OR. TPINIFILE%NMNHVERSION(1)>4) THEN - CALL IO_Field_read(TPINIFILE,'LBOUSS',LBOUSS) - END IF -! -END IF -! -!------------------------------------------------------------------------------- -! -!* 7. READ EXSEG FILE -! --------------- -! We pass by arguments the informations read in DESFM descriptor to the -! routine which read related informations in the EXSEG descriptor in order to -! check coherence between both informations. -! -CALL IO_Field_read(TPINIFILE,'LOCEAN',LOCEAN,IRESP) -IF ( IRESP /= 0 ) LOCEAN = .FALSE. -! -CALL READ_EXSEG_n(KMI,TZFILE_DES,YCONF,GFLAT,GUSERV,GUSERC, & - GUSERR,GUSERI,GUSECI,GUSERS,GUSERG,GUSERH,GUSECHEM, & - GUSECHAQ,GUSECHIC,GCH_PH, & - GCH_CONV_LINOX,GSALT,GDEPOS_SLT,GDUST,GDEPOS_DST,GCHTRANS, & - GORILAM,GDEPOS_AER,GLG,GPASPOL,GFIRE, & -#ifdef MNH_FOREFIRE - GFOREFIRE, & -#endif - GLNOX_EXPLICIT, & - GCONDSAMP,GBLOWSNOW, IRIMX,IRIMY,ISV, & - YTURB,YTOM,GRMC01,YRAD,YDCONV,YSCONV,YCLOUD,YELEC,YEQNSYS, & - PTSTEP_ALL,CINIFILEPGD_n ) -! -IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG ' .OR. CPROGRAM=='SPEC ' & - .OR. CPROGRAM=='REAL ') THEN - CINIFILE_n = YINIFILE - CCPLFILE(:) = ' ' - NMODEL=1 - LSTEADYLS=.TRUE. -END IF -! -IF (CPROGRAM=='MESONH') THEN - HINIFILEPGD=CINIFILEPGD_n -END IF -!------------------------------------------------------------------------------- -! -!* 7. CLOSE FILES -! ------------ -! -IF (CPROGRAM=='MESONH') CALL IO_File_close(TZFILE_DES) -! -!------------------------------------------------------------------------------- -9002 FORMAT(/,'FATAL ERROR IN INI_SEG_n: pb to read ',A16,' IRESP=',I3) -! -END SUBROUTINE INI_SEG_n diff --git a/src/PHYEX/ext/ini_tke_eps.f90 b/src/PHYEX/ext/ini_tke_eps.f90 deleted file mode 100644 index a07160722..000000000 --- a/src/PHYEX/ext/ini_tke_eps.f90 +++ /dev/null @@ -1,179 +0,0 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ####################### - MODULE MODI_INI_TKE_EPS -! ####################### -INTERFACE -! - SUBROUTINE INI_TKE_EPS(HGETTKET,PTHVREF,PZZ, & - PUT,PVT,PTHT, & - PTKET,TPINITHALO3D_ll ) -! -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -CHARACTER (LEN=*), INTENT(IN) :: HGETTKET - ! character string indicating whether TKE must be - ! initialized or not -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! virtual potential - ! temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical height for - ! w-point -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PUT ! x-component of wind -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PVT ! y-component of wind -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTHT ! potential temperature -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTKET ! TKE fields -TYPE(LIST_ll), POINTER, INTENT(INOUT):: TPINITHALO3D_ll ! pointer for the list of fields - ! which must be communicated in INIT -! -END SUBROUTINE INI_TKE_EPS -! -END INTERFACE -! -END MODULE MODI_INI_TKE_EPS -! -! ################################################################### - SUBROUTINE INI_TKE_EPS(HGETTKET,PTHVREF,PZZ, & - PUT,PVT,PTHT, & - PTKET,TPINITHALO3D_ll ) -! ################################################################### -! -! -!! **** *INI_TKE* initializes by a 1D stationarized TKE equation the -!! values of TKE. A positivity control is made. The -!! dissipation of TKE is set to its minimum value. -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to initialize the values of the -! turbulence kinetic energy. The dissipation is intialized to its minimum -! value. -! -!!** METHOD -!! ------ -!! A diagnostic 1D equation for the TKE is used. The transport terms -!! are neglected. -!! -!! EXTERNAL -!! -------- -!! DZF ,MXF, MYF, MZM : Shuman operators -!! ADD3DFIELD_ll : add a field to 3D-list -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! MODD_CST : XG, XRV, XRD -!! MODD_CTURB : XLINI, XTKEMIN, XCED, XCMFS -!! MODD_PARAMETERS: JPVEXT -!! -!! REFERENCE -!! --------- -!! Book 2 of Documentation (routine INI_TKE) -!! Book 1 of Documentation (Chapter Turbulence) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart * INM and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original Jan 19, 1995 -!! Feb 13, 1995 (J. Cuxart) add EPS initialization -!! March 25, 1995 (J. Stein)add PZZ in the arguments -!! to compute a real gradient and allow RESTA conf. -!! Aug 10, 1998 (N. Asencio) add parallel code -!! May 2006 Remove KEPS -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -!! March 2021 (JL Redelsperger) Add Ocean LES case) -!! ------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_ARGSLIST_ll, ONLY: LIST_ll -USE MODD_CST, ONLY: XG, XALPHAOC -USE MODD_CTURB, ONLY: XCMFS -USE MODD_TURB_n, ONLY: XLINI, XCED, XTKEMIN, XCSHF -USE MODD_DYN_n, ONLY: LOCEAN -USE MODD_PARAMETERS, ONLY: JPVEXT -! -USE MODE_ll -! -USE MODI_SHUMAN, ONLY: DZF, MXF, MYF, MZM -! -IMPLICIT NONE -! -!* 0.1. declarations of arguments -! -CHARACTER (LEN=*), INTENT(IN) :: HGETTKET - ! character string indicating whether TKE must be - ! initialized or not -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! virtual potential - ! temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical height for - ! w-point -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PUT ! x-component of wind -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PVT ! y-component of wind -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTHT ! potential temperature -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTKET ! TKE field -TYPE(LIST_ll), POINTER, INTENT(INOUT):: TPINITHALO3D_ll ! pointer for the list of fields - ! which must be communicated in INIT -! -!* 0.2 Declaration of local variables -! -INTEGER :: IKB,IKE ! index value for the first and last inner - ! mass points -INTEGER :: JKK ! vertical loop index -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZDELTZ ! vertical - ! increment -! -! --------------------------------------------------------------------- -! -! -IKB=1+JPVEXT -IKE=SIZE(PTHT,3)-JPVEXT -! -!* 1. TKE DETERMINATION -! ----------------- -! -DO JKK=IKB-1,IKE - ZDELTZ(:,:,JKK) = PZZ(:,:,JKK+1)-PZZ(:,:,JKK) -END DO -ZDELTZ(:,:,IKE+1) = ZDELTZ(:,:,IKE) -! -IF (HGETTKET == 'INIT' ) THEN -! instant t - PTHT(:,:,IKB-1) = PTHT(:,:,IKB) - PUT(:,:,IKB-1) = PUT(:,:,IKB) - PVT(:,:,IKB-1) = PVT(:,:,IKB) - ! - PTHT(:,:,IKE+1) = PTHT(:,:,IKE) - PUT(:,:,IKE+1) = PUT(:,:,IKE) - PVT(:,:,IKE+1) = PVT(:,:,IKE) - ! - ! determines TKE - ! Equilibrium/Stationary/neutral 1D TKE equation - IF (LOCEAN) THEN - PTKET(:,:,:)=(XLINI**2/XCED)*( & - XCMFS*( DZF(MXF(MZM(PUT)))**2 & - +DZF(MYF(MZM(PVT)))**2) / ZDELTZ & - -(XG*XALPHAOC)*XCSHF*DZF(MZM(PTHT)) & - ) / ZDELTZ - ELSE - PTKET(:,:,:)=(XLINI**2/XCED)*( & - XCMFS*( DZF(MXF(MZM(PUT)))**2 & - +DZF(MYF(MZM(PVT)))**2) / ZDELTZ & - -(XG/PTHVREF)*XCSHF*DZF(MZM(PTHT)) & - ) / ZDELTZ - END IF - ! positivity control - WHERE (PTKET < XTKEMIN) PTKET=XTKEMIN - ! - ! - ! Add PTKET to TPINITHALO3D_ll list of fields updated at the - ! end of initialization - CALL ADD3DFIELD_ll ( TPINITHALO3D_ll, PTKET, 'INI_TKE_EPS::PTKET' ) -END IF -! -! -END SUBROUTINE INI_TKE_EPS diff --git a/src/PHYEX/ext/init_mnh.f90 b/src/PHYEX/ext/init_mnh.f90 deleted file mode 100644 index 4170ca68e..000000000 --- a/src/PHYEX/ext/init_mnh.f90 +++ /dev/null @@ -1,252 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ############### - SUBROUTINE INIT_MNH -! ############### -! -!!**** *INIT_MNH * - monitor to initialize the variables of the model -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to initialize all the variables -! used in the model temporal loop or in the post-processings -! -!!** METHOD -!! ------ -!! This initialization is separated in three parts : -!! 1. A part common to all models where : -!! - The output-listing file common to all models is opened. -!! - The physical constants are initialized. -!! - The other constants for all models are initialized. -!! 2. The treatment of descriptor files model by model : -!! The DESFM and EXSEG files are read and the EXSEG file is updated -!! 3. The sequential initialization of nested models : -!! The initial data fields are read in different files for each -!! model and variables which are not in these initial files are -!! deduced. -!! -!! -!! EXTERNAL -!! -------- -!! INI_CST : to initialize physical constants -!! INI_CTURB : to initialize for all models the constants used in the -!! turbulence scheme -!! INI_SEG_n : to read and update descriptor files -!! INI_SIZE : to initialize the sizes of the different models -!! INI_MODEL : to initialize each nested model -!! INI_PARA_ll: to build the ll data structures -!! GO_TOMODEL : displace the ll lists to the right nested model -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_PARAMETERS : JPMODELMAX -!! -!! Module MODD_CONF : NMODEL,NVERB -!! -!! REFERENCE -!! --------- -!! Book2 of documentation (routine INIT_MNH) -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 02/06/94 -!! J.Stein 05/01/95 add ini_cturb -!! J.P. Lafore 18/08/95 Time STEP change -!! J.P. Lafore 22/07/96 ZTSTEP_ALL introduction for nesting -!! V. Ducrocq 7/08/98 // -!! P. Jabouille 7/07/99 split ini_modeln in 2 parts+ cleaning -!! V. Masson 15/03/99 call to ini_data_cover -!! P.Jabouille 15/07/99 special initialisation for spawning -!! J.P Chaboureau 2015 add ini_spectre_n -!! J.Escobar 2/03/2016 bypass , reset NHALO=1 for SPAWNING -!! 06/2016 (G.Delautier) phasage surfex 8 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -USE MODD_CONF -USE MODD_DYN_n, ONLY: CPRESOPT, NITR ! only for spawning purpose -USE MODD_IO, ONLY: TFILE_OUTPUTLISTING, TPTR2FILE -USE MODD_LBC_n, ONLY: CLBCX,CLBCY ! only for spawning purpose -USE MODD_LUNIT -USE MODD_LUNIT_n -USE MODD_MNH_SURFEX_n -USE MODD_PARAMETERS -USE MODD_NSV, ONLY: NSV_ASSOCIATE -! -use mode_field, only: Alloc_field_scalars, Fieldlist_goto_model -USE MODE_IO_FILE, ONLY: IO_File_open -USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_add2list -USE MODE_ll -USE MODE_MODELN_HANDLER -USE MODE_SPLITTINGZ_ll -! -USE MODE_INI_CST, ONLY: INI_CST -USE MODI_INI_MODEL_n -USE MODI_INI_SEG_n -USE MODI_INI_SIZE_n -USE MODI_INI_SIZE_SPAWN -USE MODI_INI_SPECTRE_n -USE MODI_READ_ALL_NAMELISTS -USE MODI_RESET_EXSEG -! -IMPLICIT NONE -! -!* 0.1 Local variables -! -INTEGER :: JMI ! Loop index -CHARACTER(LEN=28),DIMENSION(JPMODELMAX) :: YINIFILEPGD -INTEGER :: ILUOUT0,IRESP ! Logical unit number for - ! output-listing common - ! to all models and return - ! code of file management -REAL, DIMENSION(JPMODELMAX) :: ZTSTEP_ALL ! Time STEP of ALL models -INTEGER :: IINFO_ll ! return code of // routines -! -! Dummy pointers needed to correct an ifort Bug -CHARACTER(LEN=4), DIMENSION(:), POINTER :: DPTR_CLBCX,DPTR_CLBCY - -!------------------------------------------------------------------------------- -! -!* 1. INITIALIZATION COMMON TO ALL MODELS -! ------------------------------------ -! -!* 1.1 initialize // E/S and open output-listing file -! -! -IF (CPROGRAM/='REAL ') THEN - CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING0','OUTPUTLISTING','WRITE') - CALL IO_File_open(TLUOUT0) - !Set output file for PRINT_MSG - TFILE_OUTPUTLISTING => TLUOUT0 - ILUOUT0=TLUOUT0%NLU -ELSE - ILUOUT0=TLUOUT0%NLU -END IF -! -WRITE(UNIT=ILUOUT0,FMT="(50('*'),/,'*',48X,'*',/, & - & 7('*'),10X, ' MESO-NH MODEL ',10X,8('*'),/, & - & '*',48X,'*',/, & - & 7('*'),12X,' CNRM - LA ',12X,8('*'),/, & - & '*',48X,'*',/, 50('*'))") -! -CALL NSV_ASSOCIATE() -! -! -!* 1.2 initialize physical constants -! -CALL INI_CST -! -! -!* 1.3 initialize constants for the turbulence scheme -! -!Now done in ini_modeln -! -! -!------------------------------------------------------------------------------- -! -!* 2. READ AND UPDATE DESCRIPTOR FILES -! -------------------------------- -! -IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG ' .OR. CPROGRAM=='SPEC ' .OR. CPROGRAM=='MESONH') THEN - CALL ALLOC_FIELD_SCALARS() -END IF -! -CALL GOTO_MODEL(1) -CALL INI_SEG_n(1,LUNIT_MODEL(1)%TINIFILE,YINIFILEPGD(1),ZTSTEP_ALL) -! -DO JMI=2,NMODEL - CALL GOTO_MODEL(JMI) - CALL INI_SEG_n(JMI,LUNIT_MODEL(JMI)%TINIFILE,YINIFILEPGD(JMI),ZTSTEP_ALL) -END DO -! -IF (CPROGRAM=='SPAWN ') THEN - !bypass - NHALO = 1 -END IF -! -IF (CPROGRAM=='DIAG') CALL RESET_EXSEG() -! -!------------------------------------------------------------------------------- -! -! -!* 3. INITIALIZE EACH MODEL SIZES AND DEPENDENCY -! ------------------------------------------ -! -DO JMI=1,NMODEL - CALL GOTO_MODEL(JMI) - CALL INI_SIZE_n(JMI,LUNIT_MODEL(JMI)%TINIFILE,YINIFILEPGD(JMI)) -END DO -! -IF (CPROGRAM=='SPAWN ') THEN - DPTR_CLBCX=>CLBCX - DPTR_CLBCY=>CLBCY - CALL INI_PARAZ_ll(IINFO_ll) - CALL INI_SIZE_SPAWN(DPTR_CLBCX,DPTR_CLBCY,CPRESOPT,NITR,LUNIT_MODEL(1)%TINIFILE) -END IF -! -! INITIALIZE data structures of ComLib -! -!JUAN CALL INI_PARA_ll(IINFO_ll) -CALL INI_PARAZ_ll(IINFO_ll) -! -!------------------------------------------------------------------------------- -! -! -! Allocations of Surfex Types -CALL SURFEX_ALLOC_LIST(NMODEL) -! -DO JMI=1,NMODEL - YSURF_CUR => YSURF_LIST(JMI) -! - IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='REAL ') THEN - CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.) - ELSE - CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','ALL',.TRUE.) - ENDIF -ENDDO -! -! -!------------------------------------------------------------------------------- -! -!* 4. INITIALIZE EACH MODEL -! --------------------- -! -DO JMI=1,NMODEL - CALL GO_TOMODEL_ll(JMI,IINFO_ll) - CALL GOTO_MODEL(JMI) - IF (CPROGRAM/='SPEC ') THEN - CALL INI_MODEL_n(JMI,LUNIT_MODEL(JMI)%TINIFILE) - !Call necessary to update the TFIELDLIST pointers to the data - CALL FIELDLIST_GOTO_MODEL(JMI,JMI) - ELSE - CALL INI_SPECTRE_n(JMI,LUNIT_MODEL(JMI)%TINIFILE) - END IF -END DO -! -!------------------------------------------------------------------------------- -! -!* 5. WRITE MESSAGE ON OUTPUT-LISTING -! ------------------------------- -! -IF (NVERB >= 5) THEN - WRITE(UNIT=ILUOUT0,FMT="(50('*'),/,'*',48X,'*',/, & - & '*',10X,' INITIALIZATION TERMINATED',10X,'*',/, & - & '*',48X,'*',/,50('*'))") -END IF -! -!------------------------------------------------------------------------------- -! -! -END SUBROUTINE INIT_MNH diff --git a/src/PHYEX/ext/ion_attach_elec.f90 b/src/PHYEX/ext/ion_attach_elec.f90 deleted file mode 100644 index cd0fcf1c3..000000000 --- a/src/PHYEX/ext/ion_attach_elec.f90 +++ /dev/null @@ -1,631 +0,0 @@ -!MNH_LIC Copyright 2010-2020 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ############################ - MODULE MODI_ION_ATTACH_ELEC -! ############################ -! -INTERFACE - SUBROUTINE ION_ATTACH_ELEC(KTCOUNT, KRR, PTSTEP, PRHODREF, & - PRHODJ,PSVS, PRS, PTHT, PCIT, PPABST, PEFIELDU, & - PEFIELDV, PEFIELDW, GATTACH, PTOWN, PSEA ) - - -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference dry air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry air density* Jacobian -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable vol. source -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable vol. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta (K) at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine ice n.c. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEFIELDU, PEFIELDV, PEFIELDW - ! Electric field components -LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: GATTACH !Recombination and - !Attachment if true -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! town fraction -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask - - END SUBROUTINE ION_ATTACH_ELEC -END INTERFACE -END MODULE MODI_ION_ATTACH_ELEC - - - -! ###################################################################### - SUBROUTINE ION_ATTACH_ELEC(KTCOUNT, KRR, PTSTEP, PRHODREF, & - PRHODJ,PSVS, PRS, PTHT, PCIT, PPABST, PEFIELDU, & - PEFIELDV, PEFIELDW, GATTACH, PTOWN, PSEA ) -! ###################################################################### - - -! -!!**** * - -!! -!! PURPOSE -!! ------- -!! This routine computes the ion capture by (or attachment to) hydrometeors -!! providing a source of charge for hydrometeors and a sink for positive -!! negative ion mixing ratio. It is assumed as resulting from both ionic -!! diffusion and conduction (electrical attraction). -!! -!! -!! METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! M. Chong *Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 2010 -!! Modifications: -!! J.Escobar : 18/12/2015 : Correction of bug in bound in // for NHALO <>1 -! P. Wautelet 03/2020: use the new data structures and subroutines for budgets -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -use modd_budget, only : lbudget_sv, NBUDGET_SV1, tbudgets -USE MODD_CONF, ONLY: CCONF -USE MODD_CST -USE MODD_ELEC_DESCR -USE MODD_ELEC_n -USE MODD_ELEC_PARAM -USE MODD_NSV, ONLY: NSV_ELECBEG, NSV_ELEC -USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT -USE MODD_RAIN_ICE_DESCR_n -USE MODD_RAIN_ICE_PARAM_n -USE MODD_REF, ONLY: XTHVREFZ - -use mode_budget, only: Budget_store_init, Budget_store_end -use mode_tools_ll, only: GET_INDICE_ll - -USE MODI_MOMG - -IMPLICIT NONE -! -! 0.1 Declaration of arguments -! -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference dry air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry air density* Jacobian -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable vol. source -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable vol. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta (K) at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine ice n.c. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEFIELDU, PEFIELDV, PEFIELDW - ! Electric field components -LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: GATTACH !Recombination and - !Attachment if true -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! town fraction -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask - -! -! -! 0.2 Declaration of local variables -! -REAL, DIMENSION(:), ALLOCATABLE :: ZT ! Temperature (K) -REAL, DIMENSION(:), ALLOCATABLE :: ZCONC, ZVIT, ZRADIUS ! Number concentration - !fallspeed, radius -REAL :: ZCQD, ZCDIF ! computed coefficients -INTEGER, DIMENSION(SIZE(PTHT)) :: IGI, IGJ, IGK ! Valid grid index -INTEGER :: IVALID ! Nb of valid grid -INTEGER :: IIB ! Beginning (B) and end (E) grid points -INTEGER :: IIE ! along i axis, -INTEGER :: IJB ! j axis, -INTEGER :: IJE ! -INTEGER :: IKB ! and k axis -INTEGER :: IKE ! - -INTEGER :: II, IJ, IK, JRR, JSV ! Loop index for variable -INTEGER :: ITYPE ! Hydrometeor category (2: cloud, 3: rain, - ! 4: ice crystal, 5: snow, 6: graupel, 7: hail) -REAL :: ZCOMB ! Recombination -! -! -!------------------------------------------------------------------------------- -if ( lbudget_sv ) then - do jrr = 1, nsv_elec - call Budget_store_init( tbudgets( NBUDGET_SV1 - 1 + nsv_elecbeg - 1 + jrr), 'NEUT', psvs(:, :, :, jrr) ) - end do -end if -! -!* 1. COMPUTE THE ION RECOMBINATION and TEMPERATURE -! --------------------------------------------- -! -! -ZCQD = 4 * XPI * XEPSILON * XBOLTZ / XECHARGE -ZCDIF = XBOLTZ /XECHARGE -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB = 1 + JPVEXT -IKE = SIZE(PTHT,3) - JPVEXT -! -!* 1.1 Add Ion Recombination source (PSVS in 1/(m3.s)) -! and count and localize valid grid points for ion source terms -! -IVALID = 0 -DO IK = IKB, IKE - DO IJ = IJB, IJE - DO II = IIB, IIE - IF (GATTACH(II,IJ,IK)) THEN -! Recombination - ZCOMB = XIONCOMB * (PSVS(II,IJ,IK,1)*PTSTEP) * & - (PSVS(II,IJ,IK,NSV_ELEC)*PTSTEP) * & - PRHODREF(II,IJ,IK) / PRHODJ(II,IJ,IK) - ZCOMB = MIN(ZCOMB, PSVS(II,IJ,IK,1), PSVS(II,IJ,IK,NSV_ELEC)) - PSVS(II,IJ,IK,1) = PSVS(II,IJ,IK,1) - ZCOMB - PSVS(II,IJ,IK,NSV_ELEC) = PSVS(II,IJ,IK,NSV_ELEC) - ZCOMB -! Counting - IVALID = IVALID + 1 - IGI(IVALID) = II - IGJ(IVALID) = IJ - IGK(IVALID) = IK - END IF - ENDDO - ENDDO -ENDDO -! -!* 1.2 Compute the temperature -! -IF( IVALID /= 0 ) THEN - ALLOCATE (ZT(IVALID)) - DO II = 1, IVALID - ZT(II) = PTHT(IGI(II),IGJ(II),IGK(II)) * & - (PPABST(IGI(II),IGJ(II),IGK(II)) / XP00) ** (XRD / XCPD) - ENDDO -END IF -! -! -!* 2. TRANSFORM VOLUM. SOURCE TERMS INTO MIXING RATIO -! FOR WATER SPECIES, AND VOLUMIC CONTENT FOR ELECTRIC VARIABLES -! ------------------------------------------------------------- -! -DO JRR = 1, KRR - PRS(:,:,:,JRR) = PRS(:,:,:,JRR) *PTSTEP / PRHODJ(:,:,:) -ENDDO -! -DO JSV = 1, NSV_ELEC - PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) *PTSTEP *PRHODREF(:,:,:) / PRHODJ(:,:,:) -ENDDO -! -! -!* 3. COMPUTE ATTACHMENT DUE TO ION DIFFUSION AND CONDUCTION -! ------------------------------------------------------ -! -! Attachment to cloud droplets, rain, cloud ice, snow, graupel, -! and hail (optional) -! -! -IF( IVALID /= 0 ) THEN -! -!* 3.1 Attachment to cloud droplets -! - ALLOCATE (ZCONC(IVALID)) - ALLOCATE (ZVIT (IVALID)) - ALLOCATE (ZRADIUS(IVALID)) - - ITYPE = 2 - IF (PRESENT(PSEA)) THEN - CALL HYDROPARAM (IGI, IGJ, IGK, ZCONC, ZVIT, ZRADIUS, ITYPE, PSEA, PTOWN) - ELSE - CALL HYDROPARAM (IGI, IGJ, IGK, ZCONC, ZVIT, ZRADIUS, ITYPE) - ENDIF -! - CALL DIFF_COND (IGI, IGJ, IGK, PSVS(:,:,:,1), PSVS(:,:,:,NSV_ELEC), & - PSVS(:,:,:,ITYPE)) -! -!* 3.2 Attachment to raindrops, ice crystals, snow, graupel, -! and hail (if activated) -! - DO ITYPE = 3, KRR - CALL HYDROPARAM (IGI, IGJ, IGK, ZCONC, ZVIT, ZRADIUS, ITYPE) -! - CALL DIFF_COND (IGI, IGJ, IGK, PSVS(:,:,:,1), PSVS(:,:,:,NSV_ELEC), & - PSVS(:,:,:,ITYPE)) - END DO -! - DEALLOCATE (ZCONC, ZVIT, ZRADIUS) - DEALLOCATE (ZT) -ENDIF -! -! -!* 4. RETURN TO VOLUMETRIC SOURCE (Prognostic units) -! --------------------------- -! -DO JRR = 1, KRR - PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * PRHODJ(:,:,:) / PTSTEP -ENDDO -! -DO JSV = 1, NSV_ELEC - PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) * PRHODJ(:,:,:) / (PTSTEP * PRHODREF(:,:,:)) -ENDDO -! -! -!* 5. BUDGET -! ------ -! -if ( lbudget_sv ) then - do jrr = 1, nsv_elec - call Budget_store_end( tbudgets( NBUDGET_SV1 - 1 + nsv_elecbeg - 1 + jrr), 'NEUT', psvs(:, :, :, jrr) ) - end do -end if -! -!------------------------------------------------------------------------------ -! -CONTAINS -! -!------------------------------------------------------------------------------ -! - SUBROUTINE HYDROPARAM (IGRIDX, IGRIDY, IGRIDZ, ZCONC, & - ZVIT, ZRADIUS, ITYPE, PSEA, PTOWN) -! -! Purpose : Compute in regions of valid grid points (IGRIDX, IGRIDY, IGRIDZ) -! the hydrometeor parameters: concentration (ZCONC), -! fallspeed (ZVIT), -! and mean radius (ZRADIUS) -! involved in the evaluation of ion attachment -! -! -!* 0. DECLARATIONS -! ------------ -IMPLICIT NONE -! -!* 0.1 declaration of dummy arguments -! -INTEGER, DIMENSION(:), INTENT(IN) :: IGRIDX, IGRIDY, IGRIDZ ! Index of - ! valid gridpoints -INTEGER, INTENT(IN) :: ITYPE ! Hydrometeor category - ! ITYPE= 2: cloud, 3: rain, 4: ice, 5: snow, 6: graupel, 7: hail -REAL, DIMENSION(:), INTENT(INOUT) :: ZCONC, ZVIT, ZRADIUS -! Number concentration, fallspeed, radius -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! town fraction -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask -! -!* 0.2 declaration of local variables -! -REAL :: ZCONC1, ZCONC2 ! for cloud -REAL :: ZLBC -REAL :: ZFSEDC -REAL :: ZRAY -REAL :: ZEXP1, ZEXP2, ZMOM1, ZMOM2 -REAL :: ZVCOEF, ZRHO00, ZLBI -REAL :: ZLAMBDA -INTEGER :: JI, JJ, JK, IV -! -! -ZCONC(:) = 0. -ZVIT (:) = 0. -ZRADIUS(:) = 0. -! -SELECT CASE (ITYPE) -! -!* 1. PARAMETERS FOR CLOUD -! -------------------- - CASE (2) -! - IF (PRESENT(PSEA)) THEN - - ZMOM1 = 0.5*MOMG(XALPHAC,XNUC,1.) - ZMOM2 = 0.5*MOMG(XALPHAC2,XNUC2,1.) - DO IV = 1, IVALID - JI = IGRIDX(IV) - JJ = IGRIDY(IV) - JK = IGRIDZ(IV) - IF( PRS(JI, JJ, JK, 2)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(2) .AND. & - PSVS(JI, JJ, JK, 2) /=0. ) THEN - ZCONC1 = PSEA(JI,JJ) * XCONC_SEA + (1. - PSEA(JI,JJ)) * XCONC_LAND - ZLBC = PSEA(JI,JJ) * XLBC(2) + (1. - PSEA(JI,JJ)) * XLBC(1) - ZFSEDC = PSEA(JI,JJ) * XFSEDC(2) + (1. - PSEA(JI,JJ)) * XFSEDC(1) - ZFSEDC = MAX(MIN(XFSEDC(1),XFSEDC(2)), ZFSEDC) - ZCONC2 = (1. - PTOWN(JI,JJ)) * ZCONC1 + PTOWN(JI,JJ) * XCONC_URBAN - ZRAY = (1. - PSEA(JI,JJ)) * ZMOM1 + PSEA(JI,JJ) * ZMOM2 - ZCONC (IV) = ZCONC2 ! Number concentration - ZLAMBDA = (ZLBC *ZCONC2 / (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,2)))**XLBEXC - ZRADIUS (IV) = ZRAY / ZLAMBDA - ZVIT (IV) = XCC * ZFSEDC * ZLAMBDA**(-XDC) * & - PRHODREF(JI,JJ,JK)**(-XCEXVT) - END IF - ENDDO - ELSE - ZRAY = 0.5*MOMG(XALPHAC,XNUC,1.) - ZLBC = XLBC(1) * XCONC_LAND - DO IV = 1, IVALID - JI = IGRIDX(IV) - JJ = IGRIDY(IV) - JK = IGRIDZ(IV) - IF( PRS(JI, JJ, JK, 2)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(2) .AND. & - PSVS(JI, JJ, JK, 2) /=0. ) THEN - ZCONC (IV) = XCONC_LAND ! Number concentration - ZLAMBDA = (ZLBC / (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,2)))**XLBEXC - ZRADIUS (IV) = ZRAY / ZLAMBDA - ZVIT (IV) = XCC * XFSEDC(1) * ZLAMBDA**(-XDC) * & - PRHODREF(JI,JJ,JK)**(-XCEXVT) - END IF - ENDDO - END IF -! -! -!* 2. PARAMETERS FOR RAIN -! ------------------- - CASE (3) - ZEXP1 = XEXSEDR - 1. - ZEXP2 = ZEXP1 - XCEXVT -! - DO IV = 1, IVALID - JI = IGRIDX(IV) - JJ = IGRIDY(IV) - JK = IGRIDZ(IV) - IF( PRS(JI, JJ, JK, 3)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(3) .AND. & - PSVS(JI, JJ, JK, 3) /=0. ) THEN - ZLAMBDA = XLBR * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,3))**XLBEXR - ZRADIUS (IV) = 0.5 / ZLAMBDA - ZCONC (IV) = XCCR / ZLAMBDA - ZVIT (IV) = XFSEDR * PRHODREF(JI,JJ,JK)**ZEXP2 & - * PRS(JI,JJ,JK,3)**ZEXP1 - END IF - ENDDO -! -! -!* 3. PARAMETERS FOR ICE -! ------------------ -! - CASE (4) -! - ZRAY = 0.5*MOMG(XALPHAI,XNUI,1.) - ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB)) -! ZVCOEF= XC_I * (GAMMA(XNUI+(XBI+XDI)/XALPHAI) / GAMMA(XNUI+XBI/XALPHAI)) & -! * ZRHO00**XCEXVT -! Computations for Columns (see ini_rain_ice_elec.f90) - ZVCOEF = 2.1E5 * MOMG(XALPHAI,XNUI, 3.285) / MOMG(XALPHAI,XNUI, 1.7) & - * ZRHO00**XCEXVT - ZLBI = (2.14E-3 * MOMG(XALPHAI,XNUI,1.7)) **0.588235 - - DO IV = 1, IVALID - JI = IGRIDX(IV) - JJ = IGRIDY(IV) - JK = IGRIDZ(IV) - IF( PRS(JI, JJ, JK, 4)/PRHODREF(JI, JJ, JK) > XRTMIN_ELEC(4) .AND. & - PSVS(JI, JJ, JK, 4) /=0.) THEN - ZCONC (IV) = XFCI * PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,4) * & - MAX(0.05E6, -0.15319E6 - 0.021454E6 * & - ALOG(PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,4)))**3 - ZLAMBDA = ZLBI * (ZCONC(IV) / (PRHODREF(JI,JJ,JK) * & - PRS(JI,JJ,JK,4)))**0.588235 - ZRADIUS (IV) = ZRAY / ZLAMBDA - ZVIT (IV) = ZVCOEF * ZLAMBDA**(-1.585) * & !(-XDI) * & - PRHODREF(JI,JJ,JK)**(-XCEXVT) - END IF - ENDDO -! -! -!* 4. PARAMETERS FOR SNOW -! ------------------- -! - CASE (5) -! - ZEXP1 = XEXSEDS - 1. - ZEXP2 = ZEXP1 - XCEXVT -! - DO IV = 1, IVALID - JI = IGRIDX(IV) - JJ = IGRIDY(IV) - JK = IGRIDZ(IV) - IF( PRS(JI, JJ, JK, 5)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(5) .AND. & - PSVS(JI, JJ, JK, 5) /=0. ) THEN - ZLAMBDA = XLBS * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,5))**XLBEXS - ZRADIUS (IV) = 0.5 / ZLAMBDA - ZCONC (IV) = XCCS * ZLAMBDA**XCXS - ZVIT (IV) = XFSEDS * PRHODREF(JI,JJ,JK)**ZEXP2 & - * PRS(JI,JJ,JK,5)**ZEXP1 - END IF - ENDDO -! -! -!* 5. PARAMETERS FOR GRAUPEL -! ---------------------- -! - CASE (6) -! - ZEXP1 = XEXSEDG - 1. - ZEXP2 = ZEXP1 - XCEXVT -! - DO IV = 1, IVALID - JI = IGRIDX(IV) - JJ = IGRIDY(IV) - JK = IGRIDZ(IV) - IF( PRS(JI, JJ, JK, 6)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(6) .AND. & - PSVS(JI, JJ, JK, 6) /=0. ) THEN - ZLAMBDA = XLBG * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,6))**XLBEXG - ZRADIUS (IV) = 0.5 / ZLAMBDA - ZCONC (IV) = XCCG * ZLAMBDA**XCXG - ZVIT (IV) = XFSEDG * PRHODREF(JI,JJ,JK)**ZEXP2 & - * PRS(JI,JJ,JK,6)**ZEXP1 - END IF - ENDDO -! -! -!* 6. PARAMETERS FOR HAIL -! ------------------- -! - CASE (7) -! - ZEXP1 = XEXSEDH - 1. - ZEXP2 = ZEXP1-XCEXVT - ZRAY = 0.5*MOMG(XALPHAH, XNUH, 1.) -! - DO IV = 1, IVALID - JI = IGRIDX(IV) - JJ = IGRIDY(IV) - JK = IGRIDZ(IV) - IF( PRS(JI, JJ, JK, 7)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(7) .AND. & - PSVS(JI, JJ, JK, 7) /=0. ) THEN - ZLAMBDA = XLBH * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,7))**XLBEXH - ZRADIUS (IV) = ZRAY / ZLAMBDA - ZCONC (IV) = XCCG * ZLAMBDA**XCXG - ZVIT (IV) = XFSEDH * PRHODREF(JI,JJ,JK)**ZEXP2 & - * PRS(JI,JJ,JK,7)**ZEXP1 - END IF - ENDDO -! -END SELECT -! -END SUBROUTINE HYDROPARAM -! -!------------------------------------------------------------------------------ -! - SUBROUTINE DIFF_COND (IGRIDX, IGRIDY, IGRIDZ, PQPIS, PQNIS, PQVS) -! -! Purpose : Compute in regions of valid grid points (IGRIDX, IGRIDY, IGRIDZ) -! the attachment of positive (sink for PQPIS) and negative -! (sink for PQNIS) ions to the hydrometeor variable (charge -! source for PQVS) -! -! -!* 0. DECLARATIONS -! ------------ -IMPLICIT NONE -! -!* 0.1 declaration of dummy arguments -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQPIS ! Positive ion concentration -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQNIS ! Negative ion concentration -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQVS !Hydrom volumetric charge -INTEGER, DIMENSION(:), INTENT(IN) :: IGRIDX, IGRIDY, IGRIDZ ! Index of - ! valid gridpoints - -! -!* 0.2 declaration of local variables -! -INTEGER :: JI, JJ, JK, IV -REAL :: ZNC, ZRADI, ZVT ! Nb conc., radius, fallspeed of the hydrometeor category -REAL :: ZQ ! net particule charge -REAL :: ZX, ZFXP, ZFXN ! Limiting diffusion function ZFX = +/- ZX /(exp(+/-ZX) -1) -REAL :: ZDIFP, ZDPIDT_D ! Diffusion of positive ions -REAL :: ZDIFM, ZDNIDT_D ! Diffusion of negative ions -REAL :: ZDPIDT_C ! Conduction of positive ions -REAL :: ZDNIDT_C ! Conduction of negative ions -REAL :: ZDELPI, ZDELNI ! Total attachment of pos/neg ions -REAL :: ZEFIELD ! Electric field magnitude -REAL :: ZQBOUND ! Limit charge for conduction -! -! -!* 1. COMPUTE ION ATTACHMENT -! ---------------------- -! -DO IV = 1, IVALID - IF (ZCONC(IV) .NE. 0.) THEN - JI = IGRIDX(IV) - JJ = IGRIDY(IV) - JK = IGRIDZ(IV) -! - ZNC = ZCONC(IV) - ZRADI = ZRADIUS(IV) - ZVT = ZVIT(IV) -! -!* 1.0 Ion diffusion to a particle -! - ZDPIDT_D = 0. - ZDNIDT_D = 0. -! - ZQ = PQVS(JI,JJ,JK) / ZNC - ZX = ZQ / (ZCQD * ZRADI * ZT(IV)) -! - IF(ZX /= 0. .AND. ABS(ZX) <= 20.0) THEN - IF( ABS(ZX) < 1.0E-15) THEN - ZFXP = 1. - ZFXN = 1. - ELSE - ZFXP = ZX / (EXP(ZX) - 1.) - ZFXN = -ZX / (EXP(-ZX) -1.) - ENDIF -! - ZDIFP = 4. * XPI * XMOBIL_POS(JI,JJ,JK) * ZCDIF * ZT(IV) - ZDPIDT_D = ZRADI * ZDIFP * PQPIS(JI,JJ,JK) * ZFXP * & - (1. + (2. * ZRADI * ZVT / ZDIFP)**0.5) -! - ZDIFM = 4. * XPI * XMOBIL_NEG(JI,JJ,JK) * ZCDIF * ZT(IV) - ZDNIDT_D = ZRADI * ZDIFM * PQNIS(JI,JJ,JK) * ZFXN * & - (1. + (2. * ZRADI * ZVT / ZDIFM)**0.5) -! - ZDELPI = MIN(ZDPIDT_D*PTSTEP*ZNC, PQPIS(JI,JJ,JK)) - ZDELNI = MIN(ZDNIDT_D*PTSTEP*ZNC, PQNIS(JI,JJ,JK)) -! - PQPIS(JI,JJ,JK) = PQPIS(JI,JJ,JK) - ZDELPI - PQNIS(JI,JJ,JK) = PQNIS(JI,JJ,JK) - ZDELNI - PQVS(JI,JJ,JK) = PQVS(JI,JJ,JK) + XECHARGE * (ZDELPI - ZDELNI) - ENDIF -! -! -!* 1.1 Ion conduction to a particle -! - ZDPIDT_C = 0. - ZDNIDT_C = 0. - ZEFIELD = SQRT(PEFIELDU(JI,JJ,JK)**2+PEFIELDV(JI,JJ,JK)**2+ & - PEFIELDW(JI,JJ,JK)**2) - ZQBOUND = 12. * XPI * XEPSILON * ZEFIELD * ZRADI**2 - ZQ = PQVS(JI,JJ,JK) / ZNC -! - IF (ABS(ZQ) < ZQBOUND) THEN - IF (PEFIELDW(JI,JJ,JK) > 0.) THEN ! opposite to fall velocity direction - ZDPIDT_C = 3. * XPI * ZRADI**2 * ZEFIELD * PQPIS(JI,JJ,JK) * & - XMOBIL_POS(JI,JJ,JK) * (1. - ZQ / ZQBOUND)**2 - IF (ZVT < XMOBIL_NEG(JI,JJ,JK)*ZEFIELD) THEN - ZDNIDT_C = 3. * XPI * ZRADI**2 * ZEFIELD * PQNIS(JI,JJ,JK) * & - XMOBIL_NEG(JI,JJ,JK) * (1. + ZQ / ZQBOUND)**2 - ELSE IF (ZQ > 0.) THEN - ZDNIDT_C = PQNIS(JI,JJ,JK) * XMOBIL_NEG(JI,JJ,JK) * ZQ / XEPSILON - ENDIF - ELSE IF (PEFIELDW(JI,JJ,JK) < 0.) THEN ! in the direction of fall veloc. - IF( ZVT < XMOBIL_POS(JI,JJ,JK)*ZEFIELD) THEN - ZDPIDT_C = 3. * XPI * ZRADI**2 * ZEFIELD * PQPIS(JI,JJ,JK) * & - XMOBIL_POS(JI,JJ,JK) * (1. - ZQ / ZQBOUND)**2 - ELSE IF (ZQ < 0.) THEN - ZDPIDT_C = -PQPIS(JI,JJ,JK) * XMOBIL_POS(JI,JJ,JK) * ZQ / XEPSILON - ENDIF - ZDNIDT_C = 3. * XPI * ZRADI**2 * ZEFIELD * PQNIS(JI,JJ,JK) * & - XMOBIL_NEG(JI,JJ,JK) * (1. + ZQ / ZQBOUND)**2 - ENDIF - ELSE IF (ZQ >= ZQBOUND) THEN - ZDPIDT_C = 0. - ZDNIDT_C = PQNIS(JI,JJ,JK) * XMOBIL_NEG(JI,JJ,JK) * ZQ / XEPSILON - ELSE IF (ZQ <= -ZQBOUND) THEN - ZDPIDT_C = -PQPIS(JI,JJ,JK) * XMOBIL_POS(JI,JJ,JK) * ZQ / XEPSILON - ZDNIDT_C = 0. - ENDIF -! - ZDELPI = MIN(ZDPIDT_C*PTSTEP*ZNC, PQPIS(JI,JJ,JK)) - ZDELNI = MIN(ZDNIDT_C*PTSTEP*ZNC, PQNIS(JI,JJ,JK)) -! - PQPIS(JI,JJ,JK) = PQPIS(JI,JJ,JK) - ZDELPI - PQNIS(JI,JJ,JK) = PQNIS(JI,JJ,JK) - ZDELNI - PQVS(JI,JJ,JK) = PQVS(JI,JJ,JK) + XECHARGE *(ZDELPI - ZDELNI) - END IF -ENDDO -! -END SUBROUTINE DIFF_COND -! -!----------------------------------------------------------------------------- -! -END SUBROUTINE ION_ATTACH_ELEC diff --git a/src/PHYEX/ext/latlon_to_xy.f90 b/src/PHYEX/ext/latlon_to_xy.f90 deleted file mode 100644 index d58793565..000000000 --- a/src/PHYEX/ext/latlon_to_xy.f90 +++ /dev/null @@ -1,225 +0,0 @@ -!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! #################### - PROGRAM LATLON_TO_XY -! #################### -! -!!**** *LATLON_TO_XY* program to compute x and y from latitude and longiude -!! for a MESONH file -!! -!! PURPOSE -!! ------- -!! -!! METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! module MODE_GRIDPROJ : contains projection routines -!! SM_LATLON and SM_XYHAT -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! module MODD_GRID : variables for projection: -!! XLAT0,XLON0,XRPK,XBETA -!! -!! module MODD_PGDDIM : specify the dimentions of the data arrays: -!! NPGDIMAX and NPGDJMAX -!! -!! module MODD_PGDGRID : grid variables: -!! XPGDLONOR,XPGDLATOR: longitude and latitude of the -!! origine point for the conformal projection. -!! XPGDXHAT,XPGDYHAT: position x,y in the conformal plane -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! -!! V. Masson Meteo-France -!! -!! MODIFICATION -!! ------------ -!! -!! Original 29/12/95 -!! -!! remove the USE MODI_DEFAULT_DESFM Apr. 17, 1996 (J.Stein) -!! no transfer of the file when closing Dec. 09, 1996 (V.Masson) -!! + changes call to READ_HGRID -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 10/04/2020: add missing initializations (LATLON_TO_XY was not working) -! J. Escobar 21/07/2020: missing modi_version -!---------------------------------------------------------------------------- -! -!* 0. DECLARATION -! ----------- -! -use MODD_CONF, only: CPROGRAM -USE MODD_DIM_n -USE MODD_GRID -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PGDDIM -USE MODD_PGDGRID -USE MODD_PARAMETERS -USE MODD_LUNIT -! -USE MODE_FIELD, ONLY: INI_FIELD_LIST -USE MODE_GRIDPROJ -USE MODE_IO, only: IO_Config_set, IO_Init -use MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -use MODE_INIT_ll, only: SET_DIM_ll, SET_JP_ll -USE MODE_MODELN_HANDLER, ONLY: GOTO_MODEL -USE MODE_POS, ONLY: POSNAM -use MODE_SPLITTINGZ_ll -! -USE MODE_INI_CST, ONLY: INI_CST -USE MODI_READ_HGRID -USE MODI_VERSION -! -USE MODN_CONFIO, ONLY: NAM_CONFIO -! -IMPLICIT NONE -! -!* 0.2 Declaration of variables -! ------------------------ -! -CHARACTER(LEN=28) :: YINIFILE ! name of input FM file -CHARACTER(LEN=28) :: YNAME ! true name of input FM file -CHARACTER(LEN=28) :: YDAD ! name of dad of input FM file -CHARACTER(LEN=2) :: YSTORAGE_TYPE -INTEGER :: INAM ! Logical unit for namelist file -INTEGER :: ILUOUT0 ! Logical unit for output file. -INTEGER :: IRESP ! Return-code if problem eraised. -REAL :: ZLAT ! input latitude -REAL :: ZLON ! input longitude -REAL :: ZXHAT ! output conformal coodinate x -REAL :: ZYHAT ! output conformal coodinate y -INTEGER :: II,IJ ! indexes of the point -REAL :: ZI,ZJ ! fractionnal indexes of the point -TYPE(TFILEDATA),POINTER :: TZINIFILE => NULL() -TYPE(TFILEDATA),POINTER :: TZNMLFILE => NULL() -LOGICAL :: GFOUND -! -!* 0.3 Declaration of namelists -! ------------------------ -! -NAMELIST/NAM_INIFILE/ YINIFILE -!---------------------------------------------------------------------------- -! - WRITE(*,*) '+---------------------------------+' - WRITE(*,*) '| program latlon_to_xy |' - WRITE(*,*) '+---------------------------------+' - WRITE(*,*) '' - WRITE(*,*) 'Warning: I and J are integer for flux points' -! -!* 1. Initializations -! --------------- -! -CALL GOTO_MODEL(1) -! -CALL VERSION() -! -CPROGRAM='LAT2XY' -! -CALL IO_Init() -! -CALL INI_CST() -! -CALL INI_FIELD_LIST() -! -!* 2. Reading of namelist file -! ------------------------ -! -! -CALL IO_File_add2list(TZNMLFILE,'LATLON2XY1.nam','NML','READ') -CALL IO_File_open(TZNMLFILE) -INAM=TZNMLFILE%NLU -! -CALL POSNAM( TZNMLFILE, 'NAM_INIFILE', GFOUND ) -IF (GFOUND) THEN - READ(UNIT=INAM,NML=NAM_INIFILE) -END IF -! -CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND ) -IF (GFOUND) THEN - READ(UNIT=INAM,NML=NAM_CONFIO) -END IF -! -CALL IO_Config_set() -CALL IO_File_close(TZNMLFILE) -! -!* 1. Opening of MESONH file -! ---------------------- -! -CALL IO_File_add2list(TZINIFILE,TRIM(YINIFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=2) -CALL IO_File_open(TZINIFILE) -! -CALL IO_Field_read(TZINIFILE,'IMAX', NIMAX) -CALL IO_Field_read(TZINIFILE,'JMAX', NJMAX) -NKMAX = 1 -CALL IO_Field_read(TZINIFILE,'JPHEXT',JPHEXT) -! -CALL SET_JP_ll(1,JPHEXT,JPVEXT,JPHEXT) -CALL SET_DIM_ll(NIMAX, NJMAX, NKMAX) -CALL INI_PARAZ_ll(IRESP) -! -!* 2. Reading of MESONH file -! ---------------------- -! -CALL READ_HGRID(0,TZINIFILE,YNAME,YDAD,YSTORAGE_TYPE) -! -!* 3. Closing of MESONH file -! ---------------------- -! -CALL IO_File_close(TZINIFILE) -! -!------------------------------------------------------------------------------- -! -!* 4. Reading of latitude and longitude -! --------------------------------- -! -DO - WRITE(*,*) '-------------------------------------------------------------------' - WRITE(*,*) 'please enter the latitude (in decimal degrees; quit or q to stop):' - READ(*,*,ERR=1) ZLAT - WRITE(*,*) 'please enter the longitude (in decimal degrees; quit or q to stop):' - READ(*,*,ERR=1) ZLON -! - CALL SM_XYHAT(XPGDLATOR,XPGDLONOR, & - ZLAT,ZLON,ZXHAT,ZYHAT) -! - WRITE(*,*) 'x=', ZXHAT - WRITE(*,*) 'y=', ZYHAT -! - II=MAX(MIN(COUNT(XPGDXHAT(:)<ZXHAT),NPGDIMAX+2*JPHEXT-1),1) - IJ=MAX(MIN(COUNT(XPGDYHAT(:)<ZYHAT),NPGDJMAX+2*JPHEXT-1),1) - ZI=(ZXHAT-XPGDXHAT(II))/(XPGDXHAT(II+1)-XPGDXHAT(II))+REAL(II) - ZJ=(ZYHAT-XPGDYHAT(IJ))/(XPGDYHAT(IJ+1)-XPGDYHAT(IJ))+REAL(IJ) -! - IF ( (ZI>=1.) .AND. (ZI<=NPGDIMAX+2*JPHEXT+1) & - .AND. (ZJ>=1.) .AND. (ZJ<=NPGDJMAX+2*JPHEXT+1) ) THEN - WRITE(*,*) 'I=',ZI - WRITE(*,*) 'J=',ZJ - ELSE - WRITE(*,*) 'point not in the domain' - WRITE(*,*) 'I=',ZI - WRITE(*,*) 'J=',ZJ - END IF -END DO -1 WRITE(*,*) 'good bye' -! -!------------------------------------------------------------------------------- -! -END PROGRAM LATLON_TO_XY diff --git a/src/PHYEX/ext/les_cloud_masksn.f90 b/src/PHYEX/ext/les_cloud_masksn.f90 deleted file mode 100644 index 10e9e4093..000000000 --- a/src/PHYEX/ext/les_cloud_masksn.f90 +++ /dev/null @@ -1,419 +0,0 @@ -!MNH_LIC Copyright 2006-2020 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ####################### - SUBROUTINE LES_CLOUD_MASKS_n -! ####################### -! -! -!!**** *LES_MASKS_n* initializes the masks for clouds -!! -!! -!! PURPOSE -!! ------- -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/2006 -!! P. Aumond 10/2009 Add possibility of user maskS -!! F.Couvreux 06/2011 : Conditional sampling -!! C.Lac 10/2014 : Correction on user masks -!! Q.Rodier 05/2019 : Missing parallelization -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_LES -USE MODD_LES_n -USE MODD_FIELD_n -USE MODD_CONF_n -USE MODD_CST , ONLY : XRD, XRV -USE MODD_NSV , ONLY : NSV_CSBEG, NSV_CSEND, NSV_CS -USE MODD_GRID_n , ONLY : XZHAT -USE MODD_CONDSAMP -! -USE MODE_ll -! -USE MODI_LES_VER_INT -USE MODI_LES_MEAN_ll -USE MODI_SHUMAN -! -IMPLICIT NONE -! -! -! 0.2 declaration of local variables -! -INTEGER :: JK ! vertical loop counter -INTEGER :: JI ! loop index on masks -INTEGER :: IIU, IJU,IIB,IJB,IIE,IJE ! hor. indices -INTEGER :: IKU, KBASE, KTOP ! ver. index -INTEGER :: IRR, IRRC, IRRR, IRRI, IRRS, IRRG ! moist variables indices -INTEGER :: JSV ! ind of scalars -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRT ! total water -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV ! Virtual potential temperature -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZW_LES ! W on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC_LES ! Rc on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRI_LES ! Ri on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRT_LES ! Rt on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV_LES ! thv on LES vertical grid -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_LES ! thv on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV_ANOM ! thv-thv_mean on LES vertical grid -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_ANOM ! sv-sv_mean -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSTD_SV -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSTD_SVTRES ! threshold of sv -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D,ZWORK3DB -REAL, DIMENSION(:), ALLOCATABLE :: ZWORK1D -REAL, DIMENSION(:), ALLOCATABLE :: ZMEANRC -! -! -!------------------------------------------------------------------------------- -! -CALL GET_DIM_EXT_ll('B',IIU,IJU) -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -IKU = SIZE(XTHT,3) -! -!------------------------------------------------------------------------------- -! -!* 1.0 Thermodynamical computations -! ---------------------------- -! -ALLOCATE(ZRT (IIU,IJU,IKU)) -ALLOCATE(ZMEANRC (IKU)) -ZRT = 0. -! -IRR=0 -IF (LUSERV) THEN - IRR=IRR+1 - ZRT = ZRT + XRT(:,:,:,1) -END IF -IF (LUSERC) THEN - IRR=IRR+1 - IRRC=IRR - ZRT = ZRT + XRT(:,:,:,IRRC) -END IF -IF (LUSERR) THEN - IRR=IRR+1 - IRRR=IRR - ZRT = ZRT + XRT(:,:,:,IRRR) -END IF -IF (LUSERI) THEN - IRR=IRR+1 - IRRI=IRR - ZRT = ZRT + XRT(:,:,:,IRRI) -END IF -IF (LUSERS) THEN - IRR=IRR+1 - IRRS=IRR - ZRT = ZRT + XRT(:,:,:,IRRS) -END IF -IF (LUSERG) THEN - IRR=IRR+1 - IRRG=IRR - ZRT = ZRT + XRT(:,:,:,IRRG) -END IF -! -! -!* computes fields on the LES grid in order to compute masks -! -ALLOCATE(ZTHV (IIU,IJU,IKU)) -ZTHV = XTHT -IF (LUSERV) ZTHV=ZTHV*(1.+XRV/XRD*XRT(:,:,:,1))/(1.+ZRT(:,:,:)) -! -!------------------------------------------------------------------------------- -! -!* 2.0 Fields on LES grid -! ------------------ -! -!* allocates fields on the LES grid -! -! -ALLOCATE(ZW_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZRC_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZRI_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZRT_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZTHV_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZTHV_ANOM(IIU,IJU,NLES_K)) -ALLOCATE(ZSV_LES (IIU,IJU,NLES_K,NSV_CS)) -ALLOCATE(ZSV_ANOM(IIU,IJU,NLES_K,NSV_CS)) -ALLOCATE(ZSTD_SV(NLES_K,NSV_CS)) -ALLOCATE(ZSTD_SVTRES(NLES_K,NSV_CS)) -ALLOCATE(ZWORK1D(NLES_K)) -ALLOCATE(ZWORK3D(IIU,IJU,IKU)) -ALLOCATE(ZWORK3DB(IIU,IJU,NLES_K)) -! -ZWORK1D=0. -ZWORK3D=0. -ZWORK3DB=0. -! -CALL LES_VER_INT(MZF(XWT), ZW_LES) -IF (NSV_CS>0) THEN - DO JSV=NSV_CSBEG, NSV_CSEND - CALL LES_VER_INT( XSVT(:,:,:,JSV), & - ZSV_LES(:,:,:,JSV-NSV_CSBEG+1) ) - END DO -END IF -IF (LUSERC) THEN - CALL LES_VER_INT(XRT(:,:,:,IRRC), ZRC_LES) -ELSE - ZRC_LES = 0. -END IF -IF (LUSERI) THEN - CALL LES_VER_INT(XRT(:,:,:,IRRI), ZRI_LES) -ELSE - ZRI_LES = 0. -END IF -CALL LES_VER_INT(ZRT, ZRT_LES) -CALL LES_VER_INT(ZTHV, ZTHV_LES) -CALL LES_ANOMALY_FIELD(ZTHV,ZTHV_ANOM) -! -IF (NSV_CS>0) THEN - DO JSV=NSV_CSBEG, NSV_CSEND - ZWORK3D(:,:,:)=XSVT(:,:,:,JSV) - CALL LES_ANOMALY_FIELD(ZWORK3D,ZWORK3DB) - ZSV_ANOM(:,:,:,JSV-NSV_CSBEG+1)=ZWORK3DB(:,:,:) - CALL LES_STDEV(ZWORK3DB,ZWORK1D) - ZSTD_SV(:,JSV-NSV_CSBEG+1)=ZWORK1D(:) - DO JK=1,NLES_K - ZSTD_SVTRES(JK,JSV-NSV_CSBEG+1)=SUM(ZSTD_SV(1:JK,JSV-NSV_CSBEG+1))/(1.*JK) - END DO - END DO -END IF -! -DEALLOCATE(ZTHV ) -DEALLOCATE(ZWORK3D) -DEALLOCATE(ZWORK3DB) -DEALLOCATE(ZWORK1D) -! -!------------------------------------------------------------------------------- -! -!* 3.0 Cloud mask -! ---------- -! -IF (LLES_NEB_MASK) THEN - CALL LES_ALLOCATE('LLES_CURRENT_NEB_MASK',(/IIU,IJU,NLES_K/)) - LLES_CURRENT_NEB_MASK (:,:,:) = .FALSE. - WHERE ((ZRC_LES(IIB:IIE,IJB:IJE,:)>1.E-6 .OR. ZRI_LES(IIB:IIE,IJB:IJE,:)>1.E-6) .AND. ZW_LES(IIB:IIE,IJB:IJE,:)>0.) - LLES_CURRENT_NEB_MASK (IIB:IIE,IJB:IJE,:) = .TRUE. - END WHERE -END IF -! -!------------------------------------------------------------------------------- -! -!* 4.0 Cloud core mask -! --------------- -! -IF (LLES_CORE_MASK) THEN - CALL LES_ALLOCATE('LLES_CURRENT_CORE_MASK',(/IIU,IJU,NLES_K/)) - LLES_CURRENT_CORE_MASK (:,:,:) = .FALSE. - WHERE ((ZRC_LES(IIB:IIE,IJB:IJE,:)>1.E-6 .OR. ZRI_LES(IIB:IIE,IJB:IJE,:)>1.E-6) & - .AND. ZW_LES(IIB:IIE,IJB:IJE,:)>0. .AND. ZTHV_ANOM(IIB:IIE,IJB:IJE,:)>0.) - LLES_CURRENT_CORE_MASK (IIB:IIE,IJB:IJE,:) = .TRUE. - END WHERE -END IF -! -!------------------------------------------------------------------------------- -! -!* 4.0 Conditional sampling mask -! ------------------------- -! -IF (LLES_CS_MASK) THEN -! - CALL LES_MEAN_ll(ZRC_LES, LLES_CURRENT_CART_MASK, ZMEANRC ) - CALL LES_ALLOCATE('LLES_CURRENT_CS1_MASK',(/IIU,IJU,NLES_K/)) - LLES_CURRENT_CS1_MASK(:,:,:) = .FALSE. - IF (NSV_CS >= 2) THEN - CALL LES_ALLOCATE('LLES_CURRENT_CS2_MASK',(/IIU,IJU,NLES_K/)) - LLES_CURRENT_CS2_MASK(:,:,:) = .FALSE. - IF (NSV_CS == 3) THEN - CALL LES_ALLOCATE('LLES_CURRENT_CS3_MASK',(/IIU,IJU,NLES_K/)) - LLES_CURRENT_CS3_MASK (:,:,:) = .FALSE. - END IF - END IF - -! -! Cloud top and base computation -! - KBASE=2 - KTOP=NLES_K - DO JK=2,NLES_K - IF ((ZMEANRC(JK) > 1.E-7) .AND. (KBASE == 2)) KBASE=JK - IF ((ZMEANRC(JK) < 1.E-7) .AND. (KBASE > 2) .AND. (KTOP == NLES_K)) & - KTOP=JK-1 - END DO -! - DO JSV=NSV_CSBEG, NSV_CSEND - DO JK=2,NLES_K - IF (ZSTD_SV(JK,JSV-NSV_CSBEG+1) < 0.05*ZSTD_SVTRES(JK,JSV-NSV_CSBEG+1)) & - ZSTD_SV(JK,JSV-NSV_CSBEG+1)=0.05*ZSTD_SVTRES(JK,JSV-NSV_CSBEG+1) -! case no cloud top and base - IF (JSV == NSV_CSBEG) THEN - IF ((KBASE ==2) .AND. (KTOP == NLES_K)) THEN - WHERE (ZW_LES(IIB:IIE,IJB:IJE,JK)>0. .AND. ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS1_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF -! -! case cloud top and base defined -! - IF (XZHAT(JK) < XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN - WHERE (ZW_LES(IIB:IIE,IJB:IJE,JK)>0. .AND. ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) *ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS1_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF -! - IF (XZHAT(JK) >= XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN - WHERE (ZW_LES(IIB:IIE,IJB:IJE,JK)>0. .AND. ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1) .AND. & - ZRC_LES(IIB:IIE,IJB:IJE,JK)>1.E-6) - LLES_CURRENT_CS1_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF - ELSE IF ( JSV == NSV_CSBEG + 1 ) THEN - IF ((KBASE ==2) .AND. (KTOP == NLES_K)) THEN - WHERE ( ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS2_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF -! -! case cloud top and base defined -! - IF (XZHAT(JK) < XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN - WHERE (ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) *ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS2_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF -! - IF (XZHAT(JK) >= XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN - WHERE (ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS2_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF -! - ELSE - IF ((KBASE ==2) .AND. (KTOP == NLES_K)) THEN - WHERE ( ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS3_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF -! -! case cloud top and base defined -! - IF (XZHAT(JK) < XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN - WHERE (ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) *ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS3_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF -! - IF (XZHAT(JK) >= XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN - WHERE (ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS3_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF - END IF - END DO - END DO -END IF -! -!------------------------------------------------------------------------------- -! -!* 5.0 User mask -! --------- -! -IF (LLES_MY_MASK) THEN - CALL LES_ALLOCATE('LLES_CURRENT_MY_MASKS',(/IIU,IJU,NLES_K,NLES_MASKS_USER/)) - DO JI=1,NLES_MASKS_USER - LLES_CURRENT_MY_MASKS (IIB:IIE,IJB:IJE,:,JI) = .FALSE. - END DO -! WHERE ((ZRC_LES + ZRI_LES) > 1.E-06) -! LLES_CURRENT_MY_MASKS (:,:,:,1) = .TRUE. -! END WHERE -! -END IF -!------------------------------------------------------------------------------- -! -DEALLOCATE(ZW_LES ) -DEALLOCATE(ZRC_LES ) -DEALLOCATE(ZRI_LES ) -DEALLOCATE(ZRT_LES ) -DEALLOCATE(ZTHV_LES ) -DEALLOCATE(ZSV_LES ) -DEALLOCATE(ZTHV_ANOM) -DEALLOCATE(ZSV_ANOM) -DEALLOCATE(ZSTD_SV) -DEALLOCATE(ZSTD_SVTRES) -!------------------------------------------------------------------------------- -DEALLOCATE(ZRT ) -DEALLOCATE(ZMEANRC) -!-------------------------------------------------------------------------------- -! -CONTAINS -! -!-------------------------------------------------------------------------------- -! -SUBROUTINE LES_ANOMALY_FIELD(PF,PF_ANOM) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PF -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PF_ANOM - -REAL, DIMENSION(SIZE(PF_ANOM,3)) :: ZMEAN -INTEGER :: JI, JJ - -CALL LES_VER_INT(PF, PF_ANOM) -CALL LES_MEAN_ll(PF_ANOM, LLES_CURRENT_CART_MASK, ZMEAN ) -DO JJ=1,SIZE(PF_ANOM,2) - DO JI=1,SIZE(PF_ANOM,1) - PF_ANOM(JI,JJ,:) = PF_ANOM(JI,JJ,:) - ZMEAN(:) - END DO -END DO - -END SUBROUTINE LES_ANOMALY_FIELD -!-------------------------------------------------------------------------------- -! -!-------------------------------------------------------------------------------- -! -SUBROUTINE LES_STDEV(PF_ANOM,PF_STD) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PF_ANOM -REAL, DIMENSION(:), INTENT(OUT) :: PF_STD - -REAL, DIMENSION(SIZE(PF_ANOM,1),SIZE(PF_ANOM,2),SIZE(PF_ANOM,3)) :: Z2 -INTEGER :: JK - -Z2(:,:,:)=PF_ANOM(:,:,:)*PF_ANOM(:,:,:) -CALL LES_MEAN_ll(Z2, LLES_CURRENT_CART_MASK, PF_STD ) -DO JK=1,SIZE(PF_ANOM,3) - PF_STD(JK)=SQRT(PF_STD(JK)) -END DO - -END SUBROUTINE LES_STDEV -!------------------------------------------------------------------------------- -! -END SUBROUTINE LES_CLOUD_MASKS_n diff --git a/src/PHYEX/ext/les_ini_timestepn.f90 b/src/PHYEX/ext/les_ini_timestepn.f90 deleted file mode 100644 index 98c5cd306..000000000 --- a/src/PHYEX/ext/les_ini_timestepn.f90 +++ /dev/null @@ -1,407 +0,0 @@ -!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ####################### -MODULE MODI_LES_INI_TIMESTEP_n -! ####################### -! -! -INTERFACE LES_INI_TIMESTEP_n -! - SUBROUTINE LES_INI_TIMESTEP_n(KTCOUNT) -! -INTEGER, INTENT(IN) :: KTCOUNT ! current model time-step -! -END SUBROUTINE LES_INI_TIMESTEP_n -! -END INTERFACE -! -END MODULE MODI_LES_INI_TIMESTEP_n - -! ############################## - SUBROUTINE LES_INI_TIMESTEP_n(KTCOUNT) -! ############################## -! -! -!!**** *LES_INI_TIMESTEP_n* initializes the LES variables for -!! the current time-step of model _n -!! -!! -!! PURPOSE -!! ------- -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson -!! -!! MODIFICATIONS -!! ------------- -!! Original 06/11/02 -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain -! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_NSV -USE MODD_LES -USE MODD_LES_n -USE MODD_FIELD_n -USE MODD_METRICS_n -USE MODD_REF_n -USE MODD_CONF_n -USE MODD_TIME_n -USE MODD_DYN_n -USE MODD_TIME -USE MODD_CONF -USE MODD_LES_BUDGET -! -use mode_datetime, only: Datetime_distance -USE MODE_ll -USE MODE_MODELN_HANDLER -! -USE MODI_LES_VER_INT -USE MODI_THL_RT_FROM_TH_R -USE MODI_LES_MEAN_ll -USE MODI_SHUMAN -! -USE MODI_SECOND_MNH -USE MODI_LES_CLOUD_MASKS_N -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -INTEGER, INTENT(IN) :: KTCOUNT ! current model time-step -! -! -! 0.2 declaration of local variables -! -INTEGER :: IXOR_ll, IYOR_ll ! origine point coordinates -! ! of current processor domain -! ! on model domain on all -! ! processors -INTEGER :: IIB_ll, IJB_ll ! SO point coordinates of -! ! current processor phys. domain -! ! on model domain on all -! ! processors -INTEGER :: IIE_ll, IJE_ll ! NE point coordinates of -! ! current processor phys. domain -! ! on model domain on all -! ! processors -INTEGER :: IIINF_MASK, IISUP_MASK ! cart. mask local proc. limits -INTEGER :: IJINF_MASK, IJSUP_MASK ! cart. mask local proc. limits -! -INTEGER :: JK ! vertical loop counter -INTEGER :: IIB, IJB, IIE, IJE ! hor. indices -INTEGER :: IIU, IJU ! hor. indices -INTEGER :: IKU ! ver. index -INTEGER :: IRR, IRRC, IRRR, IRRI, IRRS, IRRG ! moist variables indices -! -INTEGER :: JSV ! scalar variables counter -! -REAL :: ZTIME1, ZTIME2 ! CPU time counters -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHL ! theta_l -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRT ! total water -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZL ! Latent heat of vaporization -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCP ! Cp -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN ! Exner function -INTEGER :: IMI ! current model index -!------------------------------------------------------------------------------- -! -!* 1. Does current time-step is a LES time-step? -! ----------------------------------------- -! -LLES_CALL= .FALSE. -! -CALL SECOND_MNH(ZTIME1) -! -IF (NLES_TCOUNT==NLES_TIMES) LLES_CALL=.FALSE. -! -IF ( KTCOUNT>1 .AND. MOD (KTCOUNT-1,NLES_DTCOUNT)==0) LLES_CALL=.TRUE. -! -IF (.NOT. LLES_CALL) RETURN -! -CALL BUDGET_FLAGS(LUSERV, LUSERC, LUSERR, & - LUSERI, LUSERS, LUSERG, LUSERH ) -! -NLES_TCOUNT = NLES_TCOUNT + 1 -! -NLES_CURRENT_TCOUNT = NLES_TCOUNT -! -tles_dates(nles_tcount) = tdtcur -call Datetime_distance( tdtseg, tdtcur, xles_times(nles_tcount) ) -! -!* forward-in-time time-step -! -XCURRENT_TSTEP = XTSTEP -! -!------------------------------------------------------------------------------- -! -CALL GET_OR_ll ('B',IXOR_ll,IYOR_ll) -CALL GET_DIM_EXT_ll('B',IIU,IJU) -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -IIB_ll=IXOR_ll+IIB-1 -IJB_ll=IYOR_ll+IJB-1 -IIE_ll=IXOR_ll+IIE-1 -IJE_ll=IYOR_ll+IJE-1 -! -IKU = SIZE(XTHT,3) -! -IMI = GET_CURRENT_MODEL_INDEX() -! -!------------------------------------------------------------------------------- -! -!* 2. Definition of masks -! ------------------- -! -!* 2.1 Cartesian (sub-)domain (on local processor) -! ---------------------- -! -CALL LES_ALLOCATE('LLES_CURRENT_CART_MASK',(/IIU,IJU,NLES_K/)) -! -IIINF_MASK = MAX(IIB, NLESn_IINF(IMI)+JPHEXT-(IIB_ll-1-JPHEXT)) -IJINF_MASK = MAX(IJB, NLESn_JINF(IMI)+JPHEXT-(IJB_ll-1-JPHEXT)) -IISUP_MASK = MIN(IIE, NLESn_ISUP(IMI)+JPHEXT-(IIB_ll-1-JPHEXT)) -IJSUP_MASK = MIN(IJE, NLESn_JSUP(IMI)+JPHEXT-(IJB_ll-1-JPHEXT)) -! -! -LLES_CURRENT_CART_MASK(:,:,:) = .FALSE. -LLES_CURRENT_CART_MASK(IIINF_MASK:IISUP_MASK,IJINF_MASK:IJSUP_MASK,:) = .TRUE. -! -CLES_CURRENT_LBCX(:) = CLES_LBCX(:,IMI) -CLES_CURRENT_LBCY(:) = CLES_LBCY(:,IMI) -! -!------------------------------------------------------------------------------- -! -!* 3. Definition of LES vertical grid for this model -! ---------------------------------------------- -! -IF (CLES_LEVEL_TYPE=='Z') THEN - IF (ASSOCIATED(XCOEFLIN_CURRENT_LES)) CALL LES_DEALLOCATE('XCOEFLIN_CURRENT_LES') - IF (ASSOCIATED(NKLIN_CURRENT_LES )) CALL LES_DEALLOCATE('NKLIN_CURRENT_LES') - ! - CALL LES_ALLOCATE('XCOEFLIN_CURRENT_LES',(/IIU,IJU,NLES_K/)) - CALL LES_ALLOCATE('NKLIN_CURRENT_LES',(/IIU,IJU,NLES_K/)) - ! - XCOEFLIN_CURRENT_LES(:,:,:) = XCOEFLIN_LES(:,:,:) - NKLIN_CURRENT_LES (:,:,:) = NKLIN_LES (:,:,:) -END IF -! -!------------------------------------------------------------------------------- -! -!* 4. Definition of variables used in budgets for current model -! --------------------------------------------------------- -! -IF (LUSERC) THEN - ALLOCATE(XCURRENT_L_O_EXN_CP (IIU,IJU,IKU)) -ELSE - ALLOCATE(XCURRENT_L_O_EXN_CP (0,0,0)) -END IF -ALLOCATE(XCURRENT_RHODJ (IIU,IJU,IKU)) -! -!* coefficients for Th to Thl conversion -! -IF (LUSERC) THEN - ALLOCATE(ZL (IIU,IJU,IKU)) - ALLOCATE(ZEXN(IIU,IJU,IKU)) - ALLOCATE(ZCP (IIU,IJU,IKU)) - ! - !* Exner function - ! - ZEXN(:,:,:) = (XPABST/XP00)**(XRD/XCPD) - ! - !* Latent heat of vaporization - ! - ZL(:,:,:) = XLVTT + (XCPD-XCL) * (XTHT(:,:,:)*ZEXN(:,:,:)-XTT) - ! - !* heat capacity at constant pressure of the humid air - ! - ZCP(:,:,:) = XCPD - IRR=2 - ZCP(:,:,:) = ZCP(:,:,:) + XCPV * XRT(:,:,:,1) - ZCP(:,:,:) = ZCP(:,:,:) + XCL * XRT(:,:,:,2) - IF (LUSERR) THEN - IRR=IRR+1 - ZCP(:,:,:) = ZCP(:,:,:) + XCL * XRT(:,:,:,IRR) - END IF - IF (LUSERI) THEN - IRR=IRR+1 - ZCP(:,:,:) = ZCP(:,:,:) + XCI * XRT(:,:,:,IRR) - END IF - IF (LUSERS) THEN - IRR=IRR+1 - ZCP(:,:,:) = ZCP(:,:,:) + XCI * XRT(:,:,:,IRR) - END IF - IF (LUSERG) THEN - IRR=IRR+1 - ZCP(:,:,:) = ZCP(:,:,:) + XCI * XRT(:,:,:,IRR) - END IF - IF (LUSERH) THEN - IRR=IRR+1 - ZCP(:,:,:) = ZCP(:,:,:) + XCI * XRT(:,:,:,IRR) - END IF - ! - !* L / (Exn * Cp) - ! - XCURRENT_L_O_EXN_CP(:,:,:) = ZL(:,:,:) / ZEXN(:,:,:) / ZCP(:,:,:) - ! - DEALLOCATE(ZL ) - DEALLOCATE(ZEXN) - DEALLOCATE(ZCP ) -END IF -! -!* other initializations -! -XCURRENT_RHODJ=XRHODJ -! -LCURRENT_USERV=LUSERV -LCURRENT_USERC=LUSERC -LCURRENT_USERR=LUSERR -LCURRENT_USERI=LUSERI -LCURRENT_USERS=LUSERS -LCURRENT_USERG=LUSERG -LCURRENT_USERH=LUSERH -! -NCURRENT_RR = NRR -! -ALLOCATE(XCURRENT_RUS (IIU,IJU,IKU)) -ALLOCATE(XCURRENT_RVS (IIU,IJU,IKU)) -ALLOCATE(XCURRENT_RWS (IIU,IJU,IKU)) -ALLOCATE(XCURRENT_RTHS (IIU,IJU,IKU)) -ALLOCATE(XCURRENT_RTKES(IIU,IJU,IKU)) -ALLOCATE(XCURRENT_RRS (IIU,IJU,IKU,NRR)) -ALLOCATE(XCURRENT_RSVS (IIU,IJU,IKU,NSV)) -ALLOCATE(XCURRENT_RTHLS(IIU,IJU,IKU)) -ALLOCATE(XCURRENT_RRTS (IIU,IJU,IKU)) -! -XCURRENT_RUS =XRUS -XCURRENT_RVS =XRVS -XCURRENT_RWS =XRWS -XCURRENT_RTHS =XRTHS -XCURRENT_RTKES=XRTKES -XCURRENT_RRS =XRRS -XCURRENT_RSVS =XRSVS -CALL THL_RT_FROM_TH_R(LUSERV, LUSERC, LUSERR, & - LUSERI, LUSERS, LUSERG, LUSERH, & - XCURRENT_L_O_EXN_CP, & - XCURRENT_RTHS, XCURRENT_RRS, & - XCURRENT_RTHLS, XCURRENT_RRTS ) - -ALLOCATE(X_LES_BU_RES_KE (NLES_K,NLES_TOT)) -ALLOCATE(X_LES_BU_RES_WThl (NLES_K,NLES_TOT)) -ALLOCATE(X_LES_BU_RES_Thl2 (NLES_K,NLES_TOT)) -ALLOCATE(X_LES_BU_SBG_Tke (NLES_K,NLES_TOT)) -ALLOCATE(X_LES_BU_RES_WRt (NLES_K,NLES_TOT)) -ALLOCATE(X_LES_BU_RES_Rt2 (NLES_K,NLES_TOT)) -ALLOCATE(X_LES_BU_RES_ThlRt(NLES_K,NLES_TOT)) -ALLOCATE(X_LES_BU_RES_Sv2 (NLES_K,NLES_TOT,NSV)) -ALLOCATE(X_LES_BU_RES_WSv (NLES_K,NLES_TOT,NSV)) - -X_LES_BU_RES_KE = 0. -X_LES_BU_RES_WThl = 0. -X_LES_BU_RES_Thl2 = 0. -X_LES_BU_SBG_Tke = 0. -X_LES_BU_RES_WRt = 0. -X_LES_BU_RES_Rt2 = 0. -X_LES_BU_RES_ThlRt= 0. -X_LES_BU_RES_Sv2 = 0. -X_LES_BU_RES_WSv = 0. -! -!------------------------------------------------------------------------------- -! -!* 4. Definition of anomaly fields -! ---------------------------- -! -ALLOCATE (XU_ANOM (IIU,IJU,NLES_K)) -ALLOCATE (XV_ANOM (IIU,IJU,NLES_K)) -ALLOCATE (XW_ANOM (IIU,IJU,NLES_K)) -ALLOCATE (XTHL_ANOM(IIU,IJU,NLES_K)) -IF (LUSERV) THEN - ALLOCATE (XRT_ANOM (IIU,IJU,NLES_K)) -ELSE - ALLOCATE (XRT_ANOM (0,0,0)) -END IF -ALLOCATE (XSV_ANOM (IIU,IJU,NLES_K,NSV)) -! -!* 4.1 conservative variables -! ---------------------- -! -ALLOCATE(ZTHL(IIU,IJU,IKU)) -ALLOCATE(ZRT (IIU,IJU,IKU)) -CALL THL_RT_FROM_TH_R(LUSERV, LUSERC, LUSERR, & - LUSERI, LUSERS, LUSERG, LUSERH, & - XCURRENT_L_O_EXN_CP, & - XTHT, XRT, & - ZTHL, ZRT ) -! -!* 4.2 anomaly fields on the LES grid -! ------------------------------ -! -CALL LES_ANOMALY_FIELD(MXF(XUT),XU_ANOM) -CALL LES_ANOMALY_FIELD(MYF(XVT),XV_ANOM) -CALL LES_ANOMALY_FIELD(MZF(XWT),XW_ANOM) -CALL LES_ANOMALY_FIELD(ZTHL,XTHL_ANOM) -IF (LUSERV) CALL LES_ANOMALY_FIELD(ZRT,XRT_ANOM) -DO JSV=1,NSV - CALL LES_ANOMALY_FIELD(XSVT(:,:,:,JSV),XSV_ANOM(:,:,:,JSV)) -END DO -! -!------------------------------------------------------------------------------- -! -DEALLOCATE(ZTHL) -DEALLOCATE(ZRT ) -!------------------------------------------------------------------------------- -! -!* 6.0 Nebulosity masks -! ---------------- -! -CALL LES_CLOUD_MASKS_n -! -!------------------------------------------------------------------------------- -CALL SECOND_MNH(ZTIME2) -XTIME_LES_BU = XTIME_LES_BU + ZTIME2 - ZTIME1 -!-------------------------------------------------------------------------------- -! -CONTAINS -! -!-------------------------------------------------------------------------------- -! -SUBROUTINE LES_ANOMALY_FIELD(PF,PF_ANOM) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PF -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PF_ANOM - -REAL, DIMENSION(SIZE(PF_ANOM,3)) :: ZMEAN -INTEGER :: JI, JJ - -CALL LES_VER_INT(PF, PF_ANOM) -CALL LES_MEAN_ll(PF_ANOM, LLES_CURRENT_CART_MASK, ZMEAN ) -DO JJ=1,SIZE(PF_ANOM,2) - DO JI=1,SIZE(PF_ANOM,1) - PF_ANOM(JI,JJ,:) = PF_ANOM(JI,JJ,:) - ZMEAN(:) - END DO -END DO - -END SUBROUTINE LES_ANOMALY_FIELD -!-------------------------------------------------------------------------------- -! -END SUBROUTINE LES_INI_TIMESTEP_n - diff --git a/src/PHYEX/ext/lesn.f90 b/src/PHYEX/ext/lesn.f90 deleted file mode 100644 index 6411b6cc5..000000000 --- a/src/PHYEX/ext/lesn.f90 +++ /dev/null @@ -1,3582 +0,0 @@ -!MNH_LIC Copyright 2000-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ################# - SUBROUTINE LES_n -! ################# -! -! -!!**** *LES_n* computes the current time-step LES diagnostics for model _n -!! -!! -!! PURPOSE -!! ------- -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/02/00 -!! 01/02/01 (D. Gazen) add module MODD_NSV for NSV variable -!! 06/11/02 (V. Masson) add LES budgets and use of anomalies -!! in LES quantities computations -!! 01/04/03 (V. Masson and F. Couvreux) bug in BL height loop -!! 10/07 (J.Pergaud) Add mass flux diagnostics -!! 06/08 (O.Thouron) Add radiative diagnostics -!! 12/10 (R.Honnert) Add EDKF mass flux in BL height -!! 10/09 (P. Aumond) Add possibility of user maskS -!! 10/14 (C.Lac) Correction on user masks -!! 10/16 (C.Lac) Add ground droplet deposition amount -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! 02/2019 (C. Lac) Add rain fraction as a LES diagnostic -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_CTURB, ONLY : XFTOP_O_FSURF -! -USE MODD_LES -USE MODD_LES_BUDGET -USE MODD_CONF -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_LES_n -USE MODD_RADIATIONS_n -USE MODD_GRID_n -USE MODD_REF_n -USE MODD_FIELD_n -USE MODD_CONF_n -USE MODD_PARAM_n -USE MODD_TURB_n -USE MODD_METRICS_n -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_PARAM_n, ONLY: CCLOUD -USE MODD_PRECIP_n, ONLY: XINPRR,XACPRR,XINPRR3D,XEVAP3D,XINPRC,XINDEP -USE MODD_NSV, ONLY : NSV, NSV_CS -USE MODD_PARAM_ICE_n, ONLY: LDEPOSC,LSEDIC -USE MODD_PARAM_C2R2, ONLY: LDEPOC,LSEDC -USE MODD_PARAM_LIMA, ONLY : MSEDC=>LSEDC -! -USE MODI_SHUMAN -USE MODI_GRADIENT_M -USE MODI_GRADIENT_U -USE MODI_GRADIENT_V -USE MODI_GRADIENT_W -USE MODI_LES_VER_INT -USE MODI_SPEC_VER_INT -USE MODI_LES_MEAN_ll -USE MODI_THL_RT_FROM_TH_R -USE MODI_LES_RES_TR -USE MODI_BUDGET_FLAGS -USE MODI_LES_BUDGET_TEND_n -USE MODE_BL_DEPTH_DIAG -! -USE MODE_ll -USE MODE_MODELN_HANDLER -USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -! 0.2 declaration of local variables -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN ! Exner function -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHL ! liquid potential temperature -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV ! virtual potential temperature -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO ! air density -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: CHAMPXY1 !tableau intermediaire -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTEMP ! Temperature -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEW -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZINDCLD !indice cloud si rc>0 -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZINDCLD2 !indice cloud rc>1E-5 -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCLDFR_LES! CLDFR on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZICEFR_LES! ICEFR on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRAINFR_LES! RAINFR on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMASSF ! massflux=rho*w -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZREHU ! relative humidity - - -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_LES ! alt. on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZZZ_LES -REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZINPRR3D_LES ! precipitation flux 3D -REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZEVAP3D_LES !evaporation 3D -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZP_LES ! pres. on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDP_LES ! dynamical production TKE -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTP_LES ! thermal production TKE -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTR_LES ! transport production TKE -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDISS_LES ! dissipation TKE -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLM_LES ! mixing length - -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDPDZ_LES ! dp/dz on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDTHLDZ_LES ! dThl/dz on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDTHDZ_LES ! dTh/dz on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDRTDZ_LES ! dRt/dz on LES vertical grid -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZDSvDZ_LES ! dSv/dz on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDUDZ_LES ! du/dz on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDVDZ_LES ! dv/dz on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDWDZ_LES ! dw/dz on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN_LES ! Exner on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO_LES ! rho on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZU_LES ! U on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZV_LES ! V on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZW_LES ! W on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMF_LES ! mass flux on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTH_LES ! Theta on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV_LES ! thv on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHL_LES ! thl on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTKE_LES ! tke on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZKE_LES ! ke on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV_LES ! Rv on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZREHU_LES ! Rehu on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC_LES ! Rc on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRR_LES ! Rr on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRI_LES ! Ri on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRS_LES ! Rs on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRG_LES ! Rg on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRH_LES ! Rh on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRT_LES ! Rt on LES vertical grid -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_LES ! Sv on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTH_ANOM ! Theta anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV_ANOM ! thv anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV_ANOM ! Rv anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC_ANOM ! Rc anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRI_ANOM ! Ri anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRR_ANOM ! Rr anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZP_ANOM ! p anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO_ANOM ! rho anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDPDZ_ANOM! dp/dz anomaly on LES vertical grid -REAL, DIMENSION(:), ALLOCATABLE :: ZMEAN_DPDZ! dp/dz mean on LES vertical grid -REAL, DIMENSION(:), ALLOCATABLE :: ZLES_MEAN_DRtDZ! drt/dz mean on LES vertical grid -REAL, DIMENSION(:), ALLOCATABLE :: ZLES_MEAN_DTHDZ! dth/dz mean on LES vertical grid -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLES_MEAN_DSVDZ! drt/dz mean on LES vertical grid -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLWP_LES, ZRWP_LES, ZTKET_LES -REAL, DIMENSION(:,:), ALLOCATABLE :: ZIWP_LES, ZSWP_LES, ZGWP_LES, ZHWP_LES -REAL, DIMENSION(:,:), ALLOCATABLE :: ZINDCLD2D ! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZINDCLD2D2 ! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLWP_ANOM ! lwp anomaly -REAL, DIMENSION(:,:), ALLOCATABLE :: ZMAXWRR2D ! maxwrr2D -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZU_SPEC ! U on SPEC vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZV_SPEC ! V on SPEC vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZW_SPEC ! W on SPEC vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTH_SPEC ! Theta on SPEC vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHL_SPEC ! thl on SPEC vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV_SPEC ! Rv on SPEC vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC_SPEC ! Rc on SPEC vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRI_SPEC ! Ri on SPEC vertical grid -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_SPEC ! Sv on SPEC vertical grid -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRT ! rv+rc+rr+ri+rs+rg+rh -REAL, DIMENSION(:), ALLOCATABLE :: ZWORK1D,ZWORK1DT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK2D -REAL :: ZINPRRm,ZCOUNT -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRADEFF_LES ! Re on LES vertical grid -!!fl sw, lw, dthrad on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSWU_LES ! SWU on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSWD_LES ! SWD on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLWU_LES ! LWU on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLWD_LES ! LWD on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDTHRADSW_LES ! DTHRADSW on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDTHRADLW_LES ! DTHRADLW on LES vertical grid -! -REAL, DIMENSION(:), ALLOCATABLE :: ZWORK ! -! -INTEGER :: IRR ! moist variables counter -INTEGER :: JSV ! scalar variables counter -INTEGER :: IIU, IJU ! array sizes -INTEGER :: IKE,IKB -INTEGER :: JI, JJ, JK ! loop counters -INTEGER :: IIU_ll, IJU_ll ! total domain I size (fin) -INTEGER :: IIA_ll, IJA_ll ! total domain I size (debut) -INTEGER :: IINFO_ll ! return code of parallel routine -INTEGER :: IIMAX_ll, IJMAX_ll ! total physical domain I size -INTEGER :: JLOOP -! -INTEGER :: IMASK ! mask counter -INTEGER :: IMASKUSER! mask user number -! -INTEGER :: IRESP, ILUOUT -INTEGER :: IMI ! Current model index -TYPE(DIMPHYEX_t) :: YLDIMPHYEX -!------------------------------------------------------------------------------- -! -IMI = GET_CURRENT_MODEL_INDEX() -! -IF (.NOT. LLES_CALL) RETURN -! -CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll) -IIU_ll = IIMAX_ll+JPHEXT -IJU_ll = IJMAX_ll+JPHEXT -IIA_ll=JPHEXT+1 -IJA_ll=JPHEXT+1 -IKE=SIZE(XVT,3)-JPVEXT -IKB=1+JPVEXT -CALL GET_DIM_EXT_ll('B',IIU,IJU) -CALL FILL_DIMPHYEX(YLDIMPHYEX, SIZE(XTHT,1), SIZE(XTHT,2), SIZE(XTHT,3),.TRUE.) -! -ILUOUT = TLUOUT%NLU -! -!------------------------------------------------------------------------------- -! -!* interpolation coefficients for Z type grid -! -IF (CSPECTRA_LEVEL_TYPE=='Z') THEN - IF (ASSOCIATED(XCOEFLIN_CURRENT_SPEC)) CALL LES_DEALLOCATE('XCOEFLIN_CURRENT_SPEC') - IF (ASSOCIATED(NKLIN_CURRENT_SPEC )) CALL LES_DEALLOCATE('NKLIN_CURRENT_SPEC') - ! - CALL LES_ALLOCATE('XCOEFLIN_CURRENT_SPEC',(/IIU,IJU,NSPECTRA_K/)) - CALL LES_ALLOCATE('NKLIN_CURRENT_SPEC',(/IIU,IJU,NSPECTRA_K/)) - ! - XCOEFLIN_CURRENT_SPEC(:,:,:) = XCOEFLIN_SPEC(:,:,:) - NKLIN_CURRENT_SPEC (:,:,:) = NKLIN_SPEC (:,:,:) -END IF -! -!------------------------------------------------------------------------------- -! -!* 1. Allocations -! ----------- -! -ALLOCATE(ZP_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZDP_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZTP_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZTR_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZDISS_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZLM_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZDTHLDZ_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZDTHDZ_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZDRTDZ_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZDUDZ_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZDVDZ_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZDWDZ_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZDSVDZ_LES(IIU,IJU,NLES_K,NSV)) - -ALLOCATE(ZDPDZ_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZEXN_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZRHO_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZU_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZV_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZW_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZMF_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZTH_LES (IIU,IJU,NLES_K)) -IF (CRAD /= 'NONE') THEN - ALLOCATE(ZRADEFF_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZSWU_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZSWD_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZLWU_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZLWD_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZDTHRADSW_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZDTHRADLW_LES (IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZRADEFF_LES (0,0,0)) - ALLOCATE(ZSWU_LES (0,0,0)) - ALLOCATE(ZSWD_LES (0,0,0)) - ALLOCATE(ZLWU_LES (0,0,0)) - ALLOCATE(ZLWD_LES (0,0,0)) - ALLOCATE(ZDTHRADSW_LES (0,0,0)) - ALLOCATE(ZDTHRADLW_LES (0,0,0)) -END IF -IF (LUSERV) THEN - ALLOCATE(ZTHV_LES (IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZTHV_LES (0,0,0)) -END IF -ALLOCATE(ZTHL_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZTKE_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZKE_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZTKET_LES(IIU,IJU)) -ALLOCATE(ZWORK1D (NLES_K)) -ALLOCATE(ZWORK1DT (NLES_K)) -ALLOCATE(ZZZ_LES(IIU,IJU,NLES_K)) -IF (LUSERV) THEN - ALLOCATE(ZRV_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZRT_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZREHU_LES (IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZRV_LES (0,0,0)) - ALLOCATE(ZRT_LES (0,0,0)) - ALLOCATE(ZREHU_LES (0,0,0)) -END IF -IF (LUSERC) THEN - ALLOCATE(ZRC_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZLWP_LES(IIU,IJU)) - ALLOCATE(ZINDCLD2D(IIU,IJU)) - ALLOCATE(ZINDCLD2D2(IIU,IJU)) - ALLOCATE(ZCLDFR_LES(IIU,IJU,NLES_K)) - ALLOCATE(ZWORK2D(IIU,IJU)) - ALLOCATE(ZLWP_ANOM(IIU,IJU)) -ELSE - ALLOCATE(ZRC_LES (0,0,0)) - ALLOCATE(ZLWP_LES(0,0)) - ALLOCATE(ZINDCLD2D(0,0)) - ALLOCATE(ZINDCLD2D2(0,0)) - ALLOCATE(ZCLDFR_LES(0,0,0)) - ALLOCATE(ZWORK2D(0,0)) - ALLOCATE(ZLWP_ANOM(0,0)) -END IF -IF (LUSERR) THEN - ALLOCATE(ZRR_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZMAXWRR2D(IIU,IJU)) - ALLOCATE(ZRWP_LES(IIU,IJU)) - ALLOCATE(ZINPRR3D_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZEVAP3D_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZRAINFR_LES(IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZRR_LES (0,0,0)) - ALLOCATE(ZMAXWRR2D(0,0)) - ALLOCATE(ZRWP_LES(0,0)) - ALLOCATE(ZINPRR3D_LES(0,0,0)) - ALLOCATE(ZEVAP3D_LES(0,0,0)) - ALLOCATE(ZRAINFR_LES(0,0,0)) -END IF -IF (LUSERI) THEN - ALLOCATE(ZRI_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZIWP_LES(IIU,IJU)) - ALLOCATE(ZICEFR_LES(IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZRI_LES (0,0,0)) - ALLOCATE(ZIWP_LES(0,0)) - ALLOCATE(ZICEFR_LES(0,0,0)) -END IF -IF (LUSERS) THEN - ALLOCATE(ZRS_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZSWP_LES(IIU,IJU)) -ELSE - ALLOCATE(ZRS_LES (0,0,0)) - ALLOCATE(ZSWP_LES(0,0)) -END IF -IF (LUSERG) THEN - ALLOCATE(ZRG_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZGWP_LES(IIU,IJU)) -ELSE - ALLOCATE(ZRG_LES (0,0,0)) - ALLOCATE(ZGWP_LES(0,0)) -END IF -IF (LUSERH) THEN - ALLOCATE(ZRH_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZHWP_LES(IIU,IJU)) -ELSE - ALLOCATE(ZRH_LES (0,0,0)) - ALLOCATE(ZHWP_LES(0,0)) -END IF -IF (NSV>0) THEN - ALLOCATE(ZSV_LES (IIU,IJU,NLES_K,NSV)) -ELSE - ALLOCATE(ZSV_LES (0,0,0,0)) -END IF -! -ALLOCATE(ZP_ANOM (IIU,IJU,NLES_K)) -ALLOCATE(ZRHO_ANOM (IIU,IJU,NLES_K)) -ALLOCATE(ZTH_ANOM (IIU,IJU,NLES_K)) -ALLOCATE(ZDPDZ_ANOM(IIU,IJU,NLES_K)) -IF (LUSERV) THEN - ALLOCATE(ZTHV_ANOM(IIU,IJU,NLES_K)) - ALLOCATE(ZRV_ANOM (IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZTHV_ANOM(0,0,0)) - ALLOCATE(ZRV_ANOM (0,0,0)) -END IF -IF (LUSERC) THEN - ALLOCATE(ZRC_ANOM (IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZRC_ANOM (0,0,0)) -END IF -IF (LUSERI) THEN - ALLOCATE(ZRI_ANOM (IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZRI_ANOM (0,0,0)) -END IF -IF (LUSERR) THEN - ALLOCATE(ZRR_ANOM (IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZRR_ANOM (0,0,0)) -END IF -ALLOCATE(ZMEAN_DPDZ(NLES_K)) -ALLOCATE(ZLES_MEAN_DTHDZ(NLES_K)) -! -! -ALLOCATE(ZU_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -ALLOCATE(ZV_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -ALLOCATE(ZW_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -ALLOCATE(ZTH_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -IF (LUSERC) THEN - ALLOCATE(ZTHL_SPEC(NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -ELSE - ALLOCATE(ZTHL_SPEC(0,0,0)) -END IF -IF (LUSERV) THEN - ALLOCATE(ZRV_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -ELSE - ALLOCATE(ZRV_SPEC (0,0,0)) -END IF -IF (LUSERC) THEN - ALLOCATE(ZRC_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -ELSE - ALLOCATE(ZRC_SPEC (0,0,0)) -END IF -IF (LUSERI) THEN - ALLOCATE(ZRI_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -ELSE - ALLOCATE(ZRI_SPEC (0,0,0)) -END IF -IF (NSV>0) THEN - ALLOCATE(ZSV_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K,NSV)) -ELSE - ALLOCATE(ZSV_SPEC (0,0,0,0)) -END IF -! -! -ALLOCATE(ZEXN (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZRHO (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZRT (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZTHV (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZTHL (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZEW (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZMASSF (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZTEMP (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZREHU (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(CHAMPXY1 (IIU,IJU,1)) -! -!------------------------------------------------------------------------------- -! -!* 1.2 preliminary calculations -! ------------------------ -! -ZEXN(:,:,:) = (XPABST/XP00)**(XRD/XCPD) -! -! -!* computation of relative humidity -ZTEMP=XTHT*ZEXN -ZEW=EXP (XALPW -XBETAW/ZTEMP-XGAMW*ALOG(ZTEMP)) -IF (LUSERV) THEN - ZREHU(:,:,:)=100.*XRT(:,:,:,1)*XPABST(:,:,:)/((XRD/XRV+XRT(:,:,:,1))*ZEW(:,:,:)) -ELSE - ZREHU(:,:,:)=0. -END IF -! -CALL THL_RT_FROM_TH_R(LUSERV, LUSERC, LUSERR, & - LUSERI, LUSERS, LUSERG, LUSERH, & - XCURRENT_L_O_EXN_CP, & - XTHT, XRT, & - ZTHL, ZRT ) -! -!* computation of density and virtual potential temperature -! -ZTHV=XTHT -IF (LUSERV) ZTHV=ZTHV*(1.+XRV/XRD*XRT(:,:,:,1))/(1.+ZRT(:,:,:)) -! -IF (CEQNSYS=='DUR') THEN - ZRHO=XPABST/(XRD*ZTHV*ZEXN) -ELSE - ZRHO=XRHODREF*( 1. + (XCPD-XRD)/XRD*(ZEXN/XEXNREF - 1.) - (ZTHV/XTHVREF - 1.) ) -END IF -! -! computation of mass flux -ZMASSF=MZM(ZRHO)*XWT -! -!------------------------------------------------------------------------------- -! -!* 2. Vertical interpolations to LES vertical grid -! -------------------------------------------- -! -!* note that velocity fields are first localized on the MASS points -! -! -IF (CRAD /= 'NONE') THEN - CALL LES_VER_INT( XRADEFF, ZRADEFF_LES) - CALL LES_VER_INT( XSWU, ZSWU_LES) - CALL LES_VER_INT( XSWD, ZSWD_LES) - CALL LES_VER_INT( XLWU, ZLWU_LES) - CALL LES_VER_INT( XLWD, ZLWD_LES) - CALL LES_VER_INT( XDTHRADSW, ZDTHRADSW_LES) - CALL LES_VER_INT( XDTHRADLW, ZDTHRADLW_LES) -END IF -! -CALL LES_VER_INT( XZZ , ZZZ_LES) -CALL LES_VER_INT( XPABST, ZP_LES ) -CALL LES_VER_INT( XDYP, ZDP_LES ) -CALL LES_VER_INT( XTHP, ZTP_LES ) -CALL LES_VER_INT( XTR, ZTR_LES ) -CALL LES_VER_INT( XDISS, ZDISS_LES ) -CALL LES_VER_INT( XLEM, ZLM_LES ) -CALL LES_VER_INT( GZ_M_M(XPABST,XDZZ), ZDPDZ_LES ) -! -CALL LES_VER_INT( MXF(XUT) ,ZU_LES ) -CALL LES_VER_INT( MYF(XVT) ,ZV_LES ) -CALL LES_VER_INT( MZF(XWT) ,ZW_LES ) -CALL LES_VER_INT( MZF(ZMASSF) ,ZMF_LES) -CALL LES_VER_INT( XTHT ,ZTH_LES ) -CALL LES_VER_INT( MXF(MZF(GZ_U_UW(XUT,XDZZ))), ZDUDZ_LES ) -CALL LES_VER_INT( MYF(MZF(GZ_V_VW(XVT,XDZZ))), ZDVDZ_LES ) -CALL LES_VER_INT( GZ_W_M(XWT,XDZZ), ZDWDZ_LES ) -CALL LES_VER_INT( ZEXN, ZEXN_LES) -! -CALL LES_VER_INT( GZ_M_M(XTHT,XDZZ), ZDTHDZ_LES ) -! -CALL LES_VER_INT(ZRHO, ZRHO_LES) -! -IF (LUSERV) CALL LES_VER_INT(ZTHV, ZTHV_LES) -CALL LES_VER_INT(ZTHL, ZTHL_LES) -CALL LES_VER_INT( GZ_M_M(ZTHL,XDZZ), ZDTHLDZ_LES ) -! -CALL LES_VER_INT( XTKET ,ZTKE_LES) -IRR = 0 -IF (LUSERV) THEN - IRR = IRR + 1 - CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRV_LES ) - CALL LES_VER_INT( ZRT(:,:,:) ,ZRT_LES ) - CALL LES_VER_INT( GZ_M_M(ZRT,XDZZ), ZDRTDZ_LES ) - CALL LES_VER_INT( ZREHU(:,:,:) ,ZREHU_LES) -END IF -IF (LUSERC) THEN - IRR = IRR + 1 - CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRC_LES ) - ALLOCATE(ZINDCLD (IIU,IJU,NLES_K)) - ALLOCATE(ZINDCLD2(IIU,IJU,NLES_K)) - ZINDCLD = CEILING(ZRC_LES-1.E-6) - ZINDCLD2 = CEILING(ZRC_LES-1.E-5) - CALL LES_VER_INT( XCLDFR(:,:,:) ,ZCLDFR_LES ) -ELSE - ALLOCATE(ZINDCLD (0,0,0)) - ALLOCATE(ZINDCLD2(0,0,0)) -END IF -IF (LUSERR) THEN - IRR = IRR + 1 - CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRR_LES ) - CALL LES_VER_INT( XINPRR3D(:,:,:), ZINPRR3D_LES) - CALL LES_VER_INT( XEVAP3D(:,:,:), ZEVAP3D_LES) - CALL LES_VER_INT( XRAINFR(:,:,:) ,ZRAINFR_LES ) -END IF -IF (LUSERC) THEN - DO JJ=1,IJU - DO JI=1,IIU - ZINDCLD2D(JI,JJ) = maxval(ZINDCLD(JI,JJ,:)) - ZINDCLD2D2(JI,JJ)= maxval(ZINDCLD2(JI,JJ,:)) - END DO - END DO - !* integration of rho rc - !!!ZLWP_LES only for cloud water - ZLWP_LES(:,:) = 0. - DO JK=1,NLES_K-1 - ZLWP_LES(:,:) = ZLWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & - * (ZRC_LES(:,:,JK)) * ZRHO_LES(:,:,JK) - END DO - CALL LES_MEAN_ll ( ZLWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_LWP(NLES_CURRENT_TCOUNT) ) -! -END IF - - !!!ZRWP_LES only for rain water -IF (LUSERR) THEN - ZRWP_LES(:,:)=0. - DO JK=1,NLES_K-1 - ZRWP_LES(:,:) = ZRWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & - * (ZRR_LES(:,:,JK)) * ZRHO_LES(:,:,JK) - END DO - CALL LES_MEAN_ll ( ZRWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_RWP(NLES_CURRENT_TCOUNT) ) -ENDIF -! -IF (LUSERI) THEN - IRR = IRR + 1 - CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRI_LES ) - ZIWP_LES(:,:)=0. - DO JK=1,NLES_K-1 - ZIWP_LES(:,:) = ZIWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & - * (ZRI_LES(:,:,JK)) * ZRHO_LES(:,:,JK) - END DO - CALL LES_MEAN_ll ( ZIWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_IWP(NLES_CURRENT_TCOUNT) ) - CALL LES_VER_INT( XICEFR(:,:,:) ,ZICEFR_LES ) -END IF -IF (LUSERS) THEN - IRR = IRR + 1 - CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRS_LES ) - ZSWP_LES(:,:)=0. - DO JK=1,NLES_K-1 - ZSWP_LES(:,:) = ZSWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & - * (ZRS_LES(:,:,JK)) * ZRHO_LES(:,:,JK) - END DO - CALL LES_MEAN_ll ( ZSWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_SWP(NLES_CURRENT_TCOUNT) ) -END IF -IF (LUSERG) THEN - IRR = IRR + 1 - CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRG_LES ) - ZGWP_LES(:,:)=0. - DO JK=1,NLES_K-1 - ZGWP_LES(:,:) = ZGWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & - * (ZRG_LES(:,:,JK)) * ZRHO_LES(:,:,JK) - END DO - CALL LES_MEAN_ll ( ZGWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_GWP(NLES_CURRENT_TCOUNT) ) -END IF -IF (LUSERH) THEN - IRR = IRR + 1 - CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRH_LES ) - ZHWP_LES(:,:)=0. - DO JK=1,NLES_K-1 - ZHWP_LES(:,:) = ZHWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & - * (ZRH_LES(:,:,JK)) * ZRHO_LES(:,:,JK) - END DO - CALL LES_MEAN_ll ( ZHWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_HWP(NLES_CURRENT_TCOUNT) ) -END IF -IF (NSV>0) THEN - DO JSV=1,NSV - CALL LES_VER_INT( XSVT(:,:,:,JSV), ZSV_LES(:,:,:,JSV) ) - CALL LES_VER_INT( GZ_M_M(XSVT(:,:,:,JSV),XDZZ), ZDSVDZ_LES(:,:,:,JSV) ) - END DO -END IF -! -!*mean sw and lw fluxes - CALL LES_MEAN_ll ( ZSWU_LES, LLES_CURRENT_CART_MASK, & - XLES_SWU(:,NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll ( ZSWD_LES, LLES_CURRENT_CART_MASK, & - XLES_SWD(:,NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll ( ZLWU_LES, LLES_CURRENT_CART_MASK, & - XLES_LWU(:,NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll ( ZLWD_LES, LLES_CURRENT_CART_MASK, & - XLES_LWD(:,NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll ( ZDTHRADSW_LES, LLES_CURRENT_CART_MASK, & - XLES_DTHRADSW(:,NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll ( ZDTHRADLW_LES, LLES_CURRENT_CART_MASK, & - XLES_DTHRADLW(:,NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll ( ZRADEFF_LES, LLES_CURRENT_CART_MASK, & - XLES_RADEFF(:,NLES_CURRENT_TCOUNT) ) -!* mean vertical profiles on the LES grid -! - CALL LES_MEAN_ll ( ZU_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_U(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZV_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_V(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZW_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_W(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZP_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZDP_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_DP(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZTP_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_TP(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZTR_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_TR(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZDISS_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_DISS(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZLM_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_LM(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZRHO_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_RHO(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZMF_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Mf(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZTH_LES*ZEXN_LES, LLES_CURRENT_CART_MASK, & - ZWORK1DT(:) ) -! -!computation of es - ZWORK1D(:)=EXP(XALPW - & - XBETAW/ZWORK1DT(:) & - -XGAMW*ALOG(ZWORK1DT(:))) -!computation of qs - - IF (LUSERV) & - XLES_MEAN_Qs(:,NLES_CURRENT_TCOUNT,1)=XRD/XRV*ZWORK1D(:)/ & - (XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1)-ZWORK1D(:)*(1-XRD/XRV)) -! qs is determined from the temperature average over the current_mask -! - CALL LES_MEAN_ll ( ZTH_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZTHV_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERC) & - CALL LES_MEAN_ll ( ZTHL_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Thl(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERC) & - CALL LES_MEAN_ll ( ZRT_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rt(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZRV_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZREHU_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rehu(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERC) & - CALL LES_MEAN_ll ( ZRC_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERC) THEN - CALL LES_MEAN_ll ( ZINDCLD, LLES_CURRENT_CART_MASK, & - XLES_MEAN_INDCf(:,NLES_CURRENT_TCOUNT,1) ) - CALL LES_MEAN_ll ( ZINDCLD2, LLES_CURRENT_CART_MASK, & - XLES_MEAN_INDCf2(:,NLES_CURRENT_TCOUNT,1) ) - CALL LES_MEAN_ll ( ZCLDFR_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Cf(:,NLES_CURRENT_TCOUNT,1) ) -! -!* cf total - CALL LES_MEAN_ll( ZINDCLD2D, LLES_CURRENT_CART_MASK(:,:,1) , & - XLES_CFtot(NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll( ZINDCLD2D2, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_CF2tot(NLES_CURRENT_TCOUNT) ) - ENDIF -! - IF (LUSERR) THEN - - CALL LES_MEAN_ll ( XINPRR, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_INPRR(NLES_CURRENT_TCOUNT) ) - ZINPRRm=0. - ZCOUNT=0. - ZINDCLD2D(:,:)=0. - DO JJ=1,IJU - DO JI=1,IIU - IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZINPRRm = ZINPRRm+XINPRR(JI,JJ) - IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZINDCLD2D(JI,JJ)=1. - IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZCOUNT=ZCOUNT+1. - END DO - END DO - IF (ZCOUNT .GE. 1) ZINPRRm=ZINPRRm/ZCOUNT - XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)=ZINPRRm - CALL LES_MEAN_ll ( ZINDCLD2D, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_PRECFR(NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll ( ZINPRR3D_LES, LLES_CURRENT_CART_MASK, & - XLES_INPRR3D(:,NLES_CURRENT_TCOUNT,1) ) - CALL LES_MEAN_ll ( ZEVAP3D_LES, LLES_CURRENT_CART_MASK, & - XLES_EVAP3D(:,NLES_CURRENT_TCOUNT,1) ) - DO JK=1,NLES_K - CHAMPXY1(:,:,1)=ZINPRR3D_LES(:,:,JK) - XLES_MAX_INPRR3D(JK,NLES_CURRENT_TCOUNT,1)=MAX_ll (CHAMPXY1,IINFO_ll, & - IIA_ll,IJA_ll,1,IIU_ll,IJU_ll,1) - END DO -! - -! conversion de m/s en mm/day - XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)=XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)*3.6E6*24. - XLES_INPRR(NLES_CURRENT_TCOUNT)=XLES_INPRR(NLES_CURRENT_TCOUNT)*3.6E6*24. - - CALL LES_MEAN_ll ( XACPRR, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_ACPRR(NLES_CURRENT_TCOUNT) ) -! conversion de m en mm - XLES_ACPRR(NLES_CURRENT_TCOUNT)=XLES_ACPRR(NLES_CURRENT_TCOUNT)*1000. - CALL LES_MEAN_ll ( ZRAINFR_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_RF(:,NLES_CURRENT_TCOUNT,1) ) - - ENDIF -! - IF (LUSERC ) THEN - IF (( CCLOUD(1:3) == 'ICE' .AND.LSEDIC) .OR. & - ((CCLOUD=='C2R2' .OR. CCLOUD=='C3R5' .OR. CCLOUD=='KHKO').AND.LSEDC) .OR. & - ( CCLOUD=='LIMA' .AND.MSEDC)) THEN - CALL LES_MEAN_ll ( XINPRC, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_INPRC(NLES_CURRENT_TCOUNT) ) -! conversion from m/s to mm/day - XLES_INPRC(NLES_CURRENT_TCOUNT)=XLES_INPRC(NLES_CURRENT_TCOUNT)*3.6E6*24. - ENDIF - IF ( (((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. LDEPOC) & - .OR. ( (CCLOUD(1:3) == 'ICE') .AND. LDEPOSC) ) THEN - CALL LES_MEAN_ll ( XINDEP, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_INDEP(NLES_CURRENT_TCOUNT) ) -! conversion from m/s to mm/day - XLES_INDEP(NLES_CURRENT_TCOUNT)=XLES_INDEP(NLES_CURRENT_TCOUNT)*3.6E6*24. - ENDIF - ENDIF -! - IF (LUSERR) & - CALL LES_MEAN_ll ( ZRR_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERI) & - CALL LES_MEAN_ll ( ZRI_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,1) ) - CALL LES_MEAN_ll ( ZICEFR_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_If(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERS) & - CALL LES_MEAN_ll ( ZRS_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rs(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERG) & - CALL LES_MEAN_ll ( ZRG_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rg(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERH) & - CALL LES_MEAN_ll ( ZRH_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rh(:,NLES_CURRENT_TCOUNT,1) ) -! - DO JSV=1,NSV - CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), LLES_CURRENT_CART_MASK, & - XLES_MEAN_Sv(:,NLES_CURRENT_TCOUNT,1,JSV) ) - END DO -! - CALL LES_MEAN_ll ( ZDPDZ_LES, LLES_CURRENT_CART_MASK, & - ZMEAN_DPDZ(:) ) - CALL LES_MEAN_ll ( ZDTHDZ_LES, LLES_CURRENT_CART_MASK, & - ZLES_MEAN_DTHDZ(:) ) - -! -!* build the 3D resolved turbulent fields by removing the mean field -! -DO JJ=1,IJU - DO JI=1,IIU - ZP_ANOM(JI,JJ,:) = ZP_LES(JI,JJ,:) - XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1) - ZDPDZ_ANOM(JI,JJ,:) = ZDPDZ_LES(JI,JJ,:) - ZMEAN_DPDZ(:) - ZTH_ANOM(JI,JJ,:) = ZTH_LES(JI,JJ,:) - XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,1) - ZRHO_ANOM(JI,JJ,:) = ZRHO_LES(JI,JJ,:) - XLES_MEAN_Rho(:,NLES_CURRENT_TCOUNT,1) - IF (LUSERV) THEN - ZTHV_ANOM(JI,JJ,:) = ZTHV_LES(JI,JJ,:) - XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,1) - ZRV_ANOM(JI,JJ,:) = ZRV_LES(JI,JJ,:) - XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,1) - END IF - IF (LUSERC) THEN - ZRC_ANOM(JI,JJ,:) = ZRC_LES(JI,JJ,:) - XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,1) - ZLWP_ANOM(JI,JJ) =ZLWP_LES(JI,JJ)-XLES_LWP(NLES_CURRENT_TCOUNT) - END IF - IF (LUSERI) THEN - ZRI_ANOM(JI,JJ,:) = ZRI_LES(JI,JJ,:) - XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,1) - END IF - IF (LUSERR) THEN - ZRR_ANOM(JI,JJ,:) = ZRR_LES(JI,JJ,:) - XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,1) - END IF - END DO -END DO -! -! -!-------------------------------------------------------------------------------- -! -!* vertical grid computed at first LES call for this model -! -IF (NLES_CURRENT_TCOUNT==1) THEN - ALLOCATE(ZZ_LES (IIU,IJU,NLES_K)) - !ZZ_LES = vertical position of the mass points where data is computed - CALL LES_VER_INT( MZF(XZZ) ,ZZ_LES ) - !XLES_Z = mean vertical altitude for each level (taking into account the mask) - CALL LES_MEAN_ll ( ZZ_LES, LLES_CURRENT_CART_MASK, XLES_Z ) - DEALLOCATE(ZZ_LES) - CALL LES_MEAN_ll ( XZS, LLES_CURRENT_CART_MASK(:,:,1), XLES_ZS ) -END IF -! -!------------------------------------------------------------------------------- -! -!* 3. Vertical interpolations to SECTRA computations vertical grid -! ------------------------------------------------------------ -! -!* note that velocity fields are previously localized on the MASS points -! -CALL SPEC_VER_INT(IMI, MXF(XUT) ,ZU_SPEC ) -CALL SPEC_VER_INT(IMI, MYF(XVT) ,ZV_SPEC ) -CALL SPEC_VER_INT(IMI, MZF(XWT) ,ZW_SPEC ) -CALL SPEC_VER_INT(IMI, XTHT ,ZTH_SPEC ) -IF (LUSERC) CALL SPEC_VER_INT(IMI, ZTHL ,ZTHL_SPEC) -IRR = 0 -IF (LUSERV) THEN - IRR = IRR + 1 - CALL SPEC_VER_INT(IMI, XRT(:,:,:,IRR) ,ZRV_SPEC ) -END IF -IF (LUSERC) THEN - IRR = IRR + 1 - CALL SPEC_VER_INT(IMI, XRT(:,:,:,IRR) ,ZRC_SPEC ) -END IF -IF (LUSERR) THEN - IRR = IRR + 1 -END IF -IF (LUSERI) THEN - IRR = IRR + 1 - CALL SPEC_VER_INT(IMI, XRT(:,:,:,IRR) ,ZRI_SPEC ) -END IF -IF (NSV>0) THEN - DO JSV=1,NSV - CALL SPEC_VER_INT(IMI, XSVT(:,:,:,JSV), ZSV_SPEC(:,:,:,JSV) ) - END DO -END IF -! -!------------------------------------------------------------------------------- -! -!* 4. Call to LES computations on cartesian (sub-)domain -! -------------------------------------------------- -! -IMASK=1 -! -CALL LES(LLES_CURRENT_CART_MASK) -! -!------------------------------------------------------------------------------- -! -!* 5. Call to LES computations on nebulosity mask -! ------------------------------------------- -! -IF (LLES_NEB_MASK) THEN - IMASK=IMASK+1 - CALL LES(LLES_CURRENT_NEB_MASK .AND. LLES_CURRENT_CART_MASK) -! - IMASK=IMASK+1 - CALL LES((.NOT. LLES_CURRENT_NEB_MASK) .AND. LLES_CURRENT_CART_MASK) -END IF -! -!------------------------------------------------------------------------------- -! -!* 6. Call to LES computations on cloud core mask -! ------------------------------------------- -! -IF (LLES_CORE_MASK) THEN - IMASK=IMASK+1 - CALL LES(LLES_CURRENT_CORE_MASK .AND. LLES_CURRENT_CART_MASK) -! - IMASK=IMASK+1 - CALL LES((.NOT. LLES_CURRENT_CORE_MASK) .AND. LLES_CURRENT_CART_MASK) -END IF -! -!------------------------------------------------------------------------------- -! -!* 7. Call to LES computations on user mask -! ------------------------------------- -! -IF (LLES_MY_MASK) THEN - DO JI=1,NLES_MASKS_USER - IMASK=IMASK+1 - CALL LES(LLES_CURRENT_MY_MASKS(:,:,:,JI)) - END DO -END IF -! -!------------------------------------------------------------------------------- -! -!* 7b. Call to LES computations on conditional sampling mask -! ----------------------------------------------------- -! -IF (LLES_CS_MASK) THEN - IMASK=IMASK+1 - CALL LES(LLES_CURRENT_CS1_MASK) - IMASK=IMASK+1 - CALL LES(LLES_CURRENT_CS2_MASK) - IMASK=IMASK+1 - CALL LES(LLES_CURRENT_CS3_MASK) -END IF -! -!------------------------------------------------------------------------------- -! -!* 8. budgets -! ------- -! -!* 8.1 tendencies -! ---------- -! -! -!* 8.2 dynamical production, transport and mean advection -! -------------------------------------------------- -! -ALLOCATE(ZLES_MEAN_DRtDZ(NLES_K)) -ALLOCATE(ZLES_MEAN_DSVDZ(NLES_K,NSV)) -! -IF (LUSERV) THEN - ZLES_MEAN_DRtDZ(:) = XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,1) -ELSE - ZLES_MEAN_DRtDZ(:) = XUNDEF -END IF -! -ZLES_MEAN_DSVDZ = 0. -DO JSV=1,NSV - ZLES_MEAN_DSvDZ(:,JSV) = XLES_MEAN_DSvDZ(:,NLES_CURRENT_TCOUNT,1,JSV) -END DO -! -CALL LES_RES_TR(LUSERV, & - XLES_MEAN_DUDZ(:,NLES_CURRENT_TCOUNT,1), & - XLES_MEAN_DVDZ(:,NLES_CURRENT_TCOUNT,1), & - XLES_MEAN_DWDZ(:,NLES_CURRENT_TCOUNT,1), & - XLES_MEAN_DThlDZ(:,NLES_CURRENT_TCOUNT,1), & - ZLES_MEAN_DRtDZ(:), & - ZLES_MEAN_DSvDZ(:,:) ) -! -DEALLOCATE(ZLES_MEAN_DRtDZ) -DEALLOCATE(ZLES_MEAN_DSVDZ) -! -CALL LES_BUDGET_TEND_n -!* 8.3 end of LES budgets computations -! ------------------------------- -! -DO JLOOP=1,NLES_TOT - XLES_BU_RES_KE (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_KE (:,JLOOP) - XLES_BU_RES_WThl (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_WThl (:,JLOOP) - XLES_BU_RES_Thl2 (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_Thl2 (:,JLOOP) - XLES_BU_SBG_Tke (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_SBG_Tke (:,JLOOP) - IF (LUSERV) THEN - XLES_BU_RES_WRt (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_WRt (:,JLOOP) - XLES_BU_RES_Rt2 (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_Rt2 (:,JLOOP) - XLES_BU_RES_ThlRt(:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_ThlRt(:,JLOOP) - END IF - DO JSV=1,NSV - XLES_BU_RES_Sv2 (:,NLES_CURRENT_TCOUNT,JLOOP,JSV) = X_LES_BU_RES_Sv2 (:,JLOOP,JSV) - XLES_BU_RES_WSv (:,NLES_CURRENT_TCOUNT,JLOOP,JSV) = X_LES_BU_RES_WSv (:,JLOOP,JSV) - END DO -END DO -! -!------------------------------------------------------------------------------- -! -!* 9. Deallocations -! ------------- -! -!* 9.1 local variables -! --------------- -! -DEALLOCATE(ZEXN ) -DEALLOCATE(ZTHL) -DEALLOCATE(ZRT ) -DEALLOCATE(ZTHV ) -DEALLOCATE(ZRHO ) -DEALLOCATE(ZEW ) - -DEALLOCATE(ZINDCLD ) -DEALLOCATE(ZINDCLD2 ) -DEALLOCATE(ZINDCLD2D ) -DEALLOCATE(ZINDCLD2D2) -DEALLOCATE(ZCLDFR_LES) -DEALLOCATE(ZICEFR_LES) -DEALLOCATE(ZRAINFR_LES) -DEALLOCATE(ZMASSF ) -DEALLOCATE(ZTEMP ) -DEALLOCATE(ZREHU ) -DEALLOCATE(CHAMPXY1 ) -! -DEALLOCATE(ZU_LES) -DEALLOCATE(ZV_LES) -DEALLOCATE(ZW_LES) -DEALLOCATE(ZTHL_LES) -DEALLOCATE(ZRT_LES) -DEALLOCATE(ZSV_LES) -DEALLOCATE(ZP_LES ) -DEALLOCATE(ZDP_LES ) -DEALLOCATE(ZTP_LES ) -DEALLOCATE(ZTR_LES ) -DEALLOCATE(ZDISS_LES ) -DEALLOCATE(ZLM_LES ) -DEALLOCATE(ZDPDZ_LES) -DEALLOCATE(ZLWP_ANOM) -DEALLOCATE(ZWORK2D) -DEALLOCATE(ZWORK1D) -DEALLOCATE(ZWORK1DT) -DEALLOCATE(ZMAXWRR2D) -DEALLOCATE(ZDTHLDZ_LES) -DEALLOCATE(ZDTHDZ_LES) -DEALLOCATE(ZDRTDZ_LES) -DEALLOCATE(ZDSVDZ_LES) -DEALLOCATE(ZDUDZ_LES) -DEALLOCATE(ZDVDZ_LES) -DEALLOCATE(ZDWDZ_LES) -DEALLOCATE(ZRHO_LES ) -DEALLOCATE(ZEXN_LES ) -DEALLOCATE(ZTH_LES ) -DEALLOCATE(ZMF_LES ) -DEALLOCATE(ZTHV_LES ) -DEALLOCATE(ZTKE_LES ) -DEALLOCATE(ZKE_LES ) -DEALLOCATE(ZTKET_LES) -DEALLOCATE(ZRV_LES ) -DEALLOCATE(ZREHU_LES ) -DEALLOCATE(ZRC_LES ) -DEALLOCATE(ZRR_LES ) -DEALLOCATE(ZZZ_LES) -DEALLOCATE(ZLWP_LES ) -DEALLOCATE(ZRWP_LES ) -DEALLOCATE(ZIWP_LES ) -DEALLOCATE(ZSWP_LES ) -DEALLOCATE(ZGWP_LES ) -DEALLOCATE(ZHWP_LES ) -DEALLOCATE(ZINPRR3D_LES) -DEALLOCATE(ZEVAP3D_LES) -DEALLOCATE(ZRI_LES ) -DEALLOCATE(ZRS_LES ) -DEALLOCATE(ZRG_LES ) -DEALLOCATE(ZRH_LES ) -DEALLOCATE(ZP_ANOM ) -DEALLOCATE(ZRHO_ANOM) -DEALLOCATE(ZTH_ANOM ) -DEALLOCATE(ZTHV_ANOM) -DEALLOCATE(ZRV_ANOM ) -DEALLOCATE(ZRC_ANOM ) -DEALLOCATE(ZRI_ANOM ) -DEALLOCATE(ZRR_ANOM ) -DEALLOCATE(ZDPDZ_ANOM) -DEALLOCATE(ZMEAN_DPDZ) -DEALLOCATE(ZLES_MEAN_DTHDZ) -! -DEALLOCATE(ZU_SPEC ) -DEALLOCATE(ZV_SPEC ) -DEALLOCATE(ZW_SPEC ) -DEALLOCATE(ZTH_SPEC ) -DEALLOCATE(ZTHL_SPEC ) -DEALLOCATE(ZRV_SPEC ) -DEALLOCATE(ZRC_SPEC ) -DEALLOCATE(ZRI_SPEC ) -DEALLOCATE(ZSV_SPEC ) -! -DEALLOCATE(ZRADEFF_LES ) -DEALLOCATE(ZSWU_LES ) -DEALLOCATE(ZSWD_LES ) -DEALLOCATE(ZLWD_LES ) -DEALLOCATE(ZLWU_LES ) -DEALLOCATE(ZDTHRADSW_LES ) -DEALLOCATE(ZDTHRADLW_LES ) -! -!* 9.2 current time-step LES masks (in MODD_LES) -! --------------------------- -! -CALL LES_DEALLOCATE('LLES_CURRENT_CART_MASK') -IF (LLES_NEB_MASK) CALL LES_DEALLOCATE('LLES_CURRENT_NEB_MASK') -IF (LLES_CORE_MASK) CALL LES_DEALLOCATE('LLES_CURRENT_CORE_MASK') -IF (LLES_MY_MASK) THEN - CALL LES_DEALLOCATE('LLES_CURRENT_MY_MASKS') -END IF -IF (LLES_CS_MASK) THEN - CALL LES_DEALLOCATE('LLES_CURRENT_CS1_MASK') - IF (NSV_CS >= 2) CALL LES_DEALLOCATE('LLES_CURRENT_CS2_MASK') - IF (NSV_CS == 3) CALL LES_DEALLOCATE('LLES_CURRENT_CS3_MASK') -END IF -! -! -!* 9.3 variables in MODD_LES_BUDGET -! ---------------------------- -! - -DEALLOCATE(XU_ANOM ) -DEALLOCATE(XV_ANOM ) -DEALLOCATE(XW_ANOM ) -DEALLOCATE(XTHL_ANOM) -DEALLOCATE(XRT_ANOM ) -DEALLOCATE(XSV_ANOM ) -! -DEALLOCATE(XCURRENT_L_O_EXN_CP) -DEALLOCATE(XCURRENT_RHODJ ) -! -DEALLOCATE(XCURRENT_RUS ) -DEALLOCATE(XCURRENT_RVS ) -DEALLOCATE(XCURRENT_RWS ) -DEALLOCATE(XCURRENT_RTHS ) -DEALLOCATE(XCURRENT_RTKES) -DEALLOCATE(XCURRENT_RRS ) -DEALLOCATE(XCURRENT_RSVS ) -DEALLOCATE(XCURRENT_RTHLS) -DEALLOCATE(XCURRENT_RRTS ) - -DEALLOCATE(X_LES_BU_RES_KE ) -DEALLOCATE(X_LES_BU_RES_WThl ) -DEALLOCATE(X_LES_BU_RES_Thl2 ) -DEALLOCATE(X_LES_BU_RES_WRt ) -DEALLOCATE(X_LES_BU_RES_Rt2 ) -DEALLOCATE(X_LES_BU_RES_ThlRt) -DEALLOCATE(X_LES_BU_RES_Sv2 ) -DEALLOCATE(X_LES_BU_RES_WSv ) -DEALLOCATE(X_LES_BU_SBG_TKE ) -!------------------------------------------------------------------------------- -! -!* 10. end of LES computations for this time-step -! ------------------------------------------ -! -LLES_CALL=.FALSE. -CALL BUDGET_FLAGS(LUSERV, LUSERC, LUSERR, & - LUSERI, LUSERS, LUSERG, LUSERH ) -! -!------------------------------------------------------------------------------- -! -CONTAINS -! -! ########################################################################## - SUBROUTINE LES(OMASK) -! ########################################################################## -! -! -!!**** *LES* computes the current time-step LES diagnostics for one mask. -!! -!! -!! PURPOSE -!! ------- -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/02/00 -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS -! -USE MODI_LES_FLUX_ll -USE MODI_LES_3RD_MOMENT_ll -USE MODI_LES_4TH_MOMENT_ll -USE MODI_LES_MEAN_1PROC -USE MODI_LES_MEAN_MPROC -USE MODI_LES_PDF_ll -! -USE MODI_LES_HOR_CORR -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: OMASK ! 2D mask for computations -! -! -! -! 0.2 declaration of local variables -! -INTEGER :: JSV ! scalar variables counter -INTEGER :: JI -INTEGER :: JK ! vertical loop counter -INTEGER :: JPDF ! pdf counter -! -LOGICAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: GUPDRAFT_MASK -LOGICAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: GDOWNDRAFT_MASK -REAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZUPDRAFT -REAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZDOWNDRAFT -REAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZW_UP -REAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZWORK_LES -! -INTEGER, DIMENSION(SIZE(ZW_LES,3)) :: IAVG_PTS -INTEGER, DIMENSION(SIZE(ZW_LES,3)) :: IUND_PTS -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZAVG -! -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_U3 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_UV2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_UW2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_VU2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_V3 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_VW2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_WU2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_WV2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_U2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_V2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_W2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_U2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_V2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_W2 -REAL, DIMENSION(SIZE(ZW_LES,3),NPDF) :: ZPDF -! -INTEGER, DIMENSION(1) :: IKMIN_FLUX ! vertical index of min. W'thl' -INTEGER, DIMENSION(1) :: IKMAX_TH !vertical index maxdth -INTEGER, DIMENSION(1) :: IKMAX_CF ! vertical index of max. Cf -! -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZKE_TOT ! total turbulent kinetic energy -REAL :: ZINT_KE_TOT! integral of KE_TOT -REAL :: ZINT_RHOKE! integral of RHO*KE -REAL :: ZFRIC_SURF ! surface friction -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZFRIC_LES ! friction at all LES levels -! -!------------------------------------------------------------------------------- -! -! 1. local diagnostics (for any mask type) -! ----------------- -! -! -! 1.2 Number of points used for averaging on current processor -! -------------------------------------------------------- -! -!* to be sure to be coherent with other computations, -! a field on LES vertical grid (and horizontal mass point grid) is used. -! This information is necessary for the subgrid fluxes computations, because -! half of the work is already done, but the number of averaging points was -! not kept. -! -CALL LES_MEAN_1PROC ( XW_ANOM, OMASK, & - ZAVG(:), & - IAVG_PTS(:), & - IUND_PTS(:) ) -! -! -! 1.3 Number of points used for averaging on all processor -! ---------------------------------------------------- -! -CALL LES_MEAN_ll ( XW_ANOM, OMASK, & - ZAVG(:), & - NLES_AVG_PTS_ll(:,NLES_CURRENT_TCOUNT,IMASK), & - NLES_UND_PTS_ll(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -! -! 1.4 Mean quantities -! --------------- -! -IF (LLES_MEAN .AND. IMASK > 1) THEN -! -!* horizontal wind velocities -! - CALL LES_MEAN_ll ( ZU_LES, OMASK, & - XLES_MEAN_U(:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_MEAN_ll ( ZV_LES, OMASK, & - XLES_MEAN_V(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* vertical wind velocity -! - CALL LES_MEAN_ll ( ZW_LES, OMASK, & - XLES_MEAN_W(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* pressure -! - CALL LES_MEAN_ll ( ZP_LES, OMASK, & - XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* dynamical production TKE -! - CALL LES_MEAN_ll ( ZDP_LES, OMASK, & - XLES_MEAN_DP(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* thermal production TKE -! - CALL LES_MEAN_ll ( ZTP_LES, OMASK, & - XLES_MEAN_TP(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* transport TKE -! - CALL LES_MEAN_ll ( ZTR_LES, OMASK, & - XLES_MEAN_TR(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* dissipation TKE -! - CALL LES_MEAN_ll ( ZDISS_LES, OMASK, & - XLES_MEAN_DISS(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* mixing length -! - CALL LES_MEAN_ll ( ZLM_LES, OMASK, & - XLES_MEAN_LM(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* density -! - CALL LES_MEAN_ll ( ZRHO_LES, OMASK, & - XLES_MEAN_RHO(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -! -!* potential temperature -! - CALL LES_MEAN_ll ( ZTH_LES, OMASK, & - XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* mass flux - CALL LES_MEAN_ll ( ZMF_LES, OMASK, & - XLES_MEAN_Mf(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -! -!* virtual potential temperature -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZTHV_LES, OMASK, & - XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* liquid potential temperature -! - IF (LUSERC) THEN - CALL LES_MEAN_ll ( ZTHL_LES, OMASK, & - XLES_MEAN_Thl(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* vapor mixing ratio -! - IF (LUSERV) THEN - CALL LES_MEAN_ll ( ZRV_LES, OMASK, & - XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!*relative humidity -! - IF (LUSERV) THEN - CALL LES_MEAN_ll ( ZREHU_LES, OMASK, & - XLES_MEAN_Rehu(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* cloud mixing ratio -! - IF (LUSERC) THEN - CALL LES_MEAN_ll ( ZRC_LES, OMASK, & - XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,IMASK) ) - CALL LES_MEAN_ll ( ZRT_LES, OMASK, & - XLES_MEAN_Rt(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* rain mixing ratio -! - IF (LUSERR) THEN - CALL LES_MEAN_ll ( ZRR_LES, OMASK, & - XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* ice mixing ratio -! - IF (LUSERI) THEN - CALL LES_MEAN_ll ( ZRI_LES, OMASK, & - XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* snow mixing ratio -! - IF (LUSERS) THEN - CALL LES_MEAN_ll ( ZRS_LES, OMASK, & - XLES_MEAN_Rs(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* graupel mixing ratio -! - IF (LUSERG) THEN - CALL LES_MEAN_ll ( ZRG_LES, OMASK, & - XLES_MEAN_Rg(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* hail mixing ratio -! - IF (LUSERH) THEN - CALL LES_MEAN_ll ( ZRH_LES, OMASK, & - XLES_MEAN_Rh(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* scalar variables mixing ratio -! - DO JSV=1,NSV - CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), OMASK, & - XLES_MEAN_Sv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - END DO -END IF -! -!* wind modulus -! -IF (LLES_MEAN) THEN -! - ZWORK_LES =SQRT( ZU_LES**2 +ZV_LES**2 ) - CALL LES_MEAN_ll ( ZWORK_LES, OMASK, & - XLES_MEAN_WIND(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* vertical speed larger than mean vertical speed (updraft) -! - DO JK=1,NLES_K - ZW_UP(:,:,JK) = MAX(ZW_LES(:,:,JK), XLES_MEAN_W(JK,NLES_CURRENT_TCOUNT,IMASK)) - END DO -! -!* upward mass flux -! - ZWORK_LES = ZW_UP * ZRHO_LES - CALL LES_MEAN_ll ( ZWORK_LES, OMASK, & - XLES_RESOLVED_MASSFX(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* pdf calculation -! - IF (LLES_PDF) THEN - CALL LES_PDF_ll ( ZTH_LES,OMASK,XTH_PDF_MIN,XTH_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_TH(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - - CALL LES_PDF_ll ( ZW_LES,OMASK,XW_PDF_MIN,XW_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_W(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - CALL LES_PDF_ll ( ZTHV_LES,OMASK,XTHV_PDF_MIN,XTHV_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_THV(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - IF (LUSERV) THEN - CALL LES_PDF_ll ( ZRV_LES,OMASK,XRV_PDF_MIN,XRV_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_RV(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - END IF - IF (LUSERC) THEN - CALL LES_PDF_ll ( ZRC_LES,OMASK,XRC_PDF_MIN,XRC_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_RC(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - CALL LES_PDF_ll ( ZRT_LES,OMASK,XRT_PDF_MIN,XRT_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_RT(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - CALL LES_PDF_ll ( ZTHL_LES,OMASK,XTHL_PDF_MIN,XTHL_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_THL(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - END IF - IF (LUSERR) THEN - CALL LES_PDF_ll ( ZRR_LES,OMASK,XRR_PDF_MIN,XRR_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_RR(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - END IF - IF (LUSERI) THEN - CALL LES_PDF_ll ( ZRI_LES,OMASK,XRI_PDF_MIN,XRI_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_RI(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - END IF - IF (LUSERS) THEN - CALL LES_PDF_ll ( ZRS_LES,OMASK,XRS_PDF_MIN,XRS_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_RS(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - END IF - IF (LUSERG) THEN - CALL LES_PDF_ll ( ZRG_LES,OMASK,XRG_PDF_MIN,XRG_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_RG(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - END IF - END IF -! -!* mean vertical gradients -! - CALL LES_MEAN_ll ( ZDTHLDZ_LES, OMASK, XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) - CALL LES_MEAN_ll ( ZDUDZ_LES, OMASK, XLES_MEAN_DUDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) - CALL LES_MEAN_ll ( ZDVDZ_LES, OMASK, XLES_MEAN_DVDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) - CALL LES_MEAN_ll ( ZDWDZ_LES, OMASK, XLES_MEAN_DWDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) - IF (LUSERV) CALL LES_MEAN_ll ( ZDRtDZ_LES, OMASK, XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) - DO JSV=1,NSV - CALL LES_MEAN_ll ( ZDSVDZ_LES(:,:,:,JSV), OMASK, XLES_MEAN_DSVDZ(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - END DO - -END IF -!------------------------------------------------------------------------------- -! -! 1.5 Resolved quantities -! ------------------- -! -!* horizontal wind variances -! - CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM, & - OMASK, & - XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM, & - OMASK, & - XLES_RESOLVED_V2 (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* vertical wind variance -! - CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM, & - OMASK, & - XLES_RESOLVED_W2 (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* pressure variance -! - CALL LES_FLUX_ll ( ZP_ANOM, ZP_ANOM, & - OMASK, & - XLES_RESOLVED_P2 (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* potential temperature variance -! - CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM, & - OMASK, & - XLES_RESOLVED_TH2(:,NLES_CURRENT_TCOUNT,IMASK) ) - -! -!* resolved turbulent kinetic energy -! - XLES_RESOLVED_Ke(:,NLES_CURRENT_TCOUNT,IMASK) = XUNDEF -! - WHERE(XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK) /= XUNDEF) & - XLES_RESOLVED_Ke(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*( & - XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK) & - + XLES_RESOLVED_V2 (:,NLES_CURRENT_TCOUNT,IMASK) & - + XLES_RESOLVED_W2 (:,NLES_CURRENT_TCOUNT,IMASK)) -! -!* potential temperature - virtual potential temperature covariance -! - IF (LUSERV) THEN - CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM, & - OMASK, & - XLES_RESOLVED_THTHV(:,NLES_CURRENT_TCOUNT,IMASK) ) - -! -!* vapor mixing ratio variance -! - CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_Rv2(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -! -!* potential temperature - vapor mixing ratio correlation -! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_ThRv(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* virtual potential temperature - vapor mixing ratio correlation -! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_ThvRv(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -! -!* liquid potential temperature - virtual potential temperature covariance -! - IF (LUSERC) THEN - CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM, & - OMASK, & - XLES_RESOLVED_THLTHV(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* liquid potential temperature variance -! - CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM, & - OMASK, & - XLES_RESOLVED_THL2(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* total water mixing ratio variance -! - CALL LES_FLUX_ll ( XRT_ANOM, XRT_ANOM, & - OMASK, & - XLES_RESOLVED_Rt2(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* cloud mixing ratio variance -! - CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_Rc2(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* potential temperature - cloud mixing ratio correlation -! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_ThRc(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* liquid potential temperature - vapor mixing ratio correlation -! - CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_ThlRv(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* liquid potential temperature - cloud mixing ratio correlation -! - CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_ThlRc(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* virtual potential temperature - cloud mixing ratio correlation -! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_ThvRc(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -! variance of lwp -! - IF (IMASK .EQ. 1) THEN - CALL LES_FLUX_ll (ZLWP_ANOM, ZLWP_ANOM, & - OMASK(:,:,1), & - XLES_LWPVAR(NLES_CURRENT_TCOUNT) ) - END IF - END IF -! -!* ice mixing ratio variance -! - IF (LUSERI) THEN - CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_Ri2(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* potential temperature - ice mixing ratio correlation -! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_ThRi(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* liquid potential temperature - ice mixing ratio correlation -! - CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_ThlRi(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* virtual potential temperature - ice mixing ratio correlation -! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_ThvRi(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* scalar variable mixing ratio variances -! - DO JSV=1,NSV - CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) -! -!* potential temperature - scalar variables ratio correlation -! - CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_ThSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) -! -!* liquid potential temperature - scalar variables ratio correlation -! - IF (LUSERC) THEN - CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_ThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - END IF -! -!* virtual potential temperature - scalar variables ratio correlation -! - IF (LUSERV) THEN - CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_ThvSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - END IF - END DO -! -! -!* wind fluxes -! - CALL LES_FLUX_ll ( XU_ANOM, XV_ANOM, & - OMASK, & - XLES_RESOLVED_UV (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, XU_ANOM, & - OMASK, & - XLES_RESOLVED_WU (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, XV_ANOM, & - OMASK, & - XLES_RESOLVED_WV (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* pressure fluxes -! - CALL LES_FLUX_ll ( XU_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_UP (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_VP (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_WP (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* theta fluxes -! - CALL LES_FLUX_ll ( XU_ANOM, ZTH_ANOM, & - OMASK, & - XLES_RESOLVED_UTh (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_FLUX_ll ( XV_ANOM, ZTH_ANOM, & - OMASK, & - XLES_RESOLVED_VTh (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM, & - OMASK, & - XLES_RESOLVED_WTh (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* virtual theta fluxes -! - IF (LUSERV) THEN - CALL LES_FLUX_ll ( XU_ANOM, ZTHV_ANOM, & - OMASK, & - XLES_RESOLVED_UThv (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, ZTHV_ANOM, & - OMASK, & - XLES_RESOLVED_VThv (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM, & - OMASK, & - XLES_RESOLVED_WThv (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* vapor mixing ratio fluxes -! - CALL LES_FLUX_ll ( XU_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_URv (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_VRv (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_WRv (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* cloud water mixing ratio fluxes -! - IF (LUSERC) THEN - CALL LES_FLUX_ll ( XU_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_URc (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_VRc (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_WRc (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* liquid theta fluxes -! - CALL LES_FLUX_ll ( XU_ANOM, XTHL_ANOM, & - OMASK, & - XLES_RESOLVED_UThl (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, XTHL_ANOM, & - OMASK, & - XLES_RESOLVED_VThl (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM, & - OMASK, & - XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* total water mixing ratio fluxes -! - CALL LES_FLUX_ll ( XW_ANOM, XRT_ANOM, & - OMASK, & - XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* cloud ice mixing ratio fluxes -! - IF (LUSERI) THEN - CALL LES_FLUX_ll ( XU_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_URi (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_VRi (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_WRi (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF - IF (LUSERR) THEN - CALL LES_FLUX_ll ( XW_ANOM, ZRR_ANOM, & - OMASK, & - XLES_RESOLVED_WRr (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! - -! -!* scalar variables fluxes -! - DO JSV=1,NSV - CALL LES_FLUX_ll ( XU_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_USv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) -! - CALL LES_FLUX_ll ( XV_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_VSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) -! - CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_WSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - END DO -! -!* skewness -! - CALL LES_3RD_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM, & - OMASK, & - XLES_RESOLVED_U3 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM, & - OMASK, & - XLES_RESOLVED_V3 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XW_ANOM, & - OMASK, & - XLES_RESOLVED_W3 (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* kurtosis -! - CALL LES_4TH_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM, XU_ANOM, & - OMASK, & - XLES_RESOLVED_U4 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_4TH_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM, XV_ANOM, & - OMASK, & - XLES_RESOLVED_V4 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_4TH_MOMENT_ll ( XW_ANOM, XW_ANOM, XW_ANOM, XW_ANOM, & - OMASK, & - XLES_RESOLVED_W4 (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* third moments of liquid potential temperature -! - IF (LUSERC) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XTHL_ANOM, & - OMASK, & - XLES_RESOLVED_WThl2(:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XTHL_ANOM, & - OMASK, & - XLES_RESOLVED_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK) ) - - ELSE - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZTH_ANOM, & - OMASK, & - XLES_RESOLVED_WThl2(:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZTH_ANOM, & - OMASK, & - XLES_RESOLVED_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* third moments of water vapor -! - IF (LUSERV) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_WRv2 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_W2Rv (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF - - IF (LUSERC) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_WThlRv(:,NLES_CURRENT_TCOUNT,IMASK) ) - ELSE IF (LUSERV) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_WThlRv(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* third moments of total water -! - IF (LUSERC) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XRT_ANOM, XRT_ANOM, & - OMASK, & - XLES_RESOLVED_WRt2 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XRT_ANOM, & - OMASK, & - XLES_RESOLVED_W2Rt (:,NLES_CURRENT_TCOUNT,IMASK) ) - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XRT_ANOM, & - OMASK, & - XLES_RESOLVED_WThlRt (:,NLES_CURRENT_TCOUNT,IMASK) ) - ELSE IF (LUSERV) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_WRt2 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_W2Rt (:,NLES_CURRENT_TCOUNT,IMASK) ) - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_WThlRt (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* third moments of cloud water -! - IF (LUSERC) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRC_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_WRc2 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_W2Rc (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_WThlRc(:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_WRvRc (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* third moments of cloud ice -! - IF (LUSERI) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRI_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_WRi2 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_W2Ri (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_WThlRi(:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_WRvRi (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* third moments of scalar variables -! - DO JSV=1,NSV - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_WSv2 (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_W2Sv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - IF (LUSERC) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_WThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - ELSE - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_WThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - END IF - - IF (LUSERV) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_WRvSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - END IF - END DO -! -!* presso-correlations -! -! - CALL LES_FLUX_ll ( XTHL_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_ThlPz(:,NLES_CURRENT_TCOUNT,IMASK) ) - - IF (LUSERV) & - CALL LES_FLUX_ll ( ZRV_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_RvPz(:,NLES_CURRENT_TCOUNT,IMASK) ) - - IF (LUSERC) THEN - CALL LES_FLUX_ll ( XRT_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_RtPz(:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_FLUX_ll ( ZRC_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_RcPz(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF - - IF (LUSERI) & - CALL LES_FLUX_ll ( ZRI_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_RiPz(:,NLES_CURRENT_TCOUNT,IMASK) ) - -! -! -!* resolved turbulent kinetic energy fluxes -! - - CALL LES_3RD_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM, & - OMASK, & - ZLES_RESOLVED_U3 (:) ) - - CALL LES_3RD_MOMENT_ll ( XU_ANOM, XV_ANOM, XV_ANOM, & - OMASK, & - ZLES_RESOLVED_UV2 (:) ) - - CALL LES_3RD_MOMENT_ll ( XU_ANOM, XW_ANOM, XW_ANOM, & - OMASK, & - ZLES_RESOLVED_UW2 (:) ) - - XLES_RESOLVED_UKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*( ZLES_RESOLVED_U3 & - + ZLES_RESOLVED_UV2 & - + ZLES_RESOLVED_UW2 ) - - - - CALL LES_3RD_MOMENT_ll ( XV_ANOM, XU_ANOM, XU_ANOM, & - OMASK, & - ZLES_RESOLVED_VU2 (:) ) - - CALL LES_3RD_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM, & - OMASK, & - ZLES_RESOLVED_V3 (:) ) - - CALL LES_3RD_MOMENT_ll ( XV_ANOM, XW_ANOM, XW_ANOM, & - OMASK, & - ZLES_RESOLVED_VW2 (:) ) - - XLES_RESOLVED_VKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*( ZLES_RESOLVED_VU2 & - + ZLES_RESOLVED_V3 & - + ZLES_RESOLVED_VW2 ) - - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XU_ANOM, XU_ANOM, & - OMASK, & - ZLES_RESOLVED_WU2 (:) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XV_ANOM, XV_ANOM, & - OMASK, & - ZLES_RESOLVED_WV2 (:) ) - - XLES_RESOLVED_WKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*( ZLES_RESOLVED_WU2 & - + ZLES_RESOLVED_WV2 & - + XLES_RESOLVED_W3(:,NLES_CURRENT_TCOUNT,IMASK) ) - -! -! -!------------------------------------------------------------------------------- -! -! 1.6 Subgrid quantities -! ------------------ -! -IF (LLES_SUBGRID) THEN -! -!* wind fluxes and variances -! - CALL LES_MEAN_ll ( ZTKE_LES, OMASK, & - XLES_SUBGRID_Tke(:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_UV(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WU(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WV(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_U2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_V2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! -! -!* liquid potential temperature fluxes -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_UThl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_VThl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - -!* liquid potential temperature variance -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! -!* Mass flux scheme of shallow convection -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_THLUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_RTUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_RVUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_RCUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_RIUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_MASSFLUX(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_DETR(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_ENTR(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_FRACUP(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_THVUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTHLMF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRTMF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WUMF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WVMF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - -!* total water mixing ratio fluxes, correlation and variance -! - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_SUBGRID_URt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_VRt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK),& - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_Rt2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - END IF -! -!* scalar variances -! - DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_SUBGRID_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - END DO -! -!* cloud water mixing ratio fluxes -! - IF (LUSERC) THEN - CALL LES_MEAN_MPROC ( XLES_SUBGRID_URc(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_VRc(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRc(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - END IF -! -!* scalar variables fluxes -! - DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_SUBGRID_USv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_VSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - END DO -! -!* subgrid turbulent kinetic energy fluxes -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_UTke(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_VTke(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTke(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_ddz_WTke(:,NLES_CURRENT_TCOUNT,IMASK),& - IAVG_PTS(:), IUND_PTS(:) ) -! -!* fluxes and correlations with virtual potential temperature -! - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThv(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlThv(:,NLES_CURRENT_TCOUNT,IMASK),& - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_RtThv(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_SUBGRID_SvThv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - END DO - END IF -! -!* third order fluxes -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThl2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Rt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThlRt(:,NLES_CURRENT_TCOUNT,IMASK),& - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRt2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - END IF - DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Sv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WSv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - END DO -! -!* dissipative terms -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Tke(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Rt2(:,NLES_CURRENT_TCOUNT,IMASK),& - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK),& - IAVG_PTS(:), IUND_PTS(:) ) - END IF - - DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - END DO -! -!* presso-correlation terms -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WP(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlPz(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_SUBGRID_RtPz(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - END IF - - DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_SUBGRID_SvPz(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - END DO - -!* phi3 and psi3 terms -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_PHI3(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_SUBGRID_PSI3(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - END IF -! -!* subgrid mixing length -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_LMix(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! -!* subgrid dissipative length -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_LDiss(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! -!* eddy diffusivities -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_Km(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_Kh(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - -END IF -! -! computation of KHT and KHR depending on LLES - IF (LUSERC) THEN - IF (LLES_RESOLVED) THEN - XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0. - WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & - XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1. & - *XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK)/ & - XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK) - XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0. - WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & - XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.* & - XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK)/ & - XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK) - END IF - IF (LLES_SUBGRID) THEN - XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0. - WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & - XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1. & - *XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,IMASK) / & - XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK) - XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0. - WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & - XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.* & - XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,IMASK) / & - XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK) - END IF - IF (LLES_RESOLVED .AND. LLES_SUBGRID) THEN - XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0. - WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & - XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1. & - *(XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK)+ & - XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,IMASK))/ & - XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK) - XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0. - WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & - XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.* & - (XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK)+ & - XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,IMASK)) / & - XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK) - END IF - END IF -!------------------------------------------------------------------------------- -! -! 1.7 Interaction of subgrid and resolved quantities -! ---------------------------------------------- -! -!* WARNING: these terms also contain the term due to the mean flow. -! this mean flow contribution will be removed from them -! when treated in write_les_budgetn.f90 -! -! -!* subgrid turbulent kinetic energy fluxes -! -IF (LLES_RESOLVED) THEN - CALL LES_FLUX_ll ( XU_ANOM, ZTKE_LES, & - OMASK, & - XLES_RES_U_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, ZTKE_LES, & - OMASK, & - XLES_RES_V_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, ZTKE_LES, & - OMASK, & - XLES_RES_W_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK) ) -END IF -! -!* WARNING: these terms also contain the term due to the mean flow. -! this mean flow contribution will be removed from them -! when treated in write_les_budgetn.f90 -! -!* production terms for subgrid quantities -! -IF (LLES_RESOLVED .AND. LLES_SUBGRID) THEN - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_U_SBG_UaU(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_V_SBG_UaV(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddz_Thl_SBG_W2 (:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddz_Rt_SBG_W2 (:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - END IF -! -!* WARNING: these terms also contain the term due to the mean flow. -! this mean flow contribution will be removed from them -! when treated in write_les_budgetn.f90 -! -!* turbulent transport and advection terms for subgrid quantities -! - CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WThl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WRt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Rt2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - END IF - - DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - END DO -END IF -! -!------------------------------------------------------------------------------- -! -! 2. The following is for cartesian mask only -! ---------------------------------------- -! -IF (IMASK>1) RETURN -! -!------------------------------------------------------------------------------- -! -! 3. Updraft diagnostics -! ------------------- -! -IF (LLES_UPDRAFT) THEN -! - DO JK=1,NLES_K - GUPDRAFT_MASK(:,:,JK) = (XW_ANOM(:,:,JK) > 0.) .AND. LLES_CURRENT_CART_MASK(:,:,JK) - END DO -! -! -! 3.1 Updraft fraction -! ---------------- -! - ZUPDRAFT(:,:,:) = 0. - WHERE (GUPDRAFT_MASK(:,:,:)) - ZUPDRAFT(:,:,:) = 1. - END WHERE -! - CALL LES_MEAN_ll ( ZUPDRAFT, OMASK, & - XLES_UPDRAFT(:,NLES_CURRENT_TCOUNT) ) -! -! -! 3.2 Updraft mean quantities -! ----------------------- -! -!* vertical wind velocity -! - CALL LES_MEAN_ll ( ZW_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_W(:,NLES_CURRENT_TCOUNT) ) -! -!* potential temperature -! - CALL LES_MEAN_ll ( ZTH_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Th(:,NLES_CURRENT_TCOUNT) ) -! -!* liquid potential temperature -! - IF (LUSERC) & - CALL LES_MEAN_ll ( ZTHL_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Thl(:,NLES_CURRENT_TCOUNT) ) -! -!* virtual potential temperature -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZTHV_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Thv(:,NLES_CURRENT_TCOUNT) ) -! -!* vapor mixing ratio -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZRV_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Rv(:,NLES_CURRENT_TCOUNT) ) -! -!* cloud water mixing ratio -! - IF (LUSERC) & - CALL LES_MEAN_ll ( ZRC_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Rc(:,NLES_CURRENT_TCOUNT) ) -! -!* rain mixing ratio -! - IF (LUSERR) & - CALL LES_MEAN_ll ( ZRR_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Rr(:,NLES_CURRENT_TCOUNT) ) -! -!* cloud ice mixing ratio -! - IF (LUSERI) & - CALL LES_MEAN_ll ( ZRI_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Ri(:,NLES_CURRENT_TCOUNT) ) -! -!* snow mixing ratio -! - IF (LUSERS) & - CALL LES_MEAN_ll ( ZRS_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Rs(:,NLES_CURRENT_TCOUNT) ) -! -!* graupel mixing ratio -! - IF (LUSERG) & - CALL LES_MEAN_ll ( ZRG_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Rg(:,NLES_CURRENT_TCOUNT) ) -! -!* hail mixing ratio -! - IF (LUSERH) & - CALL LES_MEAN_ll ( ZRG_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Rh(:,NLES_CURRENT_TCOUNT) ) -! -!* scalar variables -! - DO JSV=1,NSV - CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), GUPDRAFT_MASK, & - XLES_UPDRAFT_Sv(:,NLES_CURRENT_TCOUNT,JSV) ) - END DO -! -!* subgrid turbulent kinetic energy -! - CALL LES_MEAN_ll ( ZTKE_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Tke(:,NLES_CURRENT_TCOUNT) ) -! -! -! 3.3 Updraft resolved quantities -! --------------------------- -! -! -!* resolved turbulent kinetic energy -! - CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM, & - GUPDRAFT_MASK, & - ZLES_UPDRAFT_U2(:) ) - - CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM, & - GUPDRAFT_MASK, & - ZLES_UPDRAFT_V2(:) ) - - CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM, & - GUPDRAFT_MASK, & - ZLES_UPDRAFT_W2(:) ) - - XLES_UPDRAFT_Ke(:,NLES_CURRENT_TCOUNT) = 0.5 * ( ZLES_UPDRAFT_U2(:) & - + ZLES_UPDRAFT_V2(:) & - + ZLES_UPDRAFT_W2(:) ) -! -!* vertical potential temperature flux -! - CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_WTh(:,NLES_CURRENT_TCOUNT) ) -! -!* vertical liquid potential temperature flux -! - IF (LUSERC) & - CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_WThl(:,NLES_CURRENT_TCOUNT) ) -! -!* vertical virtual potential temperature flux -! - IF (LUSERV) & - CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_WThv(:,NLES_CURRENT_TCOUNT) ) -! -!* potential temperature variance -! - CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_Th2(:,NLES_CURRENT_TCOUNT) ) -! -!* liquid potential temperature variance -! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_Thl2(:,NLES_CURRENT_TCOUNT) ) -! -!* potential temperature - virtual potential temperature covariance -! - IF (LUSERV) & - CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThThv (:,NLES_CURRENT_TCOUNT) ) -! -!* liquid potential temperature - virtual potential temperature covariance -! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThlThv(:,NLES_CURRENT_TCOUNT) ) -! -!* water vapor mixing ratio flux, variance and correlations -! - IF (LUSERV) THEN - CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_WRv(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_Rv2(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThRv (:,NLES_CURRENT_TCOUNT) ) - ! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThlRv(:,NLES_CURRENT_TCOUNT) ) - - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThvRv(:,NLES_CURRENT_TCOUNT) ) - END IF -! -!* cloud water mixing ratio flux -! - IF (LUSERC) THEN - CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_WRc(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_Rc2(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThRc (:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThlRc(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThvRc(:,NLES_CURRENT_TCOUNT) ) - END IF -! -!* cloud ice mixing ratio flux -! - IF (LUSERI) THEN - CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_WRi(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_Ri2(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThRi (:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThlRi(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThvRi(:,NLES_CURRENT_TCOUNT) ) - END IF -! -!* scalar variables flux -! - DO JSV=1,NSV - CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV), & - GUPDRAFT_MASK, & - XLES_UPDRAFT_WSv(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV), & - GUPDRAFT_MASK, & - XLES_UPDRAFT_Sv2(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV), & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThSv(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV), & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThlSv(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - IF (LUSERV) & - CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV), & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThvSv(:,NLES_CURRENT_TCOUNT,JSV) ) - END DO -! -END IF -! -!------------------------------------------------------------------------------- -! -! 4. Downdraft diagnostics -! --------------------- -! -IF (LLES_DOWNDRAFT) THEN -! - DO JK=1,NLES_K - GDOWNDRAFT_MASK(:,:,JK) = (XW_ANOM(:,:,JK) <= 0.) .AND. LLES_CURRENT_CART_MASK(:,:,JK) - END DO -! -! -! 4.1 Downdraft fraction -! ------------------ -! - ZDOWNDRAFT(:,:,:) = 0. - WHERE (GDOWNDRAFT_MASK(:,:,:)) - ZDOWNDRAFT(:,:,:) = 1. - END WHERE -! - CALL LES_MEAN_ll ( ZDOWNDRAFT, OMASK, & - XLES_DOWNDRAFT(:,NLES_CURRENT_TCOUNT) ) -! -! -! 4.2 Downdraft mean quantities -! ------------------------- -! -!* vertical wind velocity -! - CALL LES_MEAN_ll ( ZW_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_W(:,NLES_CURRENT_TCOUNT) ) -! -!* potential temperature -! - CALL LES_MEAN_ll ( ZTH_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Th(:,NLES_CURRENT_TCOUNT) ) -! -!* liquid potential temperature -! - IF (LUSERC) & - CALL LES_MEAN_ll ( ZTHL_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Thl(:,NLES_CURRENT_TCOUNT) ) -! -!* virtual potential temperature -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZTHV_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Thv(:,NLES_CURRENT_TCOUNT) ) -! -!* vapor mixing ratio -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZRV_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rv(:,NLES_CURRENT_TCOUNT) ) -! -!* cloud water mixing ratio -! - IF (LUSERC) & - CALL LES_MEAN_ll ( ZRC_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rc(:,NLES_CURRENT_TCOUNT) ) -! -!* rain mixing ratio -! - IF (LUSERR) & - CALL LES_MEAN_ll ( ZRR_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rr(:,NLES_CURRENT_TCOUNT) ) -! -!* cloud ice mixing ratio -! - IF (LUSERI) & - CALL LES_MEAN_ll ( ZRI_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Ri(:,NLES_CURRENT_TCOUNT) ) -! -!* snow mixing ratio -! - IF (LUSERS) & - CALL LES_MEAN_ll ( ZRS_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rs(:,NLES_CURRENT_TCOUNT) ) -! -!* graupel mixing ratio -! - IF (LUSERG) & - CALL LES_MEAN_ll ( ZRG_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rg(:,NLES_CURRENT_TCOUNT) ) -! -!* hail mixing ratio -! - IF (LUSERH) & - CALL LES_MEAN_ll ( ZRG_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rh(:,NLES_CURRENT_TCOUNT) ) -! -!* scalar variables -! - DO JSV=1,NSV - CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Sv(:,NLES_CURRENT_TCOUNT,JSV) ) - END DO -! -!* subgrid turbulent kinetic energy -! - CALL LES_MEAN_ll ( ZTKE_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Tke(:,NLES_CURRENT_TCOUNT) ) -! -! -! 4.3 Downdraft resolved quantities -! ----------------------------- -! -!* resolved turbulent kinetic energy -! - CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM, & - GDOWNDRAFT_MASK, & - ZLES_DOWNDRAFT_U2(:) ) - - CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM, & - GDOWNDRAFT_MASK, & - ZLES_DOWNDRAFT_V2(:) ) - - CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM, & - GDOWNDRAFT_MASK, & - ZLES_DOWNDRAFT_W2(:) ) - - XLES_DOWNDRAFT_Ke(:,NLES_CURRENT_TCOUNT) = 0.5 * ( ZLES_DOWNDRAFT_U2(:) & - + ZLES_DOWNDRAFT_V2(:) & - + ZLES_DOWNDRAFT_W2(:) ) -! -!* vertical potential temperature flux -! - CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_WTh(:,NLES_CURRENT_TCOUNT) ) -! -!* vertical liquid potential temperature flux -! - IF (LUSERC) & - CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_WThl(:,NLES_CURRENT_TCOUNT) ) -! -!* vertical virtual potential temperature flux -! - IF (LUSERV) & - CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_WThv(:,NLES_CURRENT_TCOUNT) ) -! -!* potential temperature variance -! - CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Th2(:,NLES_CURRENT_TCOUNT) ) -! -!* liquid potential temperature variance -! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Thl2(:,NLES_CURRENT_TCOUNT) ) -! -!* potential temperature - virtual potential temperature covariance -! - IF (LUSERV) & - CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThThv (:,NLES_CURRENT_TCOUNT) ) -! -!* liquid potential temperature - virtual potential temperature covariance -! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThlThv(:,NLES_CURRENT_TCOUNT) ) -! -! -!* water vapor mixing ratio flux, variance and correlations -! - IF (LUSERV) THEN - CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_WRv(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rv2(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThRv (:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThvRv(:,NLES_CURRENT_TCOUNT) ) - ! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThlRv(:,NLES_CURRENT_TCOUNT) ) - END IF -! -!* cloud water mixing ratio flux -! - IF (LUSERC) THEN - CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_WRc(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rc2(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThRc (:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThvRc(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThlRc(:,NLES_CURRENT_TCOUNT) ) - END IF -! -!* cloud ice mixing ratio flux -! - IF (LUSERI) THEN - CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_WRi(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Ri2(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThRi (:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThvRi(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThlRi(:,NLES_CURRENT_TCOUNT) ) - END IF -! -!* scalar variables flux -! - DO JSV=1,NSV - CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV), & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_WSv(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV), & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Sv2(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV), & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThSv(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV), & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThlSv(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - IF (LUSERV) & - CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV), & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThvSv(:,NLES_CURRENT_TCOUNT,JSV) ) - END DO -! -END IF -! -!------------------------------------------------------------------------------- -! -! 5. surface or 2D variables (only for the cartesian mask) -! ----------------------- -! -!* surface flux of temperature Qo -! -CALL LES_MEAN_MPROC ( XLES_Q0 (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) -! -!* surface flux of water vapor Eo -! -CALL LES_MEAN_MPROC ( XLES_E0 (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) -! -!* surface flux for scalar variables -! -DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_SV0 (NLES_CURRENT_TCOUNT,JSV), IAVG_PTS(1), IUND_PTS(1) ) -END DO -! -!* surface flux of U wind component -! -CALL LES_MEAN_MPROC ( XLES_UW0 (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) -! -!* surface flux of V wind component -! -CALL LES_MEAN_MPROC ( XLES_VW0 (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) -! -!* friction velocity u* -! -!* average of local u* -!!CALL LES_MEAN_MPROC ( XLES_USTAR(NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) -!* or true global u* -XLES_USTAR(NLES_CURRENT_TCOUNT) = SQRT(SQRT(XLES_UW0(NLES_CURRENT_TCOUNT)**2 & - +XLES_VW0(NLES_CURRENT_TCOUNT)**2 )) -! -!* Boundary layer height -! -IF (CBL_HEIGHT_DEF=='WTV') THEN -! -!* level where temperature flux is minimum -! -ALLOCATE(ZWORK(SIZE(XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK),1))) -ZWORK=XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK) -WHERE(ZWORK==XUNDEF) ZWORK=0. - - IF (LUSERC) THEN - IKMIN_FLUX = MINLOC( XLES_RESOLVED_WThv(:,NLES_CURRENT_TCOUNT,1) & - + XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,1) & - + ZWORK & ! flux if EDKF - + (XRV/XRD - 1.) *( XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,1) & - -XLES_SUBGRID_WRc (:,NLES_CURRENT_TCOUNT,1)) ) - ELSE IF (LUSERV) THEN - IKMIN_FLUX = MINLOC( XLES_RESOLVED_WThv(:,NLES_CURRENT_TCOUNT,1) & - + ZWORK & ! flux if EDKF - + XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,1) & - + (XRV/XRD - 1.) * XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,1) ) - ELSE - IKMIN_FLUX = MINLOC( XLES_RESOLVED_WTh(:,NLES_CURRENT_TCOUNT,1) & - + ZWORK & ! flux if EDKF - + XLES_SUBGRID_WThl(:,NLES_CURRENT_TCOUNT,1) ) - END IF -DEALLOCATE(ZWORK) -! -!* boundary layer height -! - XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(IKMIN_FLUX(1)) - XLES_ZS -! -ELSE IF (CBL_HEIGHT_DEF=='DTH') THEN - IKMAX_TH=MAXLOC( ZLES_MEAN_DTHDZ(:)) - XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_TH(1)) - XLES_ZS -! -ELSE IF (CBL_HEIGHT_DEF=='KE ') THEN - - XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(NLES_K) - XLES_ZS -! -!* total Turbulent Kinetic Energy -! - ZKE_TOT(:) = 0. -! - ZKE_TOT(:) = ZKE_TOT(:) + XLES_SUBGRID_TKE (:,NLES_CURRENT_TCOUNT,1) -! - IF (CTURBLEN/='BL89' .AND. CTURBLEN/='RM17' .AND. LLES_RESOLVED) & - ZKE_TOT(:) = ZKE_TOT(:) + XLES_RESOLVED_KE(:,NLES_CURRENT_TCOUNT,1) -! - ZINT_KE_TOT = 0. -! -!* integration of total kinetic energy on boundary layer depth -! - ZINT_KE_TOT = ZINT_KE_TOT +XLES_Z(1)*ZKE_TOT(1) - DO JK=1,NLES_K-1 - ZINT_KE_TOT = ZINT_KE_TOT + (XLES_Z(JK+1)-XLES_Z(JK)) & - * 0.5 *( ZKE_TOT(JK+1) + ZKE_TOT(JK) ) -! -!* test of total kinetic energy smaller than 5% of the averaged value below -! - IF ( ZKE_TOT(JK+1) < 0.05 * ZINT_KE_TOT / (XLES_Z(JK+1)-XLES_Z(1)) ) THEN - XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(JK) - XLES_ZS - EXIT - END IF -! - END DO -! -ELSE IF (CBL_HEIGHT_DEF=='TKE') THEN - - XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(NLES_K) - XLES_ZS -! -!* subgrid Turbulent Kinetic Energy -! - ZKE_TOT(:) = XLES_SUBGRID_TKE (:,NLES_CURRENT_TCOUNT,1) -! - ZINT_KE_TOT = 0. -! -!* integration of subgrid kinetic energy on boundary layer depth -! - DO JK=1,NLES_K-1 - ZINT_KE_TOT = ZINT_KE_TOT + (XLES_Z(JK+1)-XLES_Z(JK)) & - * 0.5 *( ZKE_TOT(JK+1) + ZKE_TOT(JK) ) -! -!* test of subgrid kinetic energy smaller than 0.1% of the averaged value below -! - IF ( ZKE_TOT(JK+1) < 0.001 * ZINT_KE_TOT / (XLES_Z(JK+1)-XLES_Z(1)) ) THEN - XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(JK) - XLES_ZS - EXIT - END IF - END DO -ELSE IF (CBL_HEIGHT_DEF=='FRI') THEN - ZFRIC_LES = SQRT( ( XLES_SUBGRID_WU (:,NLES_CURRENT_TCOUNT,1) & - +XLES_RESOLVED_WU(:,NLES_CURRENT_TCOUNT,1))**2 & - +( XLES_SUBGRID_WV (:,NLES_CURRENT_TCOUNT,1) & - +XLES_RESOLVED_WV(:,NLES_CURRENT_TCOUNT,1))**2 ) - ZFRIC_SURF = XLES_USTAR(NLES_CURRENT_TCOUNT)**2 - CALL BL_DEPTH_DIAG(YLDIMPHYEX,ZFRIC_SURF, XLES_ZS, & - ZFRIC_LES, XLES_Z, & - XFTOP_O_FSURF,XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT)) -END IF -! -! -!* integration of total kinetic energy on boundary layer depth -! -XLES_INT_TKE(NLES_CURRENT_TCOUNT)=ZINT_KE_TOT - !* integration of tke - ZTKET_LES(:,:) = 0. - DO JK=1,NLES_K-1 - ZKE_LES(:,:,JK)=0.5*(XU_ANOM(:,:,JK)*XU_ANOM(:,:,JK)+& - XV_ANOM(:,:,JK)*XV_ANOM(:,:,JK)+XW_ANOM(:,:,JK)*XW_ANOM(:,:,JK)) - - ZTKET_LES(:,:) = ZTKET_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & - * (ZTKE_LES(:,:,JK)+ZKE_LES(:,:,JK)) - END DO - CALL LES_MEAN_ll ( ZTKET_LES, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_INT_TKE(NLES_CURRENT_TCOUNT) ) -! -!* convective velocity -! -XLES_WSTAR(NLES_CURRENT_TCOUNT) = 0. -! -IF ( XLES_Q0(NLES_CURRENT_TCOUNT) & - + (XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT) >0.) THEN - IF (LUSERV) THEN - XLES_WSTAR(NLES_CURRENT_TCOUNT) = & - ( XG / XLES_MEAN_Thv (1,NLES_CURRENT_TCOUNT,1) & - * ( XLES_Q0( NLES_CURRENT_TCOUNT ) & - + (XRV/XRD - 1.) * XLES_E0( NLES_CURRENT_TCOUNT )) & - * XLES_BL_HEIGHT( NLES_CURRENT_TCOUNT ) & - ) ** (1./3.) - ELSE - XLES_WSTAR(NLES_CURRENT_TCOUNT) = & - ( XG / XLES_MEAN_Th (1,NLES_CURRENT_TCOUNT,1) & - * ( XLES_Q0( NLES_CURRENT_TCOUNT ) & - + (XRV/XRD - 1.) * XLES_E0( NLES_CURRENT_TCOUNT )) & - * XLES_BL_HEIGHT( NLES_CURRENT_TCOUNT ) & - ) ** (1./3.) - END IF -END IF -! -!* cloud base height - IF (LUSERC) THEN - ZINT_RHOKE =0. - JJ=1 - DO JI=1,NLES_K - IF ((ZINT_RHOKE .EQ. 0) .AND. & - (XLES_MEAN_RC(JI,NLES_CURRENT_TCOUNT,1) .GT. 1.E-6)) THEN - ZINT_RHOKE=1. - JJ=JI - END IF - END DO - XLES_ZCB(NLES_CURRENT_TCOUNT)= XLES_Z(JJ)-XLES_ZS - ENDIF -! -!* height of max of cf - IF (LUSERC) THEN - IKMAX_CF= MAXLOC( XLES_MEAN_INDCf(:,NLES_CURRENT_TCOUNT,1)) - XLES_ZMAXCF(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_CF(1)) - XLES_ZS - IKMAX_CF= MAXLOC( XLES_MEAN_INDCf2(:,NLES_CURRENT_TCOUNT,1)) - XLES_ZMAXCF2(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_CF(1)) - XLES_ZS - ENDIF -! -!* Monin-Obukhov length -! -XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = 0. -! -IF (LUSERV) THEN - IF ( XLES_Q0(NLES_CURRENT_TCOUNT)+(XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT) /=0. )& - XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = (- (XLES_USTAR(NLES_CURRENT_TCOUNT))**3) & - / (XKARMAN*( XLES_Q0(NLES_CURRENT_TCOUNT) & - +(XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT)) & - *XG/XLES_MEAN_Thv(1,NLES_CURRENT_TCOUNT,1) ) -ELSE - IF ( XLES_Q0(NLES_CURRENT_TCOUNT) /=0. ) & - XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = (- (XLES_USTAR(NLES_CURRENT_TCOUNT))**3) & - / (XKARMAN*XLES_Q0(NLES_CURRENT_TCOUNT) & - *XG/XLES_MEAN_Th(1,NLES_CURRENT_TCOUNT,1) ) -END IF -! -!------------------------------------------------------------------------------- -! -! 6. correlations along x and y axes -! ------------------------------- -! -!* u * u -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZU_SPEC(:,:,JK), ZU_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_UU(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_UU(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* v * v -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZV_SPEC(:,:,JK), ZV_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_VV(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_VV(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* u * v -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZU_SPEC(:,:,JK), ZV_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_UV(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_UV(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* w * u -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZU_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WU(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WU(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* w * v -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZV_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WV(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WV(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* w * w -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZW_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WW(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WW(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* w * th -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZTH_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WTh(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WTh(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* w * thl -! -DO JK=1,NSPECTRA_K - IF (LUSERC) & - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZTHL_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WThl(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WThl(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* th * th -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZTH_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThTh(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThTh(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* thl * thl -! -DO JK=1,NSPECTRA_K - IF (LUSERC) & - CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZTHL_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThlThl(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThlThl(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* correlations with water vapor -! -IF (LUSERV) THEN - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRV_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WRv(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WRv(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRV_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThRv(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThRv(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - IF (LUSERC) & - CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRV_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThlRv(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThlRv(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZRV_SPEC(:,:,JK), ZRV_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_RvRv(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_RvRv(:,JK,NLES_CURRENT_TCOUNT) ) - END DO -END IF -! -! -!* correlations with cloud water -! -IF (LUSERC) THEN - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRC_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WRc(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WRc(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRC_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThRc(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThRc(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRC_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThlRc(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThlRc(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZRC_SPEC(:,:,JK), ZRC_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_RcRc(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_RcRc(:,JK,NLES_CURRENT_TCOUNT) ) - END DO -END IF -! -!* correlations with cloud ice -! -IF (LUSERI) THEN - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRI_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WRi(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WRi(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRI_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThRi(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThRi(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRI_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThlRi(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThlRi(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZRI_SPEC(:,:,JK), ZRI_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_RiRi(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_RiRi(:,JK,NLES_CURRENT_TCOUNT) ) - END DO -END IF -! -!* correlations with scalar variables -! -DO JSV=1,NSV - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZSV_SPEC(:,:,JK,JSV), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WSv(:,JK,NLES_CURRENT_TCOUNT,JSV), & - XCORRj_WSv(:,JK,NLES_CURRENT_TCOUNT,JSV) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZSV_SPEC(:,:,JK,JSV), ZSV_SPEC(:,:,JK,JSV), & - CLES_LBCX , CLES_LBCY, & - XCORRi_SvSv(:,JK,NLES_CURRENT_TCOUNT,JSV), & - XCORRj_SvSv(:,JK,NLES_CURRENT_TCOUNT,JSV) ) - END DO -END DO -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE LES -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE LES_n diff --git a/src/PHYEX/ext/lidar.f90 b/src/PHYEX/ext/lidar.f90 deleted file mode 100644 index 93cfad846..000000000 --- a/src/PHYEX/ext/lidar.f90 +++ /dev/null @@ -1,695 +0,0 @@ -!MNH_LIC Copyright 2007-2020 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ################# - MODULE MODI_LIDAR -! ################# -! -INTERFACE - SUBROUTINE LIDAR(HCLOUD,HVIEW,PALT,PWVL,PZZ,PRHO,PT,PCLDFR,PRT, & - PLIDAROUT,PLIPAROUT,PCT,PDSTC,PDSTD,PDSTS) -! -CHARACTER(LEN=*), INTENT(IN) :: HCLOUD ! Name of the cloud scheme -CHARACTER(LEN=*), INTENT(IN) :: HVIEW ! Upward or Downward integration -REAL, INTENT(IN) :: PALT ! Altitude of the lidar source -REAL, INTENT(IN) :: PWVL ! Wavelength of the lidar source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Altitude -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO ! Air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Air temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! Cloud fraction -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Moist variables at t -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLIDAROUT ! Lidar output -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLIPAROUT ! Lidar output (particle only) - -REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PCT ! Concentration - ! (C2R2 and C1R3) -REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PDSTC ! Dust Concentration -REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PDSTD ! Dust Diameter -REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PDSTS ! Dust Sigma -! - -! -END SUBROUTINE LIDAR -! -END INTERFACE -! -END MODULE MODI_LIDAR -! ######################################################### - SUBROUTINE LIDAR(HCLOUD,HVIEW,PALT,PWVL,PZZ,PRHO,PT,PCLDFR,PRT, & - PLIDAROUT,PLIPAROUT,PCT,PDSTC,PDSTD,PDSTS) -! ######################################################### -! -!!**** *LIDAR * - computes pertinent lidar parameters -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the normalized backscattered -!! signal of an upward or downward looking lidar in an atmosperic column -!! containing air molecules, aerosols, cloud particles and hydrometeors. -!! -!!** METHOD -!! ------ -!! The reflectivities are computed using the n(D) * D**6 formula. The -!! equivalent reflectiviy is the sum of the reflectivity produced by the -!! the raindrops and the equivalent reflectivities of the ice crystals. -!! The latter are computed using the melted diameter. The Doppler -!! reflectivity is the 'fall speed'-moment of individual particle -!! reflectivity. Ice crystal are assumed to have no preferred orientation. -!! the Z_VV formula is taken from Brandes et al. (MWR, 1995). -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST -!! XPI ! -!! XRHOLW ! Liquid water density -!! Module MODD_RAIN_ICE_DESCR -!! Module MODD_RAIN_ICE_PARAM -!! -!! REFERENCE -!! --------- -!! Chaboureau et al. 2011: Long-range transport of Saharan dust and its -!! radiative impact on precipitation forecast over western Europe: a case -!! study during COPS. Quart. J. Roy. Meteor. Soc., 137, 236-251 -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 04/10/07 -!! JP Chaboureau 12/02/10 change dust refraction index -!! add inputs (lidar charact. and cloud fraction) -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! B.VIE 2016 : LIMA -! P. Wautelet 18/03/2020: remove ICE2 option -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS -USE MODD_CST -USE MODD_RAIN_C2R2_DESCR, ONLY : XLBEXC, XLBEXR, & - XRTMIN, XCTMIN -USE MODD_PARAM_C2R2, ONLY : YALPHAC=>XALPHAC,YNUC=>XNUC, & - YALPHAR=>XALPHAR,YNUR=>XNUR -USE MODD_PARAM_ICE_n, ONLY: WSNOW_T=>LSNOW_T -USE MODD_RAIN_ICE_DESCR_n, ONLY : XCCR, WLBEXR=>XLBEXR, XLBR, & - XCCS, XCXS, XLBEXS, XLBS, WNS=>XNS, WBS=>XBS, & - XCCG, XCXG, XLBEXG, XLBG, & - XCCH, XCXH, XLBEXH, XLBH, & - WRTMIN=>XRTMIN, & - WLBDAS_MAX=>XLBDAS_MAX,WLBDAS_MIN=>XLBDAS_MIN,WTRANS_MP_GAMMAS=>XTRANS_MP_GAMMAS -USE MODD_ICE_C1R3_DESCR, ONLY : XLBEXI, & - YRTMIN=>XRTMIN, YCTMIN=>XCTMIN -! -USE MODD_PARAM_LIMA, ONLY : URTMIN=>XRTMIN, UCTMIN=>XCTMIN, & - UALPHAC=>XALPHAC,UNUC=>XNUC, & - UALPHAR=>XALPHAR,UNUR=>XNUR, & - UALPHAI=>XALPHAI,UNUI=>XNUI, & - USNOW_T=>LSNOW_T -USE MODD_PARAM_LIMA_COLD, ONLY : UCCS=>XCCS, UCXS=>XCXS, ULBEXS=>XLBEXS, & - ULBS=>XLBS, UNS=>XNS, UBS=>XBS, & - ULBDAS_MAX=>XLBDAS_MAX,ULBDAS_MIN=>XLBDAS_MIN,UTRANS_MP_GAMMAS=>XTRANS_MP_GAMMAS -USE MODD_PARAM_LIMA_MIXED,ONLY : UCCG=>XCCG, UCXG=>XCXG, ULBEXG=>XLBEXG, & - ULBG=>XLBG - -use mode_tools_ll, only: GET_INDICE_ll - -USE MODI_BHMIE_WATER ! Gamma or mono dispersed size distributions -USE MODI_BHMIE_AEROSOLS ! Lognormal or mono dispersed size distributions -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -CHARACTER(LEN=*), INTENT(IN) :: HCLOUD ! Name of the cloud scheme -CHARACTER(LEN=*), INTENT(IN) :: HVIEW ! Upward or Downward integration -REAL, INTENT(IN) :: PALT ! Altitude of the lidar source -REAL, INTENT(IN) :: PWVL ! Wavelength of the lidar source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Altitude -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO ! Air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Air temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! Cloud fraction -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Moist variables at t -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLIDAROUT ! Lidar output -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLIPAROUT ! Lidar output (particle only) - -REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PCT ! Concentration - ! (C2R2 and C1R3) -REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PDSTC ! Dust Concentration -REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PDSTD ! Dust Diameter -REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PDSTS ! Dust Sigma -! -!* 0.2 Declarations of local variables : -! -INTEGER :: JI, JJ, JK -INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE -INTEGER :: IALT -INTEGER, DIMENSION(3) :: IKMIN -! -REAL, PARAMETER :: ZCLDFRMIN = 1.0E-03 ! Cloud fraction minimum -! -! -COMPLEX, PARAMETER :: ZZREFIND_WAT = (1.337E+00,1.818E-09) ! Refraction Index - ! of pure water -COMPLEX, PARAMETER :: ZZREFIND_ICE = (1.312E+00,2.614E-09) ! Refraction Index - ! of pure ice -!COMPLEX, PARAMETER :: ZZREFIND_DUST= (1.530E+00,8.000E-03) ! Refraction Index -! ! of mineral dust -! West, R. A., L. R. Doose, A. M. Eibl, M. G. Tomasko, and M. I. Mishchenko -! (1997), Laboratory measurements of mineral dust scattering phase function -! and linear polarization, J. Geophys. Res., 102(D14), 16,871-16,882. -COMPLEX :: ZZREFIND_DUST - -! Tulet, P., M. Mallet, V. Pont, J. Pelon, and A. Boone (2008), The 7-13 -! March 2006 dust storm over West Africa: Generation, transport, and vertical -! stratification, J. Geophys. Res., 113, D00C08, doi:10.1029/2008JD009871. -!! Ri = 1.448-0.00292i for wavelengths between 0.185 and 0.69um. -!! Ri = 1.44023-0.00116i for wavelengths between 0.69 and 1.19um. -!! Ri = 1.41163-0.00106i for wavelengths between 1.19 and 4.0um. -COMPLEX, PARAMETER :: ZZREFIND_DSTL= (1.448,2.92E-03) -COMPLEX, PARAMETER :: ZZREFIND_DSTM= (1.44023,1.16E-03) -COMPLEX, PARAMETER :: ZZREFIND_DSTH= (1.41163,1.06E-03) - -! -! COMPLEX, PARAMETER :: ZZREFIND_WAT = (1.321E+00,1.280E-06) ! Refraction Index -! ! of pure water -! COMPLEX, PARAMETER :: ZZREFIND_ICE = (1.300E+00,1.898E-06) ! Refraction Index -! ! of pure ice -! -COMPLEX, PARAMETER :: ZZREFIND_COAT= (1.337E+00,1.818E-09) ! Refraction Index - ! of coating material -COMPLEX, PARAMETER :: ZZREFIND_BC = (1.870E+00,0.569E+00) ! Refraction Index - ! of black carbone -REAL :: ZCXR=-1.0 ! for rain N ~ 1/N_0 - ! (in Kessler parameterization) -! -REAL :: ZCMOL -REAL :: ZWAVE_LENGTH -! BETA: backscattering coefficient -! ALPHA: extinction coefficient -REAL, DIMENSION(SIZE(PRHO,1),SIZE(PRHO,2),SIZE(PRHO,3)) :: ZBETA_MOL -REAL, DIMENSION(SIZE(PRHO,1),SIZE(PRHO,2),SIZE(PRHO,3)) :: ZALPH_MOL -REAL, DIMENSION(SIZE(PRHO,1),SIZE(PRHO,2),SIZE(PRHO,3)) :: ZBETA_PAR -REAL, DIMENSION(SIZE(PRHO,1),SIZE(PRHO,2),SIZE(PRHO,3)) :: ZALPH_PAR -REAL, ALLOCATABLE, DIMENSION(:,:) :: ZOPTD_TOT ! Optical depths -REAL, ALLOCATABLE, DIMENSION(:,:) :: ZOPTD_MOL -REAL, ALLOCATABLE, DIMENSION(:,:) :: ZOPTD_PAR -! -CHARACTER (LEN=5) :: YDSD -INTEGER :: IRADIUS, IANGLE -REAL :: ZRADIUS, ZCONC, ZLWC, ZIWC -REAL :: ZREFF_FACT -REAL :: ZEXT_COEF, ZBAK_COEF -REAL :: ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, ZTCEL -REAL :: ZFRACVOL_CORE, ZDMODAL, ZSIG -REAL :: ZFRACVOL_BC -! -REAL :: ZETACLD, ZETAAER ! Multiple diffusion paramter for cloud and dust -! -REAL, DIMENSION(5) :: ZPOLC, ZPOLR, ZPOLI ! BackScat. Coefficients -! -REAL, DIMENSION(10) :: ZRTMIN, ZCTMIN -REAL :: ZLBEXR -! -INTEGER :: JL -REAL :: ZALPHAC, ZNUC, ZALPHAR, ZNUR, ZALPHAI, ZNUI -REAL :: ZCCS, ZCXS, ZLBEXS, ZLBS, ZNS -REAL :: ZCCG, ZCXG, ZLBEXG, ZLBG -! -! ----------------------------------------------------------------------------- -! -!* 1. COMPUTE THE LOOP BOUNDS -! ----------------------- -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB=1+JPVEXT -IKE=SIZE(PRHO,3) - JPVEXT -! -ZWAVE_LENGTH = PWVL -ZCMOL=5.45E-32*((ZWAVE_LENGTH)/0.55E-6)**(-4.09) -IF (ZWAVE_LENGTH<0.69E-6) THEN - PRINT *,'Tulet et al. refractive index - low wavelength' - ZZREFIND_DUST = ZZREFIND_DSTL -ELSEIF (ZWAVE_LENGTH<1.00E-6) THEN - PRINT *,'Tulet et al. refractive index - medium wavelength' - ZZREFIND_DUST = ZZREFIND_DSTM -ELSE - PRINT *,'Tulet et al. refractive index - high wavelength' - ZZREFIND_DUST = ZZREFIND_DSTH -END IF -ZPOLC = (/ 2.6980E-8,-3.7701E-6, 1.6594E-4,-0.0024, 0.0626 /) -ZPOLR(:) = ZPOLC(:) -ZPOLI = (/-1.0176E-8, 1.7615E-6,-1.0480E-4, 0.0019, 0.0460 /) -! -! Multiple diffusion parameter -ZETAAER=1.0 -ZETACLD=1.0 -! a multiple scattering correction for lidar in space; Platt 73 -IF (HVIEW=='NADIR'.AND.PALT==0.) ZETACLD=0.5 -PRINT *,'Multiple diffusion parameter for aerosol ',ZETAAER -PRINT *,'Multiple diffusion parameter for cloud ',ZETACLD -! -! -!* 1. MORE INITIALIZATION -! ------------------- -! -SELECT CASE ( HCLOUD ) - CASE('KESS') - ZRTMIN(1) = 1.0E-20 - ZRTMIN(2) = 1.0E-20 - ZRTMIN(3) = 1.0E-20 - ZLBEXR = 1.0/(-1.0-3.0) - CASE('ICE3','ICE4') - ZRTMIN(1:SIZE(WRTMIN)) = WRTMIN(1:SIZE(WRTMIN)) - ZLBEXR = WLBEXR - ZCCS = XCCS - ZCXS = XCXS - ZLBEXS = XLBEXS - ZLBS = XLBS - ZNS = WNS - ZCCG = XCCG - ZCXG = XCXG - ZLBEXG = XLBEXG - ZLBG = XLBG - CASE('C2R2') - ZRTMIN(1:SIZE(XRTMIN)) = XRTMIN(1:SIZE(XRTMIN)) - ZCTMIN(1:SIZE(XCTMIN)) = XCTMIN(1:SIZE(XCTMIN)) - ZLBEXR = XLBEXR - ZALPHAC = YALPHAC - ZNUR = YNUR - ZALPHAR = YALPHAR - ZNUC = YNUC - CASE('C3R5') - ZRTMIN(1:SIZE(YRTMIN)) = YRTMIN(1:SIZE(YRTMIN)) - ZCTMIN(1:SIZE(YCTMIN)) = YCTMIN(1:SIZE(YCTMIN)) - ZALPHAC = YALPHAC - ZNUR = YNUR - ZALPHAR = YALPHAR - ZNUC = YNUC - ZALPHAI = ZALPHAC - ZNUI = ZNUC - ZCCS = XCCS - ZCXS = XCXS - ZLBEXS = XLBEXS - ZLBS = XLBS - ZCCG = XCCG - ZCXG = XCXG - ZLBEXG = XLBEXG - ZLBG = XLBG - CASE('LIMA') - ZRTMIN(1:SIZE(URTMIN)) = URTMIN(1:SIZE(URTMIN)) - ZCTMIN(1:SIZE(UCTMIN)) = UCTMIN(1:SIZE(UCTMIN)) - ZALPHAC = UALPHAC - ZNUR = UNUR - ZALPHAR = UALPHAR - ZNUC = UNUC - ZALPHAI = UALPHAI - ZNUI = UNUI - ZCCS = UCCS - ZCXS = UCXS - ZLBEXS = ULBEXS - ZLBS = ULBS - ZNS = UNS - ZCCG = UCCG - ZCXG = UCXG - ZLBEXG = ULBEXG - ZLBG = ULBG -END SELECT -! -! ----------------------------------------------------------------------------- -! -!* 2. INITIALIZES THE MEAN-LAYER VARIABLES -! ------------------------------------ -! -! -! MOLECULAR CONTRIBUTION -! -ZBETA_MOL(:,:,:) = ( PRHO(:,:,:)*XAVOGADRO/XMD )*ZCMOL -ZALPH_MOL(:,:,:) = ZBETA_MOL(:,:,:)*(8.0*XPI/3.0) -! -! PARTICULAR CONTRIBUTION -! -ZBETA_PAR(:,:,:) = 0. -ZALPH_PAR(:,:,:) = 0. -! -! AEROSOL CONTRIBUTION ! call bhmie_aerosols -! -IF (PRESENT(PDSTC)) THEN - DO JL = 1, SIZE(PDSTD,4) - DO JK = IKB, IKE - DO JJ = IJB, IJE - DO JI = IIB, IIE - IF ( PDSTD(JI,JJ,JK,JL)>0.1 ) THEN - ! - ! Desert dust particles - ! - YDSD = 'MONOD' - ZCONC = PDSTC(JI,JJ,JK,JL) - ZFRACVOL_CORE = 1.0 - ZRADIUS = PDSTD(JI,JJ,JK,JL)*1.0E-6 - IF( ZRADIUS .GE. 1.0E-3 ) ZRADIUS = ZRADIUS * 1.0E-6 - CALL BHMIE_AEROSOLS( ZWAVE_LENGTH, ZZREFIND_DUST, ZZREFIND_DUST, & - YDSD, ZCONC, ZFRACVOL_CORE, ZEXT_COEF, & - ZBAK_COEF, PRADIUS=ZRADIUS ) - ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETAAER * ZEXT_COEF - ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF - END IF - END DO - END DO - END DO - END DO -END IF -! -! -! HYDROMETEOR CONTRIBUTION ! call bhmie_water -! -! LIQUID WATER -! -! Some Prefactors: Assume Martin et al. (1994, JAS) for Reff -! -ZREFF_FACT = 1.0E-3*(3.E3/(4.0*XPI*0.67E-3))**0.33 ! Continental N=500 -ZREFF_FACT = 1.0E-3*(3.E3/(4.0*XPI*0.80E-3))**0.33 ! Maritime N=150 -! -SELECT CASE ( HCLOUD ) - CASE('KESS','ICE3','ICE4') - DO JK = IKB, IKE - DO JJ = IJB, IJE - DO JI = IIB, IIE - IF ( PRT(JI,JJ,JK,2)>ZRTMIN(2) .AND. PCLDFR(JI,JJ,JK)>ZCLDFRMIN) THEN -! -! Cloud droplets -! - YDSD = 'MONOD' - ZCONC = 200.E6 ! Continental case - ZLWC = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,2) / PCLDFR(JI,JJ,JK) - ZRADIUS = MIN( 16.0E-6,MAX( 4.0E-6,ZREFF_FACT*(ZLWC/ZCONC)**0.33 ) ) - IANGLE = 11 - CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_WAT, YDSD, ZCONC, & - IANGLE, ZEXT_COEF, ZBAK_COEF, PRADIUS=ZRADIUS ) - ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF & - * PCLDFR(JI,JJ,JK) - ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF & - * PCLDFR(JI,JJ,JK) - END IF - END DO - END DO - END DO - DO JK = IKB, IKE - DO JJ = IJB, IJE - DO JI = IIB, IIE - IF ( PRT(JI,JJ,JK,3)>ZRTMIN(3) ) THEN -! -! Rain drops -! - YDSD = 'MONOD' - ZLWC = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,3) - ZLBDAR = XLBR*(ZLWC)**ZLBEXR - ZCONC = XCCR*(ZLBDAR)**ZCXR - ZRADIUS = 0.5*(3.0/ZLBDAR) ! Assume Marshall-Palmer law for Reff - IANGLE = 11 - CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_WAT, YDSD, ZCONC, & - IANGLE, ZEXT_COEF, ZBAK_COEF, PRADIUS=ZRADIUS ) - ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF - ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF - END IF - END DO - END DO - END DO - CASE ('C2R2','C3R5','LIMA') - DO JK = IKB, IKE - DO JJ = IJB, IJE - DO JI = IIB, IIE - IF (PRT(JI,JJ,JK,2)>ZRTMIN(2) .AND. PCT(JI,JJ,JK,2)>ZCTMIN(2)) THEN -! -! Cloud droplets -! - YDSD = 'GAMMA' - ZCONC = PCT(JI,JJ,JK,2) - IRADIUS = 20 - ZLWC = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,2) - IANGLE = 11 - CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_WAT, YDSD, ZCONC, & - IANGLE, ZEXT_COEF, ZBAK_COEF, KRADIUS=IRADIUS, & - PALPHA=ZALPHAC, PNU=ZNUC, PLWC=ZLWC ) - ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF - ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF - END IF - END DO - END DO - END DO - DO JK = IKB, IKE - DO JJ = IJB, IJE - DO JI = IIB, IIE - IF (PRT(JI,JJ,JK,3)>ZRTMIN(3) .AND. PCT(JI,JJ,JK,3)>ZCTMIN(3)) THEN -! -! Rain drops -! - YDSD = 'GAMMA' - ZCONC = PCT(JI,JJ,JK,3) - IRADIUS = 20 - ZLWC = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,3) - IANGLE = 11 - CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_WAT, YDSD, ZCONC, & - IANGLE, ZEXT_COEF, ZBAK_COEF, KRADIUS=IRADIUS, & - PALPHA=ZALPHAR, PNU=ZNUR, PLWC=ZLWC ) - ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF - ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF - END IF - END DO - END DO - END DO -END SELECT -! -! SOLID ICE -! -SELECT CASE ( HCLOUD ) - CASE('ICE3','ICE4') - DO JK = IKB, IKE - DO JJ = IJB, IJE - DO JI = IIB, IIE - IF ( PRT(JI,JJ,JK,4)>ZRTMIN(4) .AND. PCLDFR(JI,JJ,JK)>ZCLDFRMIN) THEN -! -! Pristine crystals -! - YDSD = 'MONOD' - ZCONC = 10.E3 ! Continental case - ZIWC = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,4) / PCLDFR(JI,JJ,JK) - ZTCEL = 10.0-0.0065*PZZ(JI,JJ,JK) ! A rough estimate - ZRADIUS = MIN( 350.0E-6,MAX( 45.0E-6,0.5E-6*(1.2351+0.0105*ZTCEL)* & - (5.8966*(ZIWC*1.0E3)**0.2214 + & - (0.7957*(ZIWC*1.0E3)**0.2535)*(ZTCEL+190.0)) ) ) - IANGLE = 11 - CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_ICE, YDSD, ZCONC, & - IANGLE, ZEXT_COEF, ZBAK_COEF, PRADIUS=ZRADIUS ) - ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF & - *PCLDFR(JI,JJ,JK) - ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF & - *PCLDFR(JI,JJ,JK) - END IF - END DO - END DO - END DO - CASE ('C3R5','LIMA') - DO JK = IKB, IKE - DO JJ = IJB, IJE - DO JI = IIB, IIE - IF (PRT(JI,JJ,JK,4)>ZRTMIN(4) .AND. PCT(JI,JJ,JK,4)>ZCTMIN(4)) THEN -! -! Pristine crystals -! - YDSD = 'GAMMA' - ZCONC = PCT(JI,JJ,JK,4) - IRADIUS = 20 - ZIWC = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,4) - IANGLE = 11 - CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_ICE, YDSD, ZCONC, & - IANGLE, ZEXT_COEF, ZBAK_COEF, KRADIUS=IRADIUS, & - PALPHA=ZALPHAI, PNU=ZNUI, PLWC=ZIWC ) - ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF - ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF - END IF - END DO - END DO - END DO -END SELECT -SELECT CASE ( HCLOUD ) - CASE('ICE3','ICE4','C3R5','LIMA') - DO JK = IKB, IKE - DO JJ = IJB, IJE - DO JI = IIB, IIE - IF ( PRT(JI,JJ,JK,5)>ZRTMIN(5) ) THEN -! -! Snow flakes -! - YDSD = 'MONOD' - ZIWC = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,5) - IF (HCLOUD=='LIMA' .AND. USNOW_T) THEN - IF (PT(JI,JJ,JK)>263.15) THEN - ZLBDAS = MAX(MIN(ULBDAS_MAX, 10**(14.554-0.0423*PT(JI,JJ,JK))),ULBDAS_MIN)*UTRANS_MP_GAMMAS - ELSE - ZLBDAS = MAX(MIN(ULBDAS_MAX, 10**(6.226-0.0106*PT(JI,JJ,JK))),ULBDAS_MIN)*UTRANS_MP_GAMMAS - END IF - ZCONC=ZNS*ZIWC*ZLBDAS**UBS - ELSE IF (HCLOUD=='ICE3' .AND. WSNOW_T) THEN - IF (PT(JI,JJ,JK)>263.15) THEN - ZLBDAS = MAX(MIN(WLBDAS_MAX, 10**(14.554-0.0423*PT(JI,JJ,JK))),WLBDAS_MIN)*WTRANS_MP_GAMMAS - ELSE - ZLBDAS = MAX(MIN(WLBDAS_MAX, 10**(6.226-0.0106*PT(JI,JJ,JK))),WLBDAS_MIN)*WTRANS_MP_GAMMAS - END IF - ZCONC=ZNS*ZIWC*ZLBDAS**WBS - ELSE - ZLBDAS = ZLBS*(ZIWC)**ZLBEXS - ZCONC = ZCCS*(ZLBDAS)**ZCXS - END IF - IF (ZLBDAS .GT. 0) THEN - ZRADIUS = 0.5*(3.0/ZLBDAS) ! Assume Marshall-Palmer law for Reff - IANGLE = 11 - CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_ICE, YDSD, ZCONC, & - IANGLE, ZEXT_COEF, ZBAK_COEF, PRADIUS=ZRADIUS ) - ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF - ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF - END IF - END IF - END DO - END DO - END DO -END SELECT -SELECT CASE ( HCLOUD ) - CASE('ICE3','ICE4','C3R5','LIMA') - DO JK = IKB, IKE - DO JJ = IJB, IJE - DO JI = IIB, IIE - IF ( PRT(JI,JJ,JK,6)>ZRTMIN(6) ) THEN -! -! Graupel particles -! - YDSD = 'MONOD' - ZIWC = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,6) - ZLBDAG = ZLBG*(ZIWC)**ZLBEXG - ZCONC = ZCCG*(ZLBDAG)**ZCXG - ZRADIUS = 0.5*(3.0/ZLBDAG) ! Assume Marshall-Palmer law for Reff - IANGLE = 11 - CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_ICE, YDSD, ZCONC, & - IANGLE, ZEXT_COEF, ZBAK_COEF, PRADIUS=ZRADIUS ) - ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF - ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF - END IF - END DO - END DO - END DO -END SELECT -SELECT CASE ( HCLOUD ) - CASE('ICE4') - DO JK = IKB, IKE - DO JJ = IJB, IJE - DO JI = IIB, IIE - IF ( PRT(JI,JJ,JK,7)>ZRTMIN(7) ) THEN -! -! Hailstones -! - YDSD = 'MONOD' - ZIWC = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,7) - ZLBDAH = XLBH*(ZIWC)**XLBEXH - ZCONC = XCCH*(ZLBDAH)**XCXH - ZRADIUS = 0.5*(3.0/ZLBDAH) ! Assume Marshall-Palmer law for Reff - IANGLE = 11 - CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_ICE, YDSD, ZCONC, & - IANGLE, ZEXT_COEF, ZBAK_COEF, PRADIUS=ZRADIUS ) - ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF - ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF - END IF - END DO - END DO - END DO -END SELECT -! -! ----------------------------------------------------------------------------- -! -!* 3. PERFORMS THE BOTTOM-UP OR TOP-DOWN VERTICAL INTEGRATION -! ------------------------------------------------------- -! -! -ALLOCATE(ZOPTD_TOT(SIZE(PRHO,1),SIZE(PRHO,2))) -ALLOCATE(ZOPTD_MOL(SIZE(PRHO,1),SIZE(PRHO,2))) -ALLOCATE(ZOPTD_PAR(SIZE(PRHO,1),SIZE(PRHO,2))) -ZOPTD_TOT(:,:) = 0. -ZOPTD_MOL(:,:) = 0. -ZOPTD_PAR(:,:) = 0. -! -IF( HVIEW=='ZENIT' ) THEN - IALT=IKB - IF (PALT/=0.) THEN - IKMIN=MINLOC(ABS(PZZ(:,:,:)-PALT)) - IALT=MIN(MAX(IKB,IKMIN(3)),IKE) - ENDIF - DO JK=IALT,IKE -! -! molecular optical depth -! - ZOPTD_MOL(:,:) = ZOPTD_MOL(:,:) & - + ZALPH_MOL(:,:,JK)*(PZZ(:,:,JK)-PZZ(:,:,JK-1)) -! -! Particular optical depth -! - ZOPTD_PAR(:,:) = ZOPTD_PAR(:,:) & - + ZALPH_PAR(:,:,JK)*(PZZ(:,:,JK)-PZZ(:,:,JK-1)) -! -! Total optical depth -! - ZOPTD_TOT(:,:) = ZOPTD_MOL(:,:) + ZOPTD_PAR(:,:) -! -! Normalized Lidar profile -! - PLIDAROUT(:,:,JK) = ( ZBETA_MOL(:,:,JK)+ZBETA_PAR(:,:,JK) ) & - * EXP( -2.0*ZOPTD_TOT(:,:) ) -! -! Normalized Lidar particle profile -! - PLIPAROUT(:,:,JK) = ZBETA_PAR(:,:,JK) * EXP( -2.0*ZOPTD_PAR(:,:) ) - END DO -ELSE IF( HVIEW=='NADIR' ) THEN - IALT=IKE - IF (PALT/=0.) THEN - IKMIN=MINLOC(ABS(PZZ(:,:,:)-PALT)) - IALT=MIN(MAX(IKB,IKMIN(3)),IKE) - ENDIF - DO JK=IALT,IKB,-1 -! -! molecular optical depth -! - ZOPTD_MOL(:,:) = ZOPTD_MOL(:,:) & - + ZALPH_MOL(:,:,JK)*(PZZ(:,:,JK)-PZZ(:,:,JK-1)) -! -! Particular optical depth -! - ZOPTD_PAR(:,:) = ZOPTD_PAR(:,:) & - + ZALPH_PAR(:,:,JK)*(PZZ(:,:,JK)-PZZ(:,:,JK-1)) -! -! Total optical depth -! - ZOPTD_TOT(:,:) = ZOPTD_MOL(:,:) + ZOPTD_PAR(:,:) -! -! Normalized Lidar profile -! - PLIDAROUT(:,:,JK) = ( ZBETA_MOL(:,:,JK)+ZBETA_PAR(:,:,JK) ) & - * EXP( -2.0*ZOPTD_TOT(:,:) ) -! -! Normalized Lidar particle profile -! - PLIPAROUT(:,:,JK) = ZBETA_PAR(:,:,JK) * EXP( -2.0*ZOPTD_PAR(:,:) ) - END DO -ENDIF -! -DEALLOCATE(ZOPTD_TOT,ZOPTD_MOL,ZOPTD_PAR) -! -!------------------------------------------------------------------------------ -! -END SUBROUTINE LIDAR diff --git a/src/PHYEX/ext/mnh2lpdm.f90 b/src/PHYEX/ext/mnh2lpdm.f90 deleted file mode 100644 index e5472663f..000000000 --- a/src/PHYEX/ext/mnh2lpdm.f90 +++ /dev/null @@ -1,181 +0,0 @@ -!MNH_LIC Copyright 2002-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------------- -! ######spl - PROGRAM MNH2LPDM -! ############## -!----------------------------------------------------------------------------- -!**** MNH2DIF COUPLAGE MESO-NH / SPRAY. -! -! Auteur : Michel Bouzom, DP/SERV/ENV -! Creation : 16.07.2002 -! Modification : 07.01.2006 (T.LAUVAUX, adaptation LPDM) -! Modification : 04.01.2009 (F. BONNARDOT, DP/SER/ENV ) -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 05/11/2020: correct I/O of MNH2LPDM -! -!----------------------------------------------------------------------------- -! -! -! -!* 0. DECLARATIONS. -! ------------- -! -!* 0.1 Modules. -! -USE MODD_CONF, ONLY : CPROGRAM -USE MODD_IO, ONLY : TFILEDATA, TFILE_OUTPUTLISTING, TPTR2FILE -use modd_lunit, only: TLUOUT0 -use modd_lunit_n, only: TLUOUT -USE MODD_MNH2LPDM -! -USE MODE_FIELD, ONLY: INI_FIELD_LIST, INI_FIELD_SCALARS -USE MODE_IO, ONLY: IO_Init, IO_Config_set -USE MODE_IO_FILE, ONLY: IO_File_open, IO_File_close -USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_add2list -USE MODE_MODELN_HANDLER -use mode_msg -USE MODE_POS -! -USE MODE_INI_CST, ONLY: INI_CST -USE MODI_MNH2LPDM_ECH -USE MODI_MNH2LPDM_INI -USE MODI_VERSION -! -USE MODN_CONFIO -! -! -!* 0.2 Variables locales. -! -IMPLICIT NONE -! -CHARACTER(LEN=*),PARAMETER :: YFLOG = 'METEO.log' ! Log filename -CHARACTER(LEN=*),PARAMETER :: YFNML = 'MNH2LPDM1.nam' ! Namelist filename -INTEGER, PARAMETER :: IVERB = 5 -! -INTEGER :: IFNML ! Unit of namelist -INTEGER :: JFIC -LOGICAL :: GFOUND ! Return code when searching namelist -TYPE(TPTR2FILE),DIMENSION(JPMNHMAX) :: TZFMNH ! MesoNH files -TYPE(TFILEDATA),POINTER :: TZDATEFILE => NULL() ! Date file -TYPE(TFILEDATA),POINTER :: TZGRIDFILE => NULL() ! Grid file -TYPE(TFILEDATA),POINTER :: TZMETEOFILE => NULL() ! Meteo file -TYPE(TFILEDATA),POINTER :: TZLOGFILE => NULL() ! Log file -TYPE(TFILEDATA),POINTER :: TZNMLFILE => NULL() ! Namelist file -! -! -! -! -!* 1. INITIALISATION. -! --------------- -! -CPROGRAM='M2LPDM' -CALL GOTO_MODEL(1) -CALL VERSION() -CALL IO_Init() -CALL INI_CST() -CALL INI_FIELD_LIST() -CALL INI_FIELD_SCALARS() -! -CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING1','OUTPUTLISTING','WRITE') -CALL IO_File_open(TLUOUT0) -!Set output files for PRINT_MSG -TLUOUT => TLUOUT0 -TFILE_OUTPUTLISTING => TLUOUT0 -! -!* 1.1 Variables generales. -! - CFMNH(:) = '' -! -! -!* 1.2 Initialisation routines LL. -! -CALL IO_Init() -! -! -!* 1.3 Ouverture du fichier log. -! -CALL IO_File_add2list(TZLOGFILE,YFLOG,'TXT','WRITE') -CALL IO_File_open(TZLOGFILE) -! -! -!* 1.4 Lecture des namelists. -! -CALL IO_File_add2list(TZNMLFILE,YFNML,'NML','READ') -CALL IO_File_open(TZNMLFILE) -IFNML = TZNMLFILE%NLU - -READ(UNIT=IFNML,NML=NAM_TURB) -READ(UNIT=IFNML,NML=NAM_FIC) -print *,'Lecture de NAM_FIC OK.' - -CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND ) -IF (GFOUND) THEN - READ(UNIT=IFNML,NML=NAM_CONFIO) -END IF -LCDF4 = .FALSE. -LLFIOUT = .FALSE. -LLFIREAD = .FALSE. -CALL IO_Config_set() -CALL IO_File_close(TZNMLFILE) -! -! -!* 1.5 Comptage des FM a traiter. -! -IF (LEN_TRIM(CFMNH(1))>0) THEN - NBMNH=1 - CALL IO_File_add2list(TZFMNH(1)%TZFILE,TRIM(CFMNH(1)),'MNH','READ',KLFITYPE=2,KLFIVERB=IVERB) - DO WHILE (CFMNH(NBMNH+1).NE.'VIDE') - NBMNH=NBMNH+1 - CALL IO_File_add2list(TZFMNH(NBMNH)%TZFILE,TRIM(CFMNH(NBMNH)),'MNH','READ',KLFITYPE=2,KLFIVERB=IVERB) - END DO - print *,NBMNH,' fichiers a traiter.' -ELSE - call Print_msg( NVERB_FATAL, 'GEN', 'MNH2LPDM', 'no CFMNH file given' ) -END IF -! -! -! -! -!* 2. TRAITEMENTS. -! ------------ -! -!* 2.1 Ouverture des fichiers METEO et GRILLE et DATE. -! -CALL IO_File_add2list(TZGRIDFILE,CFGRI,'TXT','WRITE') -CALL IO_File_open(TZGRIDFILE) -CALL IO_File_add2list(TZDATEFILE,CFDAT,'TXT','WRITE') -CALL IO_File_open(TZDATEFILE) -! -! -!* 2.2 Preparation du couplage. -! -CALL MNH2LPDM_INI(TZFMNH(1)%TZFILE,TZFMNH(NBMNH)%TZFILE,TZLOGFILE,TZGRIDFILE,TZDATEFILE) -! -! -!* 2.3 Traitement des echeances. -! -DO JFIC=1,NBMNH - print*,"CFMTO(JFIC)=",CFMTO(JFIC) - CALL IO_File_add2list(TZMETEOFILE,CFMTO(JFIC),'METEO','WRITE') - CALL IO_File_open(TZMETEOFILE) - CALL MNH2LPDM_ECH(TZFMNH(JFIC)%TZFILE,TZMETEOFILE) - print*,"CLOSE_LL(CFMTO(JFIC)" - CALL IO_File_close(TZMETEOFILE) - TZMETEOFILE => NULL() -END DO -! -! -!* 2.4 Fermeture des fichiers, METEO, GRILLE et LOG. -! -CALL IO_File_close(TZGRIDFILE) -CALL IO_File_close(TZDATEFILE) -CALL IO_File_close(TZLOGFILE) -! -! -! -END PROGRAM MNH2LPDM diff --git a/src/PHYEX/ext/mnh2lpdm_ech.f90 b/src/PHYEX/ext/mnh2lpdm_ech.f90 deleted file mode 100644 index a916c8922..000000000 --- a/src/PHYEX/ext/mnh2lpdm_ech.f90 +++ /dev/null @@ -1,497 +0,0 @@ -!MNH_LIC Copyright 2009-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------------- -! ######spl - SUBROUTINE MNH2LPDM_ECH(TPFILE,TPMETEOFILE) -! ################################################## -!----------------------------------------------------------------------- -!**** MNH2S2_ECH TRAITEMENT D'UNE ECHEANCE. -! -! Auteur : Francois Bonnardot, DP/SERV/ENV -! Creation : 07.01.2009 -! Modifications: -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 28/05/2018: corrected truncated integer division (1/3 -> 1./3.) -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 05/11/2020: correct I/O of MNH2LPDM -!----------------------------------------------------------------------- -! -!* 0. DECLARATIONS. -! ------------- -! -!* 0.1 Modules. -! -! -! -USE MODD_DIM_n -USE MODD_IO, ONLY: TFILEDATA -USE MODD_TIME_n -USE MODD_GRID_n -! -USE MODD_CST -USE MODD_PARAMETERS -USE MODD_TIME -! -USE MODD_MNH2LPDM -! -use modd_field, only: tfieldmetadata, TYPEREAL -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -! -IMPLICIT NONE -! -! -!* 0.2 Arguments. -! -TYPE(TFILEDATA),POINTER,INTENT(INOUT) :: TPFILE -TYPE(TFILEDATA),POINTER,INTENT(IN) :: TPMETEOFILE -! -! -!* 0.3 Variables locales. -! -CHARACTER(LEN=100) :: YFTURB ! Stockage champs de turbulence. -INTEGER :: IFTURB -INTEGER :: IFMTO,IREP -INTEGER :: ICURAA,ICURMM,ICURJJ ! Date courante. -INTEGER :: ICURHH,ICURMN,ICURSS ! Heure courante. -INTEGER :: JI,JJ,JK -TYPE(DATE_TIME) :: TZDTCUR -type(tfieldmetadata) :: tzfield -TYPE(TFILEDATA),POINTER :: TZFILE -! -! -! -! -!* 1. INITIALISATION. -! --------------- -! -!* 1.1 Blabla. -! -TZFILE => NULL() -IFMTO = TPMETEOFILE%NLU -! -!* 2. LECTURE DES DONNEES MESO-NH DE BASE. -! ------------------------------------ -! -!* 2.1 Ouverture du fichier Meso-NH. -! -CALL IO_File_open(TPFILE) -! -!* 2.2 Date et heure courante. -! -CALL IO_Field_read(TPFILE,'DTCUR',TZDTCUR) -! -ICURAA=MOD(TZDTCUR%nyear,100) ! Annee sur 2 caracteres. -ICURMM=TZDTCUR%nmonth -ICURJJ=TZDTCUR%nday -ICURSS=NINT(TZDTCUR%xtime) -! -ICURMN = NINT( (REAL(ICURSS)/60.0)/5.0 )*5 ! Heure arrondie a 5 minutes pres. -ICURSS = 0 -ICURHH =ICURMN/60 -ICURMN =ICURMN-ICURHH*60 -! -print*, '%%% MNH2LPDM2_ECH Date et heure des donnees :' -print 20300, ICURJJ,ICURMM,ICURAA,ICURHH,ICURMN,ICURSS -20300 FORMAT(I2.2,'/',I2.2,'/',I4.4,' ',I2.1,'h',I2.1,'mn',I2.1,'sec') -! -! -! -!* 2.3 Lecture des champs Meso-NH de base. -! -CALL IO_Field_read(TPFILE,'UT', XUT) -CALL IO_Field_read(TPFILE,'VT', XVT) -CALL IO_Field_read(TPFILE,'WT', XWT) -CALL IO_Field_read(TPFILE,'THT', XTHT) -CALL IO_Field_read(TPFILE,'TKET', XTKET) - -tzfield = tfieldmetadata( & - cmnhname = 'LM', & - clongname = '', & - cunits = 'm', & - cdir = 'XY', & - ccomment = 'Mixing length', & - ngrid = 1, & - ntype = TYPEREAL, & - ndims = 3 ) -CALL IO_Field_read(TPFILE, tzfield, XLM) - -tzfield = tfieldmetadata(& - cmnhname = 'THW_FLX', & - clongname = '', & - cunits = 'K s-1', & !correct? - cdir = 'XY', & - ccomment = 'Conservative potential temperature vertical flux', & - ngrid = 4, & - ntype = TYPEREAL, & - ndims = 3 ) -CALL IO_Field_read(TPFILE, tzfield, XWPTHP) - -tzfield = tfieldmetadata( & - cmnhname = 'DISS', & - clongname = '', & - cunits = '', & !TODO: set units - cdir = 'XY', & - ccomment = 'X_Y_Z_DISS', & - ngrid = 1, & - ntype = TYPEREAL, & - ndims = 3 ) -CALL IO_Field_read(TPFILE, tzfield, XDISSIP) - -tzfield = tfieldmetadata( & - cmnhname = 'FMU', & - clongname = '', & - cunits = 'kg m-1 s-2', & - cdir = 'XY', & - ccomment = 'X_Y_FMU', & - ngrid = 4, & - ntype = TYPEREAL, & - ndims = 2 ) -CALL IO_Field_read(TPFILE, tzfield, XSFU) - -tzfield = tfieldmetadata( & - cmnhname = 'FMV', & - clongname = '', & - cunits = 'kg m-1 s-2', & - cdir = 'XY', & - ccomment = 'X_Y_FMV', & - ngrid = 4, & - ntype = TYPEREAL, & - ndims = 2 ) -CALL IO_Field_read(TPFILE, tzfield, XSFV) - -CALL IO_Field_read(TPFILE,'INPRT', XINRT) -CALL IO_Field_read(TPFILE,'RVT', XRMVT) -CALL IO_Field_read(TPFILE,'RCT', XRMCT) -CALL IO_Field_read(TPFILE,'RRT', XRMRT) -! -! Lecture des donnees Meso-NH terminee.' -! -!* 2.4 Fermeture du fichier Meso-NH. -! -CALL IO_File_close(TPFILE) -! -! -!* 3. PREPARATION DES DONNEES. -! ------------------------ -! -! -!* 3.2 Niveaux altitude "hors-sol" (1:NKMAX). -! -XSU(:,:,1:NKMAX) = XUT(NSIB:NSIE,NSJB:NSJE,NKB:NKE) -XSV(:,:,1:NKMAX) = XVT(NSIB:NSIE,NSJB:NSJE,NKB:NKE) -XSW(:,:,1:NKMAX) = XWT(NSIB:NSIE,NSJB:NSJE,NKB:NKE) -XSTH(:,:,1:NKMAX) = XTHT(NSIB:NSIE,NSJB:NSJE,NKB:NKE) -XSTKE(:,:,1:NKMAX) = XTKET(NSIB:NSIE,NSJB:NSJE,NKB:NKE) -XSLM(:,:,1:NKMAX) = XLM(NSIB:NSIE,NSJB:NSJE,NKB:NKE) -XSDISSIP(:,:,1:NKMAX) = XDISSIP(NSIB:NSIE,NSJB:NSJE,NKB:NKE) -XSINRT(:,:) = XINRT(NSIB:NSIE,NSJB:NSJE) -XSWPTHP(:,:,1:NKMAX) = XWPTHP(NSIB:NSIE,NSJB:NSJE,NKB:NKE) -XSRMV(:,:,1:NKMAX) = XRMVT(NSIB:NSIE,NSJB:NSJE,NKB:NKE) -XSRMC(:,:,1:NKMAX) = XRMCT(NSIB:NSIE,NSJB:NSJE,NKB:NKE) -XSRMR(:,:,1:NKMAX) = XRMRT(NSIB:NSIE,NSJB:NSJE,NKB:NKE) -XSSFU(:,:) = XSFU(NSIB:NSIE,NSJB:NSJE) -XSSFV(:,:) = XSFV(NSIB:NSIE,NSJB:NSJE) -! -! -!* 4. CALCULS DES TEMPS LAGRANGIENS ET VARIANCES DU VENT POUR LPDM. -! ------------------------------------------------------------ -! - XRVSRD = XRV/XRD -! - XSUSTAR (:,:) = XUNDEF - XSLMO (:,:) = XUNDEF - XSHMIX (:,:) = XUNDEF - XSWSTAR (:,:) = XUNDEF - XSSIGU (:,:,:) = XUNDEF - XSSIGW (:,:,:) = XUNDEF - XSTIMEU (:,:,:) = XUNDEF - XSTIMEW (:,:,:) = XUNDEF -! - DO JI=1,NSIMAX ; DO JJ=1,NSJMAX - ! - !* Temperature potentielle virtuelle. - ! - XSTHETAV(:)=1.0+XSRMV(JI,JJ,:)+XSRMC(JI,JJ,:)+XSRMR(JI,JJ,:) - XSTHETAV(:) = XSTH(JI,JJ,:)*(1.0+XSRMV(JI,JJ,:)*XRVSRD)/XSTHETAV(:) - ! - !* ZHMIX Hauteur de melange. - ! - XTHSOL = XSTHETAV(1)+0.5 - XSHMIX(JI,JJ) = 0.0 - DO JK=2,NKMAX - IF ( XSTHETAV(JK).GT.XTHSOL ) THEN - XSHMIX(JI,JJ) = XSHAUT (JK-1) & - +( XSHAUT (JK) - XSHAUT (JK-1) ) & - /( XSTHETAV(JK) - XSTHETAV(JK-1) ) & - *( XTHSOL - XSTHETAV(JK-1) ) - EXIT - ENDIF - END DO - XSHMIX(JI,JJ)=MAX(XSHMIX(JI,JJ),50.0) - - ! - !* XSUSTAR Vitesse de frottement. - ! - XSUSTAR(JI,JJ) = XSSFU(JI,JJ)*XSSFU(JI,JJ) & - +XSSFV(JI,JJ)*XSSFV(JI,JJ) - XSUSTAR(JI,JJ) = SQRT(SQRT(XSUSTAR(JI,JJ))) - ! - ! - ! - !* XSLMO Longueur de Monin-Obukhov. - ! - IF (XSWPTHP(JI,JJ,1).NE.0.) THEN - XSLMO(JI,JJ)= -XSTHETAV(1)*(XSUSTAR(JI,JJ)**3) & - / (XKARMAN*XG*XSWPTHP(JI,JJ,1)) - ENDIF - ! - ! - !* XSWSTAR Vitesse Verticale Convective. - ! - XSWSTAR(JI,JJ)=XG/XSTHETAV(1)*XSWPTHP(JI,JJ,1)*XSHMIX(JI,JJ) - XSWSTAR(JI,JJ)=SIGN(1.,XSWSTAR(JI,JJ)) & - * ( ABS(XSWSTAR(JI,JJ))**(1./3.)) - ! - ! - IF (CTURBPARAM=="HANNA".OR.CTURBPARAM=="HANNABIS") THEN - ! - IF ((XSLMO(JI,JJ).GT.0).AND.(XSLMO(JI,JJ).LE.300)) THEN - ! - !* Conditions stables. - ! - !* XSSIGU,XSSIGW <u'2>**0.5, <w'2>**0.5 - DO JK=1,NKMAX - IF (XSHAUT(JK).LT.XSHMIX(JI,JJ)) THEN - XSSIGU(JI,JJ,JK) = SQRT( 0.5 * & - ((2.0*(1-XSHAUT(JK)/XSHMIX(JI,JJ))*XSUSTAR(JI,JJ))**2) & - + ((1.3*(1-XSHAUT(JK)/XSHMIX(JI,JJ))*XSUSTAR(JI,JJ))**2) ) - XSSIGW(JI,JJ,JK) = 1.3*(1-XSHAUT(JK)/XSHMIX(JI,JJ)) & - *XSUSTAR(JI,JJ) - ELSE - XSSIGU(JI,JJ,JK) = 0.001 - XSSIGW(JI,JJ,JK) = 0.001 - ENDIF - ENDDO - ! - XSSIGU(JI,JJ,:)=MAX(0.001,XSSIGU(JI,JJ,:)) - XSSIGW(JI,JJ,:)=MAX(0.001,XSSIGW(JI,JJ,:)) - ! - !* Lagrangian time scale - XSTIMEU(JI,JJ,:) = 0.11*XSHMIX(JI,JJ)/XSSIGU(JI,JJ,:) & - *SQRT( XSHAUT(:)/XSHMIX(JI,JJ) ) - XSTIMEW(JI,JJ,:) = 0.10*XSHMIX(JI,JJ)/XSSIGW(JI,JJ,:) & - *( XSHAUT(:)/XSHMIX(JI,JJ) )**0.8 - ! - ! - ENDIF - ! - ! - IF (ABS(XSLMO(JI,JJ)).GT.300) THEN - ! - !* Conditions neutres. - ! - !* XSSIGU,XSSIGW <u'2>**0.5, <w'2>**0.5 - XSSIGU(JI,JJ,:)=SQRT( 0.5 * & - ((2.0*XSUSTAR(JI,JJ)*EXP(-3*XSCORIOZ(JI,JJ)*XSHAUT(:)/XSUSTAR(JI,JJ)))**2) & - + ((1.3*XSUSTAR(JI,JJ)*EXP(-2*XSCORIOZ(JI,JJ)*XSHAUT(:)/XSUSTAR(JI,JJ)))**2) ) - XSSIGW(JI,JJ,:)=1.3*XSUSTAR(JI,JJ)*EXP(-2*XSCORIOZ(JI,JJ)*XSHAUT(:)/XSUSTAR(JI,JJ)) - XSSIGU(JI,JJ,:)=MAX(0.001,XSSIGU(JI,JJ,:)) - XSSIGW(JI,JJ,:)=MAX(0.001,XSSIGW(JI,JJ,:)) - ! - !* lagrangian time scale - XSTIMEU(JI,JJ,:) = 0.5*XSHAUT(:)/ & - (XSSIGW(JI,JJ,:)*(1.+15.0*XSCORIOZ(JI,JJ)*XSHAUT(:)/XSUSTAR(JI,JJ))) - XSTIMEW(JI,JJ,:) = XSTIMEU(JI,JJ,:) - ! - ENDIF - ! - ! - IF ((XSLMO(JI,JJ).LT.0).AND.(XSLMO(JI,JJ).GE.-300)) THEN - ! - !* Conditions instables. - ! - !* XSSIGU,XSSIGW <u'2>**0.5, <w'2>**0.5 - ! - IF (CTURBPARAM=="HANNA") THEN - ! - DO JK=1,NKMAX - IF (XSHAUT(JK).LE.XSHMIX(JI,JJ)) THEN - XSSIGU(JI,JJ,JK)=XSUSTAR(JI,JJ) & - * (12+0.5*XSHMIX(JI,JJ)/ABS(XSLMO(JI,JJ)))**(1./3.) - ELSE - XSSIGU(JI,JJ,JK)=0.001 - ENDIF - ENDDO - ! - DO JK=1,NKMAX - !IF (XSHAUT(JK).LE.XSHMIX(JI,JJ)) THEN - ! XSSIGW(JI,JJ,JK)=SQRT( 1.2*XSWSTAR(JI,JJ)**2 & - ! *(1-0.9*XSHAUT(JK)/XSHMIX(JI,JJ)) & - ! *(XSHAUT(JK)/XSHMIX(JI,JJ))**(2/3) & - ! + (1.8-1.4*XSHAUT(JK)/XSHMIX(JI,JJ)) & - ! *XSUSTAR(JI,JJ)**2 ) - !ELSE - IF (XSHAUT(JK).LE.0.4*XSHMIX(JI,JJ)) THEN - XSSIGW(JI,JJ,JK)=0.763*(XSHAUT(JK)/XSHMIX(JI,JJ))**0.175 - ELSE IF (XSHAUT(JK).LE.0.96*XSHMIX(JI,JJ)) THEN - XSSIGW(JI,JJ,JK)=0.722*XSWSTAR(JI,JJ)* & - (1-XSHAUT(JK)/XSHMIX(JI,JJ))**0.207 - ELSE IF (XSHAUT(JK).LE.XSHMIX(JI,JJ)) THEN - XSSIGW(JI,JJ,JK)=0.37*XSWSTAR(JI,JJ) - ELSE - XSSIGW(JI,JJ,JK)=0.001 - ENDIF - ENDDO - ! - XSSIGU(JI,JJ,:)=MAX(0.001,XSSIGU(JI,JJ,:)) - XSSIGW(JI,JJ,:)=MAX(0.001,XSSIGW(JI,JJ,:)) - ! - !* Lagrangian time scale - XSTIMEU(JI,JJ,:) = 0.15*XSHMIX(JI,JJ)/XSSIGU(JI,JJ,:) - DO JK=1,NKMAX - IF (XSHAUT(JK).LE.(0.1*XSHMIX(JI,JJ))) THEN - IF ( XSHAUT(JK).LT.(XSZ0(JI,JJ)-XSLMO(JI,JJ)) ) THEN - XSTIMEW(JI,JJ,JK) = 0.1*XSHAUT(JK)/XSSIGW(JI,JJ,JK) & - / ( 0.55 - 0.38*(XSHAUT(JK)-XSZ0(JI,JJ))/ABS(XSLMO(JI,JJ))) - ELSE - XSTIMEW(JI,JJ,JK) = 0.59*XSHAUT(JK)/XSSIGW(JI,JJ,JK) - ENDIF - ELSE - XSTIMEW(JI,JJ,JK) = 0.15*XSHMIX(JI,JJ)/XSSIGW(JI,JJ,JK) & - *( 1.-EXP(-5*XSHAUT(JK)/XSHMIX(JI,JJ)) ) - ENDIF - END DO - ! - ELSE IF (CTURBPARAM=="HANNABIS") THEN - !* sigmas - XSSIGW(JI,JJ,:) = SQRT(2./3.*XSTKE(JI,JJ,:)) - XSSIGU(JI,JJ,:) = XSSIGW(JI,JJ,:) - !* Temps Lagrangien - DO JK=1,NKMAX - IF (XSHAUT(JK).LE.XSHMIX(JI,JJ)) THEN - XSTIMEU(JI,JJ,JK)=0.17*XSHMIX(JI,JJ)/XSSIGU(JI,JJ,JK) - XSTIMEW(JI,JJ,JK)=0.2*XSHMIX(JI,JJ)/XSSIGW(JI,JJ,JK)* & - (1-EXP(-4*XSHAUT(JK)/XSHMIX(JI,JJ)) & - -0.0003*EXP(8*XSHAUT(JK)/XSHMIX(JI,JJ))) - ELSE IF (XSHAUT(JK).LE.XSHMIX(JI,JJ)*1.2) THEN - XSTIMEU(JI,JJ,JK)= & - (1-(XSHAUT(JK)-XSHAUT(JK-1))/(XSHAUT(JK+1)-XSHAUT(JK-1)))* & - XSTIMEU(JI,JJ,JK-1) & - +(XSHAUT(JK)-XSHAUT(JK-1))/(XSHAUT(JK+1)-XSHAUT(JK-1))*10000.0 - XSTIMEW(JI,JJ,JK)= & - (1-(XSHAUT(JK)-XSHAUT(JK-1))/(XSHAUT(JK+1)-XSHAUT(JK-1)))* & - XSTIMEW(JI,JJ,JK-1) & - +(XSHAUT(JK)-XSHAUT(JK-1))/(XSHAUT(JK+1)-XSHAUT(JK-1))*10000.0 - ELSE - XSTIMEU(JI,JJ,JK)=10000.0 - XSTIMEW(JI,JJ,JK)=10000.0 - ENDIF - ENDDO - ! - ENDIF ! CTURBPARAM=HANNA ou HANNABIS - ! - ENDIF ! instable - ! - ELSE ! CTURBPARAM=="ISOTROPE" - ! - !* XSSIGU,XSSIGW <u'2>**0.5, <w'2>**0.5 - ! - XSSIGW(JI,JJ,:) = SQRT(2./3.*XSTKE(JI,JJ,:)) - XSSIGU(JI,JJ,:) = XSSIGW(JI,JJ,:) - ! - !* Lagrangian time scale - DO JK=1,NKMAX - IF (XSHAUT(JK).LE.XSHMIX(JI,JJ)) THEN - XSTIMEU(JI,JJ,JK)=ABS(2*(XSSIGU(JI,JJ,JK)**2)/(3*XSDISSIP(JI,JJ,JK))) - XSTIMEW(JI,JJ,JK)=ABS(2*(XSSIGW(JI,JJ,JK)**2)/(3*XSDISSIP(JI,JJ,JK))) - ELSE IF (XSHAUT(JK).LE.XSHMIX(JI,JJ)*1.2) THEN - XSTIMEU(JI,JJ,JK)= & - (1-(XSHAUT(JK)-XSHAUT(JK-1))/(XSHAUT(JK+1)-XSHAUT(JK-1)))*XSTIMEU(JI,JJ,JK-1) & - +(XSHAUT(JK)-XSHAUT(JK-1))/(XSHAUT(JK+1)-XSHAUT(JK-1))*1000.0 - XSTIMEW(JI,JJ,JK)=XSTIMEU(JI,JJ,JK) - ELSE - XSTIMEU(JI,JJ,JK)=1000.0 - XSTIMEW(JI,JJ,JK)=1000.0 - ENDIF - ENDDO - ! - ENDIF - ! - ! - END DO - END DO - ! - IF (IGRILLE.EQ.2) THEN - WRITE(YFTURB,'("TURB_LPDM",5I2.2)') ICURAA,ICURMM,ICURJJ,ICURHH,ICURMN - CALL IO_File_add2list(TZFILE,YFTURB,'TXT','WRITE') - CALL IO_File_open(TZFILE) - IFTURB = TZFILE%NLU - WRITE(UNIT=IFTURB,FMT='(5A12)') "WSTAR ","USTAR ", & - "HMIX ","LMO ", & - "WPTHP" - WRITE(UNIT=IFTURB,FMT='(5F12.5)') XSWSTAR(15,15),XSUSTAR(15,15), & - XSHMIX(15,15),XSLMO(15,15), & - XSWPTHP(15,15,1) - - - WRITE(UNIT=IFTURB,FMT='(8A12)') "HAUT ","TKE ", & - "DISS ","THETA ", & - "SIGU ","SIGW ", & - "TIMEU ","TIMEW " - DO JK=1,NKMAX - WRITE(UNIT=IFTURB,FMT='(6F12.5,2F12.1)') XSHAUT(JK),XSTKE(15,15,JK), & - XSDISSIP(15,15,JK),XSTH(15,15,JK), & - XSSIGU(15,15,JK),XSSIGW(15,15,JK), & - XSTIMEU(15,15,JK),XSTIMEW(15,15,JK) - - ENDDO - CALL IO_File_close(TZFILE) - ENDIF -! - - -! -!* 5. ECRITURES FIC MTO. -! ------------------ -! -! -DO JK = 1,NKMAX -WRITE(IFMTO) XSU(:,:,JK) ! Composante zonale du vent. -ENDDO -DO JK = 1,NKMAX -WRITE(IFMTO) XSV(:,:,JK) ! Composante meridienne du vent. -ENDDO -DO JK = 1,NKMAX -WRITE(IFMTO) XSW(:,:,JK) ! Vitesse verticale. -ENDDO -DO JK = 1,NKMAX -WRITE(IFMTO) XSTH(:,:,JK) ! Temperature potentielle. -ENDDO -DO JK = 1,NKMAX -WRITE(IFMTO) XSTKE(:,:,JK) ! Energie cinetique Turbulence -ENDDO -DO JK = 1,NKMAX -WRITE(IFMTO) (XSSIGU(:,:,JK))**2 ! SigmaU -ENDDO -DO JK = 1,NKMAX -WRITE(IFMTO) (XSSIGU(:,:,JK))**2 ! SigmaV -ENDDO -DO JK = 1,NKMAX -WRITE(IFMTO) (XSSIGW(:,:,JK))**2 ! SigmaW -ENDDO -DO JK = 1,NKMAX -WRITE(IFMTO) XSTIMEU(:,:,JK) ! Temps lagrangien U -ENDDO -DO JK = 1,NKMAX -WRITE(IFMTO) XSTIMEU(:,:,JK) ! Temps lagrangien V -ENDDO -DO JK = 1,NKMAX -WRITE(IFMTO) XSTIMEW(:,:,JK) ! Dissipation de TKE -ENDDO -WRITE(IFMTO) XSINRT -! -END SUBROUTINE MNH2LPDM_ECH diff --git a/src/PHYEX/ext/mnh2lpdm_ini.f90 b/src/PHYEX/ext/mnh2lpdm_ini.f90 deleted file mode 100644 index a18acfcbe..000000000 --- a/src/PHYEX/ext/mnh2lpdm_ini.f90 +++ /dev/null @@ -1,459 +0,0 @@ -!MNH_LIC Copyright 2009-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------------- -! ######spl - SUBROUTINE MNH2LPDM_INI(TPFILE1,TPFILE2,TPLOGFILE,TPGRIDFILE,TPDATEFILE) -!-------------------------------------------------------------------------- -!* MNH2S2_INI : INITIALISATION DU COUPLAGE MESO-NH / LPDM. -! -! Auteur : Francois BONNARDOT, DP/SERV/ENV -! Creation : 04.01.2009 (mnh2s2_ini.f90) -! -! -! Arguments explicites. -! --------------------- -! TPFILE1,TPFILE2 First and last files to treat -! TPLOGFILE Log file -! TPGRIDFILE Grid file -! TPDATEFILE Date file -! -! Modifications: -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 05/11/2020: correct I/O of MNH2LPDM -!-------------------------------------------------------------------------- -! -! -! -!* 0. INITIALISATION. -! --------------- -! -!* 0.1 Modules. -! -USE MODD_CST -USE MODD_DIM_n -use modd_field, only: tfieldmetadata, TYPEREAL -USE MODD_GRID -USE MODD_GRID_n -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT -USE MODD_MNH2LPDM -USE MODD_PARAMETERS -USE MODD_TIME -USE MODD_TIME_n -! -USE MODE_DATETIME -USE MODE_GRIDPROJ -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_MODELN_HANDLER -! -USE MODE_INI_CST, ONLY: INI_CST -USE MODI_READ_HGRID -USE MODI_XYTOLATLON -! -!* 0.2 Arguments. -! -IMPLICIT NONE -! -TYPE(TFILEDATA),POINTER,INTENT(INOUT) :: TPFILE1,TPFILE2 -TYPE(TFILEDATA),POINTER,INTENT(IN) :: TPLOGFILE -TYPE(TFILEDATA),POINTER,INTENT(IN) :: TPGRIDFILE -TYPE(TFILEDATA),POINTER,INTENT(IN) :: TPDATEFILE -! -! -!* 0.3 Variables locales. -! -CHARACTER(LEN=28) :: YNAME,YDAD ! Noms du FM et de son papa. -CHARACTER(LEN=2) :: YSTORAGE ! Type de variable. -! -REAL :: ZECHEANCE1,ZECHEANCE2 ! dist temp date modele - date courante -INTEGER :: IHHMDL,IMNMDL,ISSMDL ! h - mn - s du model -INTEGER :: IHHCUR1,IMNCUR1,ISSCUR1 -INTEGER :: IHHCUR2,IMNCUR2,ISSCUR2 -CHARACTER(LEN=14) :: YDATMDL,YDATCUR1,YDATCUR2 -! -REAL :: XLATOR,XLONOR,XPTLAT,XPTLON -REAL :: XXPTSOMNH,XYPTSOMNH -INTEGER :: JI,JJ,JK,a -INTEGER :: b,c,I -INTEGER, DIMENSION(:), ALLOCATABLE :: TAB1D -INTEGER, DIMENSION(:,:), ALLOCATABLE :: TAB2D -TYPE(DATE_TIME) :: TZDTCUR1,TZDTCUR2,TZDTEXP1 -INTEGER :: IFDAT,IFGRI,IFLOG -type(tfieldmetadata) :: tzfield -! -! -! -!* 1. INITIALISATION. -! --------------- -! -IFDAT = TPDATEFILE%NLU -IFGRI = TPGRIDFILE%NLU -IFLOG = TPLOGFILE%NLU -! -CALL INI_CST -! -CALL GOTO_MODEL(1) -! -! -!* 2. DONNEES MESO-NH. -! ---------------- -! -!* 2.1 Ouverture du fichier Meso-NH. -! -CALL IO_File_open(TPFILE1) -CALL IO_File_open(TPFILE2) -! -! -!* 2.2 Date et heure du modele. -! -CALL IO_Field_read(TPFILE1,'DTEXP',TZDTEXP1) -CALL IO_Field_read(TPFILE1,'DTCUR',TZDTCUR1) -CALL IO_Field_read(TPFILE2,'DTCUR',TZDTCUR2) -! -CALL DATETIME_DISTANCE(TZDTEXP1,TZDTCUR1,ZECHEANCE1) -CALL DATETIME_DISTANCE(TZDTEXP1,TZDTCUR2,ZECHEANCE2) -! -IHHMDL=INT(TZDTEXP1%xtime/3600) -IMNMDL=INT((TZDTEXP1%xtime-IHHMDL*3600)/60) -ISSMDL=INT(TZDTEXP1%xtime-IHHMDL*3600-IMNMDL*60) -IHHCUR1=INT(TZDTCUR1%xtime/3600) -IMNCUR1=INT((TZDTCUR1%xtime-IHHCUR1*3600)/60) -ISSCUR1=INT(TZDTCUR1%xtime-IHHCUR1*3600-IMNCUR1*60) -IHHCUR2=INT(TZDTCUR2%xtime/3600) -IMNCUR2=INT((TZDTCUR2%xtime-IHHCUR2*3600)/60) -ISSCUR2=INT(TZDTCUR2%xtime-IHHCUR2*3600-IMNCUR2*60) -! -WRITE(YDATMDL, '(I4.4,5I2.2)') TZDTEXP1%nyear, TZDTEXP1%nmonth, TZDTEXP1%nday, & - IHHMDL, IMNMDL, ISSMDL -WRITE(YDATCUR1,'(I4.4,5I2.2)') TZDTCUR1%nyear, TZDTCUR1%nmonth, TZDTCUR1%nday, & - IHHCUR1, IMNCUR1, ISSCUR1 -WRITE(YDATCUR2,'(I4.4,5I2.2)') TZDTCUR2%nyear, TZDTCUR2%nmonth, TZDTCUR2%nday, & - IHHCUR2, IMNCUR2, ISSCUR2 -! -NMDLAA=MOD( TZDTEXP1%nyear, 100 ) ! Annee arrondi a 2 chiffres. -NMDLMM=TZDTEXP1%nmonth -NMDLJJ=TZDTEXP1%nday -NMDLSS=NINT(TZDTEXP1%xtime) -! -!* Heure du modele arrondie a 5 minutes pres. -! -NMDLMN = NINT( (REAL(NMDLSS)/60.0)/5.0 )*5 -NMDLSS = 0 -NMDLHH =NMDLMN/60 -NMDLMN =NMDLMN-NMDLHH*60 -! -!* 2.3 Grille horizontale. -! -CALL READ_HGRID(1,TPFILE1,YNAME,YDAD,YSTORAGE) -IF (YNAME == YDAD) THEN -IGRILLE=1 -ELSE -IGRILLE=2 -ENDIF -print*,IGRILLE -! -! Lecture grille horizontale -! -NIU=NIMAX+2*JPHEXT -NJU=NJMAX+2*JPHEXT -NIB=1+JPHEXT -NJB=1+JPHEXT -NIE=NIU-JPHEXT -NJE=NJU-JPHEXT -! -! -!* 2.4 Nombre de niveaux-verticaux. -! -CALL IO_Field_read(TPFILE1,'KMAX',NKMAX) -!WRITE(IFLOG,*) '%%% MNH2S2_INI Lecture du nombre de niveau OK.' -! -NKU = NKMAX+2*JPVEXT -NKB = 1+JPVEXT -NKE = NKU-JPVEXT -! -! -!* 2.5 Allocations Meso-NH. -! -ALLOCATE( XZHAT(NKU) ) -ALLOCATE( XZS(NIU,NJU) ) -ALLOCATE( XZ0(NIU,NJU) ) -ALLOCATE( XUT(NIU,NJU,NKU)) -ALLOCATE( XVT(NIU,NJU,NKU)) -ALLOCATE( XWT(NIU,NJU,NKU)) -ALLOCATE( XTHT(NIU,NJU,NKU)) -ALLOCATE( XTKET(NIU,NJU,NKU)) -ALLOCATE( XLM(NIU,NJU,NKU)) -ALLOCATE( XDISSIP(NIU,NJU,NKU)) -ALLOCATE( XWPTHP(NIU,NJU,NKU)) -ALLOCATE( XRMVT(NIU,NJU,NKU)) -ALLOCATE( XRMCT(NIU,NJU,NKU)) -ALLOCATE( XRMRT(NIU,NJU,NKU)) -ALLOCATE( XINRT(NIU,NJU)) -ALLOCATE( XSFU(NIU,NJU)) -ALLOCATE( XSFV(NIU,NJU)) -! -!* 2.6 Decoupage vertical. -! -CALL IO_Field_read(TPFILE1,'ZHAT',XZHAT) -CALL IO_Field_read(TPFILE1,'ZTOP',XZTOP) -! -!* 2.7 Orographie. -! -CALL IO_Field_read(TPFILE1,'ZS',XZS) -! -!* 2.8 Rugosite Z0. -! -tzfield = tfieldmetadata( & - cmnhname = 'Z0', & - clongname = '', & - cunits = 'm', & - cdir = 'XY', & - ccomment = 'X_Y_Z0', & - ngrid = 4, & - ntype = TYPEREAL, & - ndims = 2 ) -CALL IO_Field_read(TPFILE1,tzfield,XZ0) -! -XXPTSOMNH=XXHAT(1)+(XXHAT(2)-XXHAT(1))/2 -XYPTSOMNH=XYHAT(1)+(XYHAT(2)-XYHAT(1))/2 -CALL SM_LATLON(XLATORI,XLONORI,XXPTSOMNH,XYPTSOMNH,XLATOR,XLONOR) -! -!* 2.9 DOMAINE D'EXTRACTION. -! --------------------- -! -NSIB = NIB -NSIE = NIE -NSJB = NJB -NSJE = NJE -! -NSIMAX = NSIE-NSIB+1 -NSJMAX = NSJE-NSJB+1 -! -! -!* 3. Impression de controle Meso-NH. -! ------------------------------- -! -! Domaine horizontal Meso-NH. -!modif 12.2014 : passage a 1 seul domaine MesoNH -! --------------------------- -WRITE(IFLOG,'(I1,a12)') IGRILLE,' ngrid ' -!WRITE(IFLOG,'(a13)') '2 ngrids' -WRITE(IFLOG,'(a13)') '1 ngrids' -WRITE(IFLOG,'(i4,3x,a6)') NSIMAX,'nx ' -WRITE(IFLOG,'(i4,3x,a6)') NSJMAX,'ny ' -WRITE(IFLOG,'(i4,3x,a6)') NKU-2,'nz ' -WRITE(IFLOG,'(i4,3x,a6)') NKU-3,'nzg ' -WRITE(IFLOG,'(a13)') '12 npatch' -WRITE(IFLOG,'(a13)') '0 icloud' -WRITE(IFLOG,'(a11)') '0.0 wlon ' -WRITE(IFLOG,'(a11)') '45.0 rnlat ' -WRITE(IFLOG,'(f10.1,3x,a6)') XZHAT(NKE),'s ' -WRITE(IFLOG,'(f8.0,a8)') ZECHEANCE1,' time1 ' -WRITE(IFLOG,'(f8.0,a8)') ZECHEANCE2,' time2 ' -WRITE(IFLOG,'(a13)') '3600 dtmet ' -WRITE(IFLOG,'(a13)') 'm tunits' -WRITE(IFLOG,'(a13)') '12 nvout ' -WRITE(IFLOG,'(6x,a8,i4)') 'u ',1 -WRITE(IFLOG,'(6x,a8,i4)') 'v ',1 -WRITE(IFLOG,'(6x,a8,i4)') 'w ',1 -WRITE(IFLOG,'(6x,a8,i4)') 'tp ',1 -WRITE(IFLOG,'(6x,a8,i4)') 'tke ',1 -WRITE(IFLOG,'(6x,a8,i4)') 'uu ',1 -WRITE(IFLOG,'(6x,a8,i4)') 'vv ',1 -WRITE(IFLOG,'(6x,a8,i4)') 'ww ',1 -WRITE(IFLOG,'(6x,a8,i4)') 'tlx ',1 -WRITE(IFLOG,'(6x,a8,i4)') 'tly ',1 -WRITE(IFLOG,'(6x,a8,i4)') 'tlz ',1 -WRITE(IFLOG,'(6x,a8,i4)') 'intopr ',1 -WRITE(IFLOG,*) ' grid structure' -! -!* 4. FICHIER METEO. -! -------------- -! -!* 4.1 Allocations. -! -ALLOCATE( XSHAUT(NKMAX)) -ALLOCATE( XSREL(NSIMAX,NSJMAX) ) -ALLOCATE( XSZ0(NSIMAX,NSJMAX) ) -ALLOCATE( XSCORIOZ (NSIMAX,NSJMAX) ) -ALLOCATE( XSPHI(NSIMAX,NSJMAX,NKMAX) ) -ALLOCATE( XSU(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSV(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSW(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSTH(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSTKE(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSLM(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSDISSIP(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSWPTHP(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSRMV(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSRMC(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSRMR(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSINRT(NSIMAX,NSJMAX)) -ALLOCATE( XSSFU(NSIMAX,NSJMAX)) -ALLOCATE( XSSFV(NSIMAX,NSJMAX)) -ALLOCATE( XSTIMEW(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSTIMEU(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSSIGW(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSSIGU(NSIMAX,NSJMAX,NKMAX)) -ALLOCATE( XSUSTAR(NSIMAX,NSJMAX)) -ALLOCATE( XSWSTAR(NSIMAX,NSJMAX)) -ALLOCATE( XSHMIX(NSIMAX,NSJMAX)) -ALLOCATE( XSLMO(NSIMAX,NSJMAX)) -ALLOCATE( XSTHETAV(NKMAX)) - -! -! 4.2. Nombre de niveaux en Z -! -XSHAUT(1:NKMAX) = (XZHAT(NKB:NKE)+XZHAT(NKB+1:NKE+1))/2. -print*,"niveaux hauteur" -DO JK=1,NKMAX -print*,XSHAUT(JK) -ENDDO -! -! 4.3. Calcul du tableau contenant les coef. de coriolis de la grille -! -DO JI=NSIB,NSIE ; DO JJ=NSJB,NSJE - CALL SM_LATLON(XLATORI,XLONORI,XXHAT(JI),XYHAT(JJ),XPTLAT,XPTLON) - XSCORIOZ(JI-1,JJ-1)=2.*XOMEGA*SIN(XPTLAT*XPI/180.) -ENDDO ; ENDDO -! -! -!* 4.4 Geometrie de la grille et positionnement. -! -! -! On a besoin du point sud-ouest, c'est-a-dire de l'angle inferieur gauche -! du domaine physique de la maille "en bas a gauche". Ca tombe bien, on -! va travailler avec les XXHAT et les XYHAT directement. -! -XPASXM = XXHAT(2)-XXHAT(1) ! Pas selon X en metres. -XPASYM = XYHAT(2)-XYHAT(1) ! Pas selon Y en metres. -ZMAILLE = MAX(XPASXM,XPASYM) -! -!* 4.5 Constantes et champs constants. -! -!* Relief. -! -XSREL(:,:) = XZS(NSIB:NSIE,NSJB:NSJE) -! -!* Geopotentiel PHI -! -print*,"Geopotentiel" -DO JK=1,NKMAX -XSPHI(:,:,JK) = (XSREL(:,:)+XSHAUT(JK))*XG -print*,MINVAL(XSPHI(:,:,JK)),MAXVAL(XSPHI(:,:,JK)) -ENDDO -! -!* Rugosite. -! -XSZ0(:,:) = XZ0(NSIB:NSIE,NSJB:NSJE) -print*,"Rugosite" -print*,MINVAL(XSZ0),MAXVAL(XSZ0) -! -!* 5 FICHIER DATES. -! ------------- -! -WRITE(IFDAT,'(A14)') YDATMDL -WRITE(IFDAT,'(A14)') YDATCUR1 -WRITE(IFDAT,'(A14)') YDATCUR2 -! -!* 5. FICHIER GRILLE. -! -------------- -! -! -!* 5.1 Infos franchement utiles. -! -WRITE(IFGRI,'(F15.8,1X,A)') & - XLON0, 'XLON0 Longitude reference (deg.deci.)' -WRITE(IFGRI,'(F15.8,1X,A)') & - XLAT0, 'XLAT0 Latitude reference (deg.deci.)' -WRITE(IFGRI,'(F15.8,1X,A)') & - XBETA, 'XBETA Rotation grille (deg.deci.)' -WRITE(IFGRI,'(F15.8,1X,A)') XRPK, 'XRPK Facteur de conicite' -WRITE(IFGRI,'(F15.8,1X,A)') & - XLONOR, 'XLONOR Longitude origine (deg.deci.)' -WRITE(IFGRI,'(F15.8,1X,A)') & - XLATOR, 'XLATOR Latitude origine (deg.deci.)' -WRITE(IFGRI,'(F15.1,1X,A)') XXHAT(1),'XHAT(1) Coord. Cartesienne (m)' -WRITE(IFGRI,'(F15.1,1X,A)') XXHAT(2),'XHAT(2) Coord. Cartesienne (m)' -WRITE(IFGRI,'(F15.1,1X,A)') XYHAT(1),'YHAT(1) Coord. Cartesienne (m)' -WRITE(IFGRI,'(F15.1,1X,A)') XYHAT(2),'YHAT(2) Coord. Cartesienne (m)' -! -print*,"GRILLE" -print*,"LON0 : ",XLON0 -print*,"LAT0 : ",XLAT0 -print*,"BETA : ",XBETA -print*,"RPK : ",XRPK -print*,"LONOR: ",XLONOR -print*,"LATOR: ",XLATOR -! -!* 5.2 Points de grille x y z zg -! -WRITE(IFLOG,*)NSIMAX,' gridpoints in x direction' -WRITE(IFLOG,'(8f10.0)')XXHAT(NSIB:NSIE) -WRITE(IFLOG,*)NSJMAX,' gridpoints y direction' -WRITE(IFLOG,'(8f10.0)')XYHAT(NSJB:NSJE) -WRITE(IFLOG,*)NKMAX,' main gridpoints in z direction' -WRITE(IFLOG,'(8f10.2)')XSHAUT(1:NKMAX) -WRITE(IFLOG,'(i4,3x,a38)')NKU-2,'intermediate gridpoints in z direction' -WRITE(IFLOG,'(8f10.2)')XZHAT(2:NKU-1) -WRITE(IFLOG,*)' ==================================================' -! -! Topographie -! -WRITE(IFLOG,*) 'TERRAIN TOPOGRAPHY' -c=1 -a=0 -!modif 12/2014 : passage a une grille haute resolution MesoNH, on depasse 99 -!300 format(i2,'|',18i4) -300 format(i3,'|',18i5) -!400 format(i2,'|',18(f4.2)) -!400 format(i3,'|',18(f5.2)) -!301 format(3x,18('__',i2)) -301 format(3x,18('__',i3)) -ALLOCATE(TAB2D(NSIMAX,NSJMAX)) -ALLOCATE(TAB1D(NSIMAX)) -DO I=1,NSIMAX - TAB1D(I)=I -ENDDO -TAB2D(:,:) = NINT(XSREL(:,:)) -DO WHILE (c.lt.(NSIMAX+1)) - DO b=NSJB,NSJE - IF ((c+17).LT.(NSIMAX+1)) then - a=NSJMAX-b+NSJB - WRITE(IFLOG,300) a,TAB2D(c:c+17,a) - ELSE - a=NSJMAX-b+NSJB - WRITE(IFLOG,300) a,TAB2D(c:NSIMAX,a) - ENDIF - ENDDO -IF ((c+17).LT.(NSIMAX+1)) then - WRITE(IFLOG,301) TAB1D(c:c+17) -ELSE - WRITE(IFLOG,301) TAB1D(c:NSIMAX) -ENDIF - -c=c+18 -ENDDO -! -DEALLOCATE(TAB2D) -DEALLOCATE(TAB1D) -DEALLOCATE(XZS) -DEALLOCATE(XZ0) -DEALLOCATE(XZHAT) -! -! Fermeture du fichier Meso-NH. -! -CALL IO_File_close(TPFILE1) -CALL IO_File_close(TPFILE2) -! -! -!-------------------------------------------' -print*,' FIN MNH2LPDM_INI' -!-------------------------------------------' -! -! -END SUBROUTINE MNH2LPDM_INI diff --git a/src/PHYEX/ext/modeln.f90 b/src/PHYEX/ext/modeln.f90 deleted file mode 100644 index 8079f0d34..000000000 --- a/src/PHYEX/ext/modeln.f90 +++ /dev/null @@ -1,2415 +0,0 @@ -!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ################### - MODULE MODI_MODEL_n -! ################### -! -INTERFACE -! - SUBROUTINE MODEL_n( KTCOUNT, TPBAKFILE, TPDTMODELN, OEXIT ) -! -USE MODD_IO, ONLY: TFILEDATA -USE MODD_TYPE_DATE, ONLY: DATE_TIME -! -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop index of model KMODEL -TYPE(TFILEDATA), POINTER, INTENT(OUT) :: TPBAKFILE ! Pointer for backup file -TYPE(DATE_TIME), INTENT(OUT) :: TPDTMODELN ! Time of current model computation -LOGICAL, INTENT(INOUT) :: OEXIT ! Switch for the end of the temporal loop -! -END SUBROUTINE MODEL_n -! -END INTERFACE -! -END MODULE MODI_MODEL_n - -! ################################### - SUBROUTINE MODEL_n( KTCOUNT, TPBAKFILE, TPDTMODELN, OEXIT ) -! ################################### -! -!!**** *MODEL_n * -monitor of the model version _n -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to build up a typical model version -! by sequentially calling the specialized routines. -! -!!** METHOD -!! ------ -!! Some preliminary initializations are performed in the first section. -!! Then, specialized routines are called to update the guess of the future -!! instant XRxxS of the variable xx by adding the effects of all the -!! different sources of evolution. -!! -!! (guess of xx at t+dt) * Rhod_ref * Jacobian -!! XRxxS = ------------------------------------------- -!! 2 dt -!! -!! At this level, the informations are transferred with a USE association -!! from the INIT step, where the modules have been previously filled. The -!! transfer to the subroutines computing each source term is performed by -!! argument in order to avoid repeated compilations of these subroutines. -!! This monitor model_n, must therefore be duplicated for each model, -!! model1 corresponds in this case to the outermost model, model2 is used -!! for the first level of gridnesting,.... -!! The effect of all parameterizations is computed in PHYS_PARAM_n, which -!! is itself a monitor. This is due to a possible large number of -!! parameterizations, which can be activated and therefore, will require a -!! very large list of arguments. To circumvent this problem, we transfer by -!! a USE association, the necessary informations in this monitor, which will -!! dispatch the pertinent information to every parametrization. -!! Some elaborated diagnostics, LES tools, budget storages are also called -!! at this level because they require informations about the fields at every -!! timestep. -!! -!! -!! EXTERNAL -!! -------- -!! Subroutine IO_File_open: to open a file -!! Subroutine WRITE_DESFM: to write the descriptive part of a FMfile -!! Subroutine WRITE_LFIFM: to write the binary part of a FMfile -!! Subroutine SET_MASK : to compute all the masks selected for budget -!! computations -!! Subroutine BOUNDARIES : set the fields at the marginal points in every -!! directions according the selected boundary conditions -!! Subroutine INITIAL_GUESS: initializes the guess of the future instant -!! Subroutine LES_FLX_SPECTRA: computes the resolved fluxes and the -!! spectra of some quantities when running in LES mode. -!! Subroutine ADVECTION: computes the advection terms. -!! Subroutine DYN_SOURCES: computes the curvature, Coriolis, gravity terms. -!! Subroutine NUM_DIFF: applies the fourth order numerical diffusion. -!! Subroutine RELAXATION: performs the relaxation to Larger Scale fields -!! in the upper levels and outermost vertical planes -!! Subroutine PHYS_PARAM_n : computes the parameterized physical terms -!! Subroutine RAD_BOUND: prepares the velocity normal components for the bc. -!! Subroutine RESOLVED_CLOUD : computes the sources terms for water in any -!! form -!! Subroutine PRESSURE : computes the pressure gradient term and the -!! absolute pressure -!! Subroutine EXCHANGE : updates the halo of each subdomains -!! Subroutine ENDSTEP : advances in time the fields. -!! Subroutines UVW_LS_COUPLING and SCALAR_LS_COUPLING: -!! compute the large scale fields, used to -!! couple Model_n with outer informations. -!! Subroutine ENDSTEP_BUDGET: writes the budget informations. -!! Subroutine IO_File_close: closes a file -!! Subroutine DATETIME_CORRECTDATE: transform the current time in GMT -!! Subroutine FORCING : computes forcing terms -!! Subroutine ADD3DFIELD_ll : add a field to 3D-list -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! MODD_DYN -!! MODD_CONF -!! MODD_NESTING -!! MODD_BUDGET -!! MODD_PARAMETERS -!! MODD_CONF_n -!! MODD_CURVCOR_n -!! MODD_DYN_n -!! MODD_DIM_n -!! MODD_ADV_n -!! MODD_FIELD_n -!! MODD_LSFIELD_n -!! MODD_GRID_n -!! MODD_METRICS_n -!! MODD_LBC_n -!! MODD_PARAM_n -!! MODD_REF_n -!! MODD_LUNIT_n -!! MODD_OUT_n -!! MODD_TIME_n -!! MODD_TURB_n -!! MODD_CLOUDPAR_n -!! MODD_TIME -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * LA * -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/09/94 -!! Modification 20/10/94 (J.Stein) for the outputs and abs_layers routines -!! Modification 10/11/94 (J.Stein) change ABS_LAYER_FIELDS call -!! Modification 16/11/94 (J.Stein) add call to the renormalization -!! Modification 17/11/94 (J.-P. Lafore and J.-P. Pinty) call NUM_DIFF -!! Modification 08/12/94 (J.Stein) cleaning + remove (RENORM + ABS_LAYER.. -!! ..) + add RELAXATION + LS fiels in the arguments -!! Modification 19/12/94 (J.Stein) switch for the num diff -!! Modification 22/12/94 (J.Stein) update tdtcur + change dyn_source call -!! Modification 05/01/95 (J.Stein) add the parameterization monitor -!! Modification 09/01/95 (J.Stein) add the 1D switch -!! Modification 10/01/95 (J.Stein) displace the TDTCUR computation -!! Modification 03/01/95 (J.-P. Lafore) Absolute pressure diagnosis -!! Modification Jan 19, 1995 (J. Cuxart) Shunt the DYN_SOURCES in 1D cases. -!! Modification Jan 24, 1995 (J. Stein) Interchange Boundaries and -!! Initial_guess to correct a bug in 2D configuration -!! Modification Feb 02, 1995 (I.Mallet) update BOUNDARIES and RAD_BOUND -!! calls -!! Modification Mar 10, 1995 (I.Mallet) add call to SET_COUPLING -!! March,21, 1995 (J. Stein) remove R from the historical var. -!! March,26, 1995 (J. Stein) add the EPS variable -!! April 18, 1995 (J. Cuxart) add the LES call -!! Sept 20,1995 (Lafore) coupling for the dry mass Md -!! Nov 2,1995 (Stein) displace the temporal counter increase -!! Jan 2,1996 (Stein) rm the test on the temporal counter -!! Modification Feb 5,1996 (J. Vila) implementation new advection -!! schemes for scalars -!! Modification Feb 20,1996 (J.Stein) doctor norm -!! Dec95 - Jul96 (Georgelin, Pinty, Mari, Suhre) FORCING -!! June 17,1996 (Vincent, Lafore, Jabouille) -!! statistics of computing time -!! Aug 8, 1996 (K. Suhre) add chemistry -!! October 12, 1996 (J. Stein) save the PSRC value -!! Sept 05,1996 (V.Masson) print of loop index for debugging -!! purposes -!! July 22,1996 (Lafore) improve write of computing time statistics -!! July 29,1996 (Lafore) nesting introduction -!! Aug. 1,1996 (Lafore) synchronization between models -!! Sept. 4,1996 (Lafore) modification of call to routine SET_COUPLING -!! now split in 2 routines -!! (UVW_LS_COUPLING and SCALAR_LS_COUPLING) -!! Sept 5,1996 (V.Masson) print of loop index for debugging -!! purposes -!! Sept 25,1996 (V.Masson) test for coupling performed here -!! Oct. 29,1996 (Lafore) one-way nesting implementation -!! Oct. 12,1996 (J. Stein) save the PSRC value -!! Dec. 12,1996 (Lafore) change call to RAD_BOUND -!! Dec. 21,1996 (Lafore) two-way nesting implementation -!! Mar. 12,1997 (Lafore) introduction of "surfacic" LS fields -!! Nov 18, 1996 (J.-P. Pinty) FORCING revisited (translation) -!! Dec 04, 1996 (J.-P. Pinty) include mixed-phase clouds -!! Dec 20, 1996 (J.-P. Pinty) update the budgets -!! Dec 23, 1996 (J.-P. Pinty) add the diachronic file control -!! Jan 11, 1997 (J.-P. Pinty) add the deep convection control -!! Dec 20,1996 (V.Masson) call boundaries before the writing -!! Fev 25, 1997 (P.Jabouille) modify the LES tools -!! April 3,1997 (Lafore) merging of the nesting -!! developments on MASTER3 -!! Jul. 8,1997 (Lafore) print control for nesting (NVERB>=7) -!! Jul. 28,1997 (Masson) supress LSTEADY_DMASS -!! Aug. 19,1997 (Lafore) full Clark's formulation introduction -!! Sept 26,1997 (Lafore) LS source calculation at restart -!! (temporarily test to have LS at instant t) -!! Jan. 28,1998 (Bechtold) add SST forcing -!! fev. 10,1998 (Lafore) RHODJ computation and storage for budget -!! Jul. 10,1998 (Stein ) sequentiel loop for nesting -!! Apr. 07,1999 (Stein ) cleaning of the nesting subroutines -!! oct. 20,1998 (Jabouille) // -!! oct. 20,2000 (J.-P. Pinty) add the C2R2 scheme -!! fev. 01,2001 (D.Gazen) add module MODD_NSV for NSV variables -!! mar, 4,2002 (V.Ducrocq) call to temporal series -!! mar, 8, 2001 (V. Masson) advection of perturbation of theta in neutral cases. -!! Nov, 6, 2002 (V. Masson) time counters for budgets & LES -!! mars 20,2001 (Pinty) add ICE4 and C3R5 options -!! jan. 2004 (Masson) surface externalization -!! sept 2004 (M. Tomasini) Cloud mixing length modification -!! june 2005 (P. Tulet) add aerosols / dusts -!! Jul. 2005 (N. Asencio) two_way and phys_param calls: -!! Add the surface parameters : precipitating -!! hydrometeors, Short and Long Wave , MASKkids array -!! Fev. 2006 (M. Leriche) add aqueous phase chemistry -!! april 2006 (T.Maric) Add halo related to 4th order advection scheme -!! May 2006 Remove KEPS -!! Oct 2008 (C.Lac) FIT for variables advected with PPM -!! July 2009 : Displacement of surface diagnostics call to be -!! coherent with surface diagnostics obtained with DIAG -!! 10/11/2009 (P. Aumond) Add mean moments -!! Nov, 12, 2009 (C. Barthe) add cloud electrification and lightning flashes -!! July 2010 (M. Leriche) add ice phase chemical species -!! April 2011 (C.Lac) : Remove instant M -!! April 2011 (C.Lac, V.Masson) : Time splitting for advection -!! J.Escobar 21/03/2013: for HALOK comment all NHALO=1 test -!! P. Tulet Nov 2014 accumulated moles of aqueous species that fall at the surface -!! Dec 2014 (C.Lac) : For reproducibility START/RESTA -!! J.Escobar 20/04/2015: missing UPDATE_HALO before UPDATE_HALO2 -!! July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for -!! aircraft, ballon and profiler -!! C.Lac 11/09/2015: correction of the budget due to FIT temporal scheme -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! Sep 2015 (S. Bielli) : Remove YDADFILE from argument call -! of write_phys_param -!! J.Escobar : 19/04/2016 : Pb IOZ/NETCDF , missing OPARALLELIO=.FALSE. for PGD files -!! M.Mazoyer : 04/2016 DTHRAD used for radiative cooling when LACTIT -!!! Modification 01/2016 (JP Pinty) Add LIMA -!! 06/2016 (G.Delautier) phasage surfex 8 -!! M.Leriche : 03/2016 Move computation of accumulated chem. in rain to ch_monitor -!! 09/2016 Add filter on negative values on AERDEP SV before relaxation -!! 10/2016 (C.Lac) _ Correction on the flag for Strang splitting -!! to insure reproducibility between START and RESTA -!! _ Add OSPLIT_WENO -!! _ Add droplet deposition -!! 10/2016 (M.Mazoyer) New KHKO output fields -!! P.Wautelet : 11/07/2016 : removed MNH_NCWRIT define -!! 09/2017 Q.Rodier add LTEND_UV_FRC -!! 10/2017 (C.Lac) Necessity to have chemistry processes as -!! the las process modifying XRSVS -!! 01/2018 (G.Delautier) SURFEX 8.1 -!! 03/2018 (P.Wautelet) replace ADD_FORECAST_TO_DATE by DATETIME_CORRECTDATE -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! 07/2017 (V. Vionnet) : Add blowing snow scheme -!! S. Riette : 11/2016 Add ZPABST to keep pressure constant during timestep -!! 01/2018 (C.Lac) Add VISCOSITY -!! Philippe Wautelet: 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll -! to allow to disable writes (for bench purposes) -! P. Wautelet 07/02/2019: remove OPARALLELIO argument from open and close files subroutines -! (nsubfiles_ioz is now determined in IO_File_add2list) -!! 02/2019 C.Lac add rain fraction as an output field -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables -! P. Wautelet 28/03/2019: use TFILE instead of unit number for set_iluout_timing -! P. Wautelet 19/04/2019: removed unused dummy arguments and variables -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! J. Escobar 09/07/2019: norme Doctor -> Rename Module Type variable TZ -> T -! J. Escobar 09/07/2019: for bug in management of XLSZWSM variable, add/use specific 2D TLSFIELD2D_ll pointer -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! J. Escobar 27/09/2019: add missing report timing of RESOLVED_ELEC -! P. Wautelet 02-03/2020: use the new data structures and subroutines for budgets -! P. Wautelet 12/10/2020: Write_les_n: remove HLES_AVG dummy argument and group all 4 calls -! F. Auguste 01/02/2021: add IBM -! T. Nagel 01/02/2021: add turbulence recycling -! P. Wautelet 19/02/2021: add NEGA2 term for SV budgets -! J.L. Redelsperger 03/2021: add Call NHOA_COUPLN (coupling O & A LES version) -! R. Schoetter 12/2021 multi-level coupling between MesoNH and SURFEX -! A. Costes 12/2021: add Blaze fire model -! C. Barthe 07/04/2022: deallocation of ZSEA -! P. Wautelet 08/12/2022: bugfix if no TDADFILE -! P. Wautelet 13/01/2023: manage close of backup files outside of MODEL_n -! (useful to close them in reverse model order (child before parent, needed by WRITE_BALLOON_n) -! J. Wurtz 01/2023 : correction for mean in SURFEX outputs -!!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_2D_FRC -USE MODD_ADV_n -USE MODD_AIRCRAFT_BALLOON -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODD_BAKOUT -USE MODD_BIKHARDT_n -USE MODD_BLANK_n -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n -use modd_budget, only: cbutype, lbu_ru, lbu_rv, lbu_rw, lbudget_u, lbudget_v, lbudget_w, lbudget_sv, lbu_enable, & - NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_SV1, nbumod, nbutime, & - tbudgets, tbuconf, tburhodj, & - xtime_bu, xtime_bu_process -USE MODD_CH_AERO_n, ONLY: XSOLORG, XMI -USE MODD_CH_MNHC_n, ONLY: LUSECHEM,LCH_CONV_LINOX,LUSECHAQ,LUSECHIC, & - LCH_INIT_FIELD -USE MODD_CLOUD_MF_n -USE MODD_CLOUDPAR_n -USE MODD_CONF -USE MODD_CONF_n -USE MODD_CST, ONLY: CST -USE MODD_CURVCOR_n -USE MODD_DEEP_CONVECTION_n -USE MODD_DIM_n -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_DRAG_n -USE MODD_DUST, ONLY: LDUST -USE MODD_DYN -USE MODD_DYN_n -USE MODD_DYNZD -USE MODD_DYNZD_n -USE MODD_ELEC_DESCR -USE MODD_EOL_MAIN -USE MODD_FIELD_n -USE MODD_FIRE_n -USE MODD_FRC -USE MODD_FRC_n -USE MODD_GET_n -USE MODD_GRID, ONLY: XLONORI,XLATORI -USE MODD_GRID_n -USE MODD_IBM_PARAM_n, ONLY: CIBM_ADV, LIBM, LIBM_TROUBLE, XIBM_LS -USE MODD_ICE_C1R3_DESCR, ONLY: XRTMIN_C1R3=>XRTMIN -USE MODD_IO, ONLY: LIO_NO_WRITE, TFILEDATA, TFILE_SURFEX, TFILE_DUMMY -USE MODD_LBC_n -USE MODD_LES -USE MODD_LES_BUDGET -USE MODD_LIMA_PRECIP_SCAVENGING_n -USE MODD_LSFIELD_n -USE MODD_LUNIT, ONLY: TOUTDATAFILE -USE MODD_LUNIT_n, ONLY: TDIAFILE,TINIFILE,TINIFILEPGD,TLUOUT -USE MODD_MEAN_FIELD -USE MODD_MEAN_FIELD_n -USE MODD_METRICS_n -USE MODD_MNH_SURFEX_n -USE MODD_NESTING -USE MODD_NSV -USE MODD_NUDGING_n -USE MODD_OUT_n -USE MODD_PARAM_C1R3, ONLY: NSEDI => LSEDI, NHHONI => LHHONI -USE MODD_PARAM_C2R2, ONLY: NSEDC => LSEDC, NRAIN => LRAIN, NACTIT => LACTIT,LACTTKE,LDEPOC -USE MODD_PARAMETERS -USE MODD_PARAM_ICE_n, ONLY: LWARM,LSEDIC,LCONVHG,LDEPOSC, CSUBG_AUCV_RC -USE MODD_PARAM_LIMA, ONLY: MSEDC => LSEDC, NMOM_C, NMOM_R, & - MACTIT => LACTIT, LSCAV, NMOM_I, & - MSEDI => LSEDI, MHHONI => LHHONI, NMOM_H, & - XRTMIN_LIMA=>XRTMIN, MACTTKE=>LACTTKE -USE MODD_PARAM_MFSHALL_n -USE MODD_PARAM_n -USE MODD_PAST_FIELD_n -USE MODD_PRECIP_n -use modd_precision, only: MNHTIME -USE MODD_PROFILER_n -USE MODD_RADIATIONS_n, ONLY: XTSRAD,XSCAFLASWD,XDIRFLASWD,XDIRSRFSWD, XAER, XDTHRAD -USE MODD_RAIN_ICE_DESCR_n, ONLY: XRTMIN -USE MODD_RECYCL_PARAM_n, ONLY: LRECYCL -USE MODD_REF, ONLY: LCOUPLES -USE MODD_REF_n -USE MODD_SALT, ONLY: LSALT -USE MODD_SERIES, ONLY: LSERIES -USE MODD_SERIES_n, ONLY: NFREQSERIES -USE MODD_STATION_n -USE MODD_SUB_MODEL_n -USE MODD_TIME -USE MODD_TIME_n -USE MODD_TIMEZ -USE MODD_TURB_n -USE MODD_NEB_n, ONLY: VSIGQSAT, LSIGMAS, LSUBG_COND -USE MODD_TYPE_DATE, ONLY: DATE_TIME -USE MODD_VISCOSITY -! -USE MODE_AIRCRAFT_BALLOON -use mode_budget, only: Budget_store_init, Budget_store_end -USE MODE_DATETIME -USE MODE_ELEC_ll -USE MODE_GRIDCART -USE MODE_GRIDPROJ -USE MODE_IO_FIELD_WRITE, only: IO_Field_user_write, IO_Fieldlist_write, IO_Header_write -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -USE MODE_ll -#ifdef MNH_IOLFI -use mode_menu_diachro, only: MENU_DIACHRO -#endif -USE MODE_MNH_TIMING -USE MODE_MODELN_HANDLER -USE MODE_MPPDB -USE MODE_MSG -USE MODE_ONE_WAY_n -USE MODE_WRITE_AIRCRAFT_BALLOON -use mode_write_les_n, only: Write_les_n -use mode_write_lfifmn_fordiachro_n, only: WRITE_LFIFMN_FORDIACHRO_n -USE MODE_WRITE_STATPROF_n, ONLY: WRITE_STATPROF_n -! -USE MODI_ADDFLUCTUATIONS -USE MODI_ADVECTION_METSV -USE MODI_ADVECTION_UVW -USE MODI_ADVECTION_UVW_CEN -USE MODI_ADV_FORCING_n -USE MODI_AER_MONITOR_n -USE MODI_BLOWSNOW -USE MODI_BOUNDARIES -USE MODI_BUDGET_FLAGS -USE MODI_CART_COMPRESS -USE MODI_CH_MONITOR_n -USE MODI_DIAG_SURF_ATM_N -USE MODI_DYN_SOURCES -USE MODI_END_DIAG_IN_RUN -USE MODI_ENDSTEP -USE MODI_ENDSTEP_BUDGET -USE MODI_EXCHANGE -USE MODI_FORCING -USE MODI_FORC_SQUALL_LINE -USE MODI_FORC_WIND -USE MODI_GET_HALO -USE MODI_GRAVITY_IMPL -USE MODI_IBM_INIT -USE MODI_IBM_FORCING -USE MODI_IBM_FORCING_TR -USE MODI_IBM_FORCING_ADV -USE MODI_INI_DIAG_IN_RUN -USE MODI_INI_LG -USE MODI_INI_MEAN_FIELD -USE MODI_INITIAL_GUESS -USE MODI_LES_INI_TIMESTEP_n -USE MODI_LES_N -USE MODI_LIMA_PRECIP_SCAVENGING -USE MODI_LS_COUPLING -USE MODI_MASK_COMPRESS -USE MODI_MEAN_FIELD -USE MODI_MNHGET_SURF_PARAM_n -USE MODI_MNHWRITE_ZS_DUMMY_n -USE MODI_NUDGING -USE MODI_NUM_DIFF -USE MODI_PHYS_PARAM_n -USE MODI_PRESSUREZ -USE MODI_PROFILER_n -USE MODI_RAD_BOUND -USE MODI_RECYCLING -USE MODI_RELAX2FW_ION -USE MODI_RELAXATION -USE MODI_REL_FORCING_n -USE MODI_RESOLVED_CLOUD -USE MODI_RESOLVED_ELEC_n -USE MODI_SERIES_N -USE MODI_SETLB_LG -USE MODI_SET_MASK -USE MODI_SHUMAN -USE MODI_SPAWN_LS_n -USE MODI_STATION_n -USE MODI_TURB_CLOUD_INDEX -USE MODI_TWO_WAY -USE MODI_UPDATE_NSV -USE MODI_VISCOSITY -USE MODI_WRITE_DESFM_n -USE MODI_WRITE_DIAG_SURF_ATM_N -USE MODI_WRITE_LFIFM_n -USE MODI_WRITE_SERIES_n -USE MODI_WRITE_SURF_ATM_N -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -! -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop index of model KMODEL -TYPE(TFILEDATA), POINTER, INTENT(OUT) :: TPBAKFILE ! Pointer for backup file -TYPE(DATE_TIME), INTENT(OUT) :: TPDTMODELN ! Time of current model computation -LOGICAL, INTENT(INOUT) :: OEXIT ! Switch for the end of the temporal loop -! -!* 0.2 declarations of local variables -! -INTEGER :: ILUOUT ! Logical unit number for the output listing -INTEGER :: IIU,IJU,IKU ! array size in first, second and third dimensions -INTEGER :: IIB,IIE,IJB,IJE ! index values for the physical subdomain -INTEGER :: JSV,JRR ! Loop index for scalar and moist variables -INTEGER :: INBVAR ! number of HALO2_lls to allocate -INTEGER :: IINFO_ll ! return code of parallel routine -INTEGER :: IVERB ! LFI verbosity level -LOGICAL :: GSTEADY_DMASS ! conditional call to mass computation -! - ! for computing time analysis -REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME, ZTIME1, ZTIME2, ZEND, ZTOT, ZALL, ZTOT_PT, ZBLAZETOT -REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME_STEP,ZTIME_STEP_PTS -CHARACTER :: YMI -INTEGER :: IPOINTS -CHARACTER(len=16) :: YTCOUNT,YPOINTS -CHARACTER(LEN=:), ALLOCATABLE :: YDADNAME -! -INTEGER :: ISYNCHRO ! model synchronic index relative to its father - ! = 1 for the first time step in phase with DAD - ! = 0 for the last time step (out of phase) -INTEGER :: IMI ! Current model index -REAL, DIMENSION(:,:),ALLOCATABLE :: ZSEA -REAL, DIMENSION(:,:),ALLOCATABLE :: ZTOWN -! Dummy pointers needed to correct an ifort Bug -REAL, DIMENSION(:), POINTER :: DPTR_XZHAT -REAL, DIMENSION(:), POINTER :: DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4 -REAL, DIMENSION(:), POINTER :: DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4 -REAL, DIMENSION(:), POINTER :: DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4 -REAL, DIMENSION(:), POINTER :: DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4 -CHARACTER(LEN=4), DIMENSION(:), POINTER :: DPTR_CLBCX,DPTR_CLBCY -INTEGER, DIMENSION(:,:,:), POINTER :: DPTR_NKLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_NKLIN_LBXV,DPTR_NKLIN_LBYV -INTEGER, DIMENSION(:,:,:), POINTER :: DPTR_NKLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_NKLIN_LBXM,DPTR_NKLIN_LBYM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXU,DPTR_XCOEFLIN_LBYU -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXV,DPTR_XCOEFLIN_LBYV -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXW,DPTR_XCOEFLIN_LBYW -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXM,DPTR_XCOEFLIN_LBYM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXWM,DPTR_XLBYWM,DPTR_XLBXTHM,DPTR_XLBYTHM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXTKEM,DPTR_XLBYTKEM -REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXSVM,DPTR_XLBYSVM -REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXRM,DPTR_XLBYRM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XZZ -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS -REAL, DIMENSION(:,:), POINTER :: DPTR_XLSZWSM,DPTR_XLSZWSS -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXUS,DPTR_XLBYUS,DPTR_XLBXVS,DPTR_XLBYVS -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXWS,DPTR_XLBYWS,DPTR_XLBXTHS,DPTR_XLBYTHS -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXTKES,DPTR_XLBYTKES -REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXRS,DPTR_XLBYRS,DPTR_XLBXSVS,DPTR_XLBYSVS -! -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XRHODJ,DPTR_XUM,DPTR_XVM,DPTR_XWM,DPTR_XTHM -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XTKEM,DPTR_XRUS,DPTR_XRVS,DPTR_XRWS,DPTR_XRTHS -REAL, DIMENSION(:,:,:), POINTER :: DPTR_XRTKES,DPTR_XDIRFLASWD,DPTR_XSCAFLASWD,DPTR_XDIRSRFSWD -REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XRM,DPTR_XSVM,DPTR_XRRS,DPTR_XRSVS -REAL, DIMENSION(:,:), POINTER :: DPTR_XINPRC,DPTR_XINPRR,DPTR_XINPRS,DPTR_XINPRG -REAL, DIMENSION(:,:), POINTER :: DPTR_XINPRH,DPTR_XPRCONV,DPTR_XPRSCONV -LOGICAL, DIMENSION(:,:),POINTER :: DPTR_GMASKkids -! -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZSPEEDC -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZSPEEDR -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZSPEEDS -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZSPEEDG -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZSPEEDH -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZINPRC3D -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZINPRS3D -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZINPRG3D -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZINPRH3D -! -LOGICAL :: KWARM -LOGICAL :: KRAIN -LOGICAL :: KSEDC -LOGICAL :: KACTIT -LOGICAL :: KSEDI -LOGICAL :: KHHONI -! -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZRUS,ZRVS,ZRWS -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZPABST !To give pressure at t - ! (and not t+1) to resolved_cloud -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZJ -! -TYPE(LIST_ll), POINTER :: TZFIELDC_ll ! list of fields to exchange -TYPE(HALO2LIST_ll), POINTER :: TZHALO2C_ll ! list of fields to exchange -LOGICAL :: GCLD ! conditionnal call for dust wet deposition -LOGICAL :: GCLOUD_ONLY ! conditionnal radiation computations for - ! the only cloudy columns -REAL, DIMENSION(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), NSV_AER) :: ZWETDEPAER -! -TYPE(TFILEDATA),POINTER :: TZOUTFILE -! TYPE(TFILEDATA),SAVE :: TZDIACFILE -TYPE(DIMPHYEX_t) :: YLDIMPHYEX -!------------------------------------------------------------------------------- -! -TPBAKFILE=> NULL() -TZOUTFILE=> NULL() -! -TPDTMODELN = TDTCUR -! -!* 0. MICROPHYSICAL SCHEME -! ------------------- -SELECT CASE(CCLOUD) -CASE('C2R2','KHKO','C3R5') - KWARM = .TRUE. - KRAIN = NRAIN - KSEDC = NSEDC - KACTIT = NACTIT -! - KSEDI = NSEDI - KHHONI = NHHONI -CASE('LIMA') - KRAIN = NMOM_R.GE.1 - KWARM = NMOM_C.GE.1 - KSEDC = MSEDC - KACTIT = MACTIT -! - KSEDI = MSEDI - KHHONI = MHHONI -CASE('ICE3','ICE4') !default values - KWARM = LWARM - KRAIN = .TRUE. - KSEDC = .TRUE. - KACTIT = .FALSE. -! - KSEDI = .TRUE. - KHHONI = .FALSE. -END SELECT -! -! -!* 1 PRELIMINARY -! ------------ -IMI = GET_CURRENT_MODEL_INDEX() -! -!* 1.0 update NSV_* variables for current model -! ---------------------------------------- -! -CALL UPDATE_NSV(IMI) -! -!* 1.1 RECOVER THE LOGICAL UNIT NUMBER FOR THE OUTPUT PRINTS -! -ILUOUT = TLUOUT%NLU -! -!* 1.2 SET ARRAY SIZE -! -CALL GET_DIM_EXT_ll('B',IIU,IJU) -IKU=NKMAX+2*JPVEXT -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -IF (IMI==1) THEN - GSTEADY_DMASS=LSTEADYLS -ELSE - GSTEADY_DMASS=.FALSE. -END IF -! -!* 1.3 OPEN THE DIACHRONIC FILE -! -IF (KTCOUNT == 1) THEN -! - NULLIFY(TFIELDS_ll,TLSFIELD_ll,TFIELDT_ll) - NULLIFY(TLSFIELD2D_ll) - NULLIFY(THALO2T_ll) - NULLIFY(TLSHALO2_ll) - NULLIFY(TFIELDSC_ll) -! - ALLOCATE(XWT_ACT_NUC(SIZE(XWT,1),SIZE(XWT,2),SIZE(XWT,3))) - ALLOCATE(GMASKkids(SIZE(XWT,1),SIZE(XWT,2))) -! - IF ( .NOT. LIO_NO_WRITE ) THEN - CALL IO_File_open(TDIAFILE) -! - CALL IO_Header_write(TDIAFILE) - CALL WRITE_DESFM_n(IMI,TDIAFILE) - CALL WRITE_LFIFMN_FORDIACHRO_n(TDIAFILE) - END IF -! -!* 1.4 Initialization of the list of fields for the halo updates -! -! a) Sources terms -! - CALL ADD3DFIELD_ll( TFIELDS_ll, XRUS, 'MODEL_n::XRUS' ) - CALL ADD3DFIELD_ll( TFIELDS_ll, XRVS, 'MODEL_n::XRVS' ) - CALL ADD3DFIELD_ll( TFIELDS_ll, XRWS, 'MODEL_n::XRWS' ) - CALL ADD3DFIELD_ll( TFIELDS_ll, XRTHS, 'MODEL_n::XRTHS' ) - CALL ADD3DFIELD_ll( TFIELDS_ll, XRUS_PRES, 'MODEL_n::XRUS_PRES' ) - CALL ADD3DFIELD_ll( TFIELDS_ll, XRVS_PRES, 'MODEL_n::XRVS_PRES' ) - CALL ADD3DFIELD_ll( TFIELDS_ll, XRWS_PRES, 'MODEL_n::XRWS_PRES' ) - CALL ADD3DFIELD_ll( TFIELDS_ll, XRTHS_CLD, 'MODEL_n::XRTHS_CLD' ) - IF (SIZE(XRTKES,1) /= 0) CALL ADD3DFIELD_ll( TFIELDS_ll, XRTKES, 'MODEL_n::XRTKES' ) - CALL ADD4DFIELD_ll( TFIELDS_ll, XRRS (:,:,:,1:NRR), 'MODEL_n::XRRS' ) - CALL ADD4DFIELD_ll( TFIELDS_ll, XRRS_CLD (:,:,:,1:NRR), 'MODEL_n::XRRS_CLD' ) - CALL ADD4DFIELD_ll( TFIELDS_ll, XRSVS (:,:,:,1:NSV), 'MODEL_n::XRSVS') - CALL ADD4DFIELD_ll( TFIELDS_ll, XRSVS_CLD(:,:,:,1:NSV), 'MODEL_n::XRSVS_CLD') - IF (SIZE(XSRCT,1) /= 0) CALL ADD3DFIELD_ll( TFIELDS_ll, XSRCT, 'MODEL_n::XSRCT' ) - ! Fire model parallel setup - IF (LBLAZE) THEN - CALL ADD3DFIELD_ll( TFIELDS_ll, XLSPHI, 'MODEL_n::XLSPHI') - CALL ADD3DFIELD_ll( TFIELDS_ll, XBMAP, 'MODEL_n::XBMAP') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMRFA, 'MODEL_n::XFMRFA') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWF0, 'MODEL_n::XFMWF0') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMR0, 'MODEL_n::XFMR0') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMR00, 'MODEL_n::XFMR00') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMIGNITION, 'MODEL_n::XFMIGNITION') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMFUELTYPE, 'MODEL_n::XFMFUELTYPE') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFIRETAU, 'MODEL_n::XFIRETAU') - CALL ADD4DFIELD_ll( TFIELDS_ll, XFLUXPARAMH(:,:,:,1:SIZE(XFLUXPARAMH,4)), 'MODEL_n::XFLUXPARAMH') - CALL ADD4DFIELD_ll( TFIELDS_ll, XFLUXPARAMW(:,:,:,1:SIZE(XFLUXPARAMW,4)), 'MODEL_n::XFLUXPARAMW') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFIRERW, 'MODEL_n::XFIRERW') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMASE, 'MODEL_n::XFMASE') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMAWC, 'MODEL_n::XFMAWC') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWALKIG, 'MODEL_n::XFMWALKIG') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMFLUXHDH, 'MODEL_n::XFMFLUXHDH') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMFLUXHDW, 'MODEL_n::XFMFLUXHDW') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMHWS, 'MODEL_n::XFMHWS') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWINDU, 'MODEL_n::XFMWINDU') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWINDV, 'MODEL_n::XFMWINDV') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWINDW, 'MODEL_n::XFMWINDW') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMGRADOROX, 'MODEL_n::XFMGRADOROX') - CALL ADD3DFIELD_ll( TFIELDS_ll, XFMGRADOROY, 'MODEL_n::XFMGRADOROY') - END IF - ! - IF ((LNUMDIFU .OR. LNUMDIFTH .OR. LNUMDIFSV) ) THEN - ! - ! b) LS fields - ! - CALL ADD3DFIELD_ll( TLSFIELD_ll, XLSUM, 'MODEL_n::XLSUM' ) - CALL ADD3DFIELD_ll( TLSFIELD_ll, XLSVM, 'MODEL_n::XLSVM' ) - CALL ADD3DFIELD_ll( TLSFIELD_ll, XLSWM, 'MODEL_n::XLSWM' ) - CALL ADD3DFIELD_ll( TLSFIELD_ll, XLSTHM, 'MODEL_n::XLSTHM' ) - CALL ADD2DFIELD_ll( TLSFIELD2D_ll, XLSZWSM, 'MODEL_n::XLSZWSM' ) - IF (NRR >= 1) THEN - CALL ADD3DFIELD_ll( TLSFIELD_ll, XLSRVM, 'MODEL_n::XLSRVM' ) - ENDIF - ! - ! c) Fields at t - ! - CALL ADD3DFIELD_ll( TFIELDT_ll, XUT, 'MODEL_n::XUT' ) - CALL ADD3DFIELD_ll( TFIELDT_ll, XVT, 'MODEL_n::XVT' ) - CALL ADD3DFIELD_ll( TFIELDT_ll, XWT, 'MODEL_n::XWT' ) - CALL ADD3DFIELD_ll( TFIELDT_ll, XTHT, 'MODEL_n::XTHT' ) - IF (SIZE(XRTKES,1) /= 0) CALL ADD3DFIELD_ll( TFIELDT_ll, XTKET, 'MODEL_n::XTKET' ) - CALL ADD4DFIELD_ll(TFIELDT_ll, XRT (:,:,:,1:NRR), 'MODEL_n::XSV' ) - CALL ADD4DFIELD_ll(TFIELDT_ll, XSVT(:,:,:,1:NSV), 'MODEL_n::XSVT' ) - ! - !* 1.5 Initialize the list of fields for the halo updates (2nd layer) - ! - INBVAR = 4+NRR+NSV - IF (SIZE(XRTKES,1) /= 0) INBVAR=INBVAR+1 - CALL INIT_HALO2_ll(THALO2T_ll,INBVAR,IIU,IJU,IKU) - CALL INIT_HALO2_ll(TLSHALO2_ll,4+MIN(1,NRR),IIU,IJU,IKU) - ! - !* 1.6 Initialise the 2nd layer of the halo of the LS fields - ! - IF ( LSTEADYLS ) THEN - CALL UPDATE_HALO_ll(TLSFIELD_ll, IINFO_ll) - CALL UPDATE_HALO_ll(TLSFIELD2D_ll,IINFO_ll) - CALL UPDATE_HALO2_ll(TLSFIELD_ll, TLSHALO2_ll, IINFO_ll) - END IF - END IF - ! -! - ! - XT_START = 0.0_MNHTIME - ! - XT_STORE = 0.0_MNHTIME - XT_BOUND = 0.0_MNHTIME - XT_GUESS = 0.0_MNHTIME - XT_FORCING = 0.0_MNHTIME - XT_NUDGING = 0.0_MNHTIME - XT_ADV = 0.0_MNHTIME - XT_ADVUVW = 0.0_MNHTIME - XT_GRAV = 0.0_MNHTIME - XT_SOURCES = 0.0_MNHTIME - ! - XT_DIFF = 0.0_MNHTIME - XT_RELAX = 0.0_MNHTIME - XT_PARAM = 0.0_MNHTIME - XT_SPECTRA = 0.0_MNHTIME - XT_HALO = 0.0_MNHTIME - XT_VISC = 0.0_MNHTIME - XT_RAD_BOUND = 0.0_MNHTIME - XT_PRESS = 0.0_MNHTIME - ! - XT_CLOUD = 0.0_MNHTIME - XT_STEP_SWA = 0.0_MNHTIME - XT_STEP_MISC = 0.0_MNHTIME - XT_COUPL = 0.0_MNHTIME - XT_1WAY = 0.0_MNHTIME - XT_STEP_BUD = 0.0_MNHTIME - ! - XT_RAD = 0.0_MNHTIME - XT_DCONV = 0.0_MNHTIME - XT_GROUND = 0.0_MNHTIME - XT_TURB = 0.0_MNHTIME - XT_MAFL = 0.0_MNHTIME - XT_DRAG = 0.0_MNHTIME - XT_EOL = 0.0_MNHTIME - XT_TRACER = 0.0_MNHTIME - XT_SHADOWS = 0.0_MNHTIME - XT_ELEC = 0.0_MNHTIME - XT_CHEM = 0.0_MNHTIME - XT_2WAY = 0.0_MNHTIME - ! - XT_IBM_FORC = 0.0_MNHTIME - ! Blaze fire model - XFIREPERF = 0.0_MNHTIME - ! -END IF -! -!* 1.7 Allocation of arrays for observation diagnostics -! -CALL INI_DIAG_IN_RUN(IIU,IJU,IKU,LFLYER,LSTATION,LPROFILER) -! -! -CALL SECOND_MNH2(ZEND) -! -!------------------------------------------------------------------------------- -! -!* 2. ONE-WAY NESTING AND LARGE SCALE FIELD REFRESH -! --------------------------------------------- -! -! -CALL SECOND_MNH2(ZTIME1) -! -ISYNCHRO = MODULO (KTCOUNT, NDTRATIO(IMI) ) ! test of synchronisation -! -! -IF (LCOUPLES.AND.LOCEAN) THEN - CALL NHOA_COUPL_n(NDAD(IMI),XTSTEP,IMI,KTCOUNT,IKU) -END IF -! No Gridnest in coupled OA LES for now -IF (.NOT. LCOUPLES .AND. IMI/=1 .AND. NDAD(IMI)/=IMI .AND. (ISYNCHRO==1 .OR. NDTRATIO(IMI) == 1) ) THEN -! -! Use dummy pointers to correct an ifort BUG - DPTR_XBMX1=>XBMX1 - DPTR_XBMX2=>XBMX2 - DPTR_XBMX3=>XBMX3 - DPTR_XBMX4=>XBMX4 - DPTR_XBMY1=>XBMY1 - DPTR_XBMY2=>XBMY2 - DPTR_XBMY3=>XBMY3 - DPTR_XBMY4=>XBMY4 - DPTR_XBFX1=>XBFX1 - DPTR_XBFX2=>XBFX2 - DPTR_XBFX3=>XBFX3 - DPTR_XBFX4=>XBFX4 - DPTR_XBFY1=>XBFY1 - DPTR_XBFY2=>XBFY2 - DPTR_XBFY3=>XBFY3 - DPTR_XBFY4=>XBFY4 - DPTR_CLBCX=>CLBCX - DPTR_CLBCY=>CLBCY - ! - DPTR_XZZ=>XZZ - DPTR_XZHAT=>XZHAT - DPTR_XCOEFLIN_LBXM=>XCOEFLIN_LBXM - DPTR_XLSTHM=>XLSTHM - DPTR_XLSRVM=>XLSRVM - DPTR_XLSUM=>XLSUM - DPTR_XLSVM=>XLSVM - DPTR_XLSWM=>XLSWM - DPTR_XLSZWSM=>XLSZWSM - DPTR_XLSTHS=>XLSTHS - DPTR_XLSRVS=>XLSRVS - DPTR_XLSUS=>XLSUS - DPTR_XLSVS=>XLSVS - DPTR_XLSWS=>XLSWS - DPTR_XLSZWSS=>XLSZWSS - ! - IF ( LSTEADYLS ) THEN - NCPL_CUR=0 - ELSE - IF (NCPL_CUR/=1) THEN - IF ( KTCOUNT+1 == NCPL_TIMES(NCPL_CUR-1,IMI) ) THEN - ! - ! LS sources are interpolated from the LS field - ! values of model DAD(IMI) - CALL SPAWN_LS_n(NDAD(IMI),XTSTEP,IMI, & - DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4, & - DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4, & - NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI), & - DPTR_CLBCX,DPTR_CLBCY,DPTR_XZZ,DPTR_XZHAT,LSLEVE,XLEN1,XLEN2,DPTR_XCOEFLIN_LBXM, & - DPTR_XLSTHM,DPTR_XLSRVM,DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSZWSM, & - DPTR_XLSTHS,DPTR_XLSRVS,DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS, DPTR_XLSZWSS ) - END IF - END IF - ! - END IF - ! - DPTR_NKLIN_LBXU=>NKLIN_LBXU - DPTR_XCOEFLIN_LBXU=>XCOEFLIN_LBXU - DPTR_NKLIN_LBYU=>NKLIN_LBYU - DPTR_XCOEFLIN_LBYU=>XCOEFLIN_LBYU - DPTR_NKLIN_LBXV=>NKLIN_LBXV - DPTR_XCOEFLIN_LBXV=>XCOEFLIN_LBXV - DPTR_NKLIN_LBYV=>NKLIN_LBYV - DPTR_XCOEFLIN_LBYV=>XCOEFLIN_LBYV - DPTR_NKLIN_LBXW=>NKLIN_LBXW - DPTR_XCOEFLIN_LBXW=>XCOEFLIN_LBXW - DPTR_NKLIN_LBYW=>NKLIN_LBYW - DPTR_XCOEFLIN_LBYW=>XCOEFLIN_LBYW - ! - DPTR_NKLIN_LBXM=>NKLIN_LBXM - DPTR_XCOEFLIN_LBXM=>XCOEFLIN_LBXM - DPTR_NKLIN_LBYM=>NKLIN_LBYM - DPTR_XCOEFLIN_LBYM=>XCOEFLIN_LBYM - ! - DPTR_XLBXUM=>XLBXUM - DPTR_XLBYUM=>XLBYUM - DPTR_XLBXVM=>XLBXVM - DPTR_XLBYVM=>XLBYVM - DPTR_XLBXWM=>XLBXWM - DPTR_XLBYWM=>XLBYWM - DPTR_XLBXTHM=>XLBXTHM - DPTR_XLBYTHM=>XLBYTHM - DPTR_XLBXTKEM=>XLBXTKEM - DPTR_XLBYTKEM=>XLBYTKEM - DPTR_XLBXRM=>XLBXRM - DPTR_XLBYRM=>XLBYRM - DPTR_XLBXSVM=>XLBXSVM - DPTR_XLBYSVM=>XLBYSVM - ! - DPTR_XLBXUS=>XLBXUS - DPTR_XLBYUS=>XLBYUS - DPTR_XLBXVS=>XLBXVS - DPTR_XLBYVS=>XLBYVS - DPTR_XLBXWS=>XLBXWS - DPTR_XLBYWS=>XLBYWS - DPTR_XLBXTHS=>XLBXTHS - DPTR_XLBYTHS=>XLBYTHS - DPTR_XLBXTKES=>XLBXTKES - DPTR_XLBYTKES=>XLBYTKES - DPTR_XLBXRS=>XLBXRS - DPTR_XLBYRS=>XLBYRS - DPTR_XLBXSVS=>XLBXSVS - DPTR_XLBYSVS=>XLBYSVS - ! - CALL ONE_WAY_n(NDAD(IMI),XTSTEP,IMI,KTCOUNT, & - DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4, & - DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4, & - NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI),NDTRATIO(IMI), & - DPTR_CLBCX,DPTR_CLBCY,NRIMX,NRIMY, & - DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU, & - DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV, & - DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW, & - DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM, & - GSTEADY_DMASS,CCLOUD,LUSECHAQ,LUSECHIC, & - DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM,DPTR_XLBXWM,DPTR_XLBYWM, & - DPTR_XLBXTHM,DPTR_XLBYTHM, & - DPTR_XLBXTKEM,DPTR_XLBYTKEM, & - DPTR_XLBXRM,DPTR_XLBYRM,DPTR_XLBXSVM,DPTR_XLBYSVM, & - XDRYMASST,XDRYMASSS, & - DPTR_XLBXUS,DPTR_XLBYUS,DPTR_XLBXVS,DPTR_XLBYVS,DPTR_XLBXWS,DPTR_XLBYWS, & - DPTR_XLBXTHS,DPTR_XLBYTHS, & - DPTR_XLBXTKES,DPTR_XLBYTKES, & - DPTR_XLBXRS,DPTR_XLBYRS,DPTR_XLBXSVS,DPTR_XLBYSVS ) - ! -END IF -! -CALL SECOND_MNH2(ZTIME2) -XT_1WAY = XT_1WAY + ZTIME2 - ZTIME1 -! -!* 2.1 RECYCLING TURBULENCE -! ---- -IF (CTURB /= 'NONE' .AND. LRECYCL) THEN - CALL RECYCLING(XFLUCTUNW,XFLUCTVNN,XFLUCTUTN,XFLUCTVTW,XFLUCTWTW,XFLUCTWTN, & - XFLUCTUNE,XFLUCTVNS,XFLUCTUTS,XFLUCTVTE,XFLUCTWTE,XFLUCTWTS, & - KTCOUNT) -ENDIF -! -!* 2.2 IBM -! ---- -! -IF (LIBM .AND. KTCOUNT==1) THEN - ! - IF (.NOT.LCARTESIAN) THEN - CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'MODELN', 'IBM can only be used in combination with cartesian coordinates') - ENDIF - ! - CALL IBM_INIT(XIBM_LS) - ! -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 3. LATERAL BOUNDARY CONDITIONS EXCEPT FOR NORMAL VELOCITY -! ------------------------------------------------------ -! -ZTIME1=ZTIME2 -! -!* 3.1 Set the lagragian variables values at the LB -! -IF( LLG .AND. IMI==1 ) CALL SETLB_LG -! -IF (CCONF == "START" .OR. (CCONF == "RESTA" .AND. KTCOUNT /= 1 )) THEN -CALL MPPDB_CHECK3DM("before BOUNDARIES:XUT, XVT, XWT, XTHT, XTKET",PRECISION,& - & XUT, XVT, XWT, XTHT, XTKET) -CALL BOUNDARIES ( & - XTSTEP,CLBCX,CLBCY,NRR,NSV,KTCOUNT, & - XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & - XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS, & - XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS, & - XRHODJ,XRHODREF, & - XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT ) -CALL MPPDB_CHECK3DM("after BOUNDARIES:XUT, XVT, XWT, XTHT, XTKET",PRECISION,& - & XUT, XVT, XWT, XTHT, XTKET) -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_BOUND = XT_BOUND + ZTIME2 - ZTIME1 -! -! -! For START/RESTART MPPDB_CHECK use -!IF ( (IMI==1) .AND. (CCONF == "START") .AND. (KTCOUNT == 2) ) THEN -! CALL MPPDB_START_DEBUG() -!ENDIF -!IF ( (IMI==1) .AND. (CCONF == "RESTA") .AND. (KTCOUNT == 1) ) THEN -! CALL MPPDB_START_DEBUG() -!ENDIF -!------------------------------------------------------------------------------- -!* initializes surface number -IF (CSURF=='EXTE') CALL GOTO_SURFEX(IMI) -!------------------------------------------------------------------------------- -! -!* 4. STORAGE IN A SYNCHRONOUS FILE -! ----------------------------- -! -ZTIME1 = ZTIME2 -! -IF ( nfile_backup_current < NBAK_NUMB ) THEN - IF ( KTCOUNT == TBACKUPN(nfile_backup_current + 1)%NSTEP ) THEN - nfile_backup_current = nfile_backup_current + 1 - ! - TPBAKFILE => TBACKUPN(nfile_backup_current)%TFILE - IVERB = TPBAKFILE%NLFIVERB - ! - CALL IO_File_open(TPBAKFILE) - ! - CALL WRITE_DESFM_n(IMI,TPBAKFILE) - CALL IO_Header_write( TBACKUPN(nfile_backup_current)%TFILE ) - IF ( ASSOCIATED( TBACKUPN(nfile_backup_current)%TFILE%TDADFILE ) ) THEN - YDADNAME = TBACKUPN(nfile_backup_current)%TFILE%TDADFILE%CNAME - ELSE - ! Set a dummy name for the dad file. Its non-zero size will allow the writing of some data in the backup file - YDADNAME = 'DUMMY' - END IF - CALL WRITE_LFIFM_n( TBACKUPN(nfile_backup_current)%TFILE, TRIM( YDADNAME ) ) - TOUTDATAFILE => TPBAKFILE - CALL MNHWRITE_ZS_DUMMY_n(TPBAKFILE) - IF (CSURF=='EXTE') THEN - TFILE_SURFEX => TPBAKFILE - CALL GOTO_SURFEX(IMI) - CALL WRITE_SURF_ATM_n(YSURF_CUR,'MESONH','ALL') - IF ( KTCOUNT > 1) THEN - CALL DIAG_SURF_ATM_n(YSURF_CUR,'MESONH') - CALL WRITE_DIAG_SURF_ATM_n(YSURF_CUR,'MESONH','ALL', KTCOUNT/nfile_backup_current) - END IF - NULLIFY(TFILE_SURFEX) - END IF - ! - ! Reinitialize Lagragian variables at every model backup - IF (LLG .AND. LINIT_LG .AND. CINIT_LG=='FMOUT') THEN - CALL INI_LG( XXHATM, XYHATM, XZZ, XSVT, XLBXSVM, XLBYSVM ) - IF (IVERB>=5) THEN - WRITE(UNIT=ILUOUT,FMT=*) '************************************' - WRITE(UNIT=ILUOUT,FMT=*) '*** Lagrangian variables refreshed after ',TRIM(TPBAKFILE%CNAME),' backup' - WRITE(UNIT=ILUOUT,FMT=*) '************************************' - END IF - END IF - ! Reinitialise mean variables - IF (LMEAN_FIELD) THEN - CALL INI_MEAN_FIELD - END IF -! - ELSE - !Necessary to have a 'valid' CNAME when calling some subroutines - TPBAKFILE => TFILE_DUMMY - END IF -ELSE - !Necessary to have a 'valid' CNAME when calling some subroutines - TPBAKFILE => TFILE_DUMMY -END IF -! -IF ( nfile_output_current < NOUT_NUMB ) THEN - IF ( KTCOUNT == TOUTPUTN(nfile_output_current + 1)%NSTEP ) THEN - nfile_output_current = nfile_output_current + 1 - ! - TZOUTFILE => TOUTPUTN(nfile_output_current)%TFILE - ! - CALL IO_File_open(TZOUTFILE) - ! - CALL IO_Header_write(TZOUTFILE) - CALL IO_Fieldlist_write( TOUTPUTN(nfile_output_current) ) - CALL IO_Field_user_write( TOUTPUTN(nfile_output_current) ) - ! - CALL IO_File_close(TZOUTFILE) - ! - END IF -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_STORE = XT_STORE + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 4.BIS IBM and Fluctuations application -! ----------------------------- -! -!* 4.B1 Add fluctuations at the domain boundaries -! -IF (LRECYCL) THEN - CALL ADDFLUCTUATIONS ( & - CLBCX,CLBCY, & - XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT, & - XFLUCTUTN,XFLUCTVTW,XFLUCTUTS,XFLUCTVTE, & - XFLUCTWTW,XFLUCTWTN,XFLUCTWTS,XFLUCTWTE ) -ENDIF -! -!* 4.B2 Immersed boundaries -! -IF (LIBM) THEN - ! - ZTIME1=ZTIME2 - ! - IF (.NOT.LCARTESIAN) THEN - CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'MODELN', 'IBM can only be used in combination with cartesian coordinates') - ENDIF - ! - CALL IBM_FORCING(XUT,XVT,XWT,XTHT,XRT,XSVT,XTKET) - ! - IF (LIBM_TROUBLE) THEN - CALL IBM_FORCING_TR(XUT,XVT,XWT,XTHT,XRT,XSVT,XTKET) - ENDIF - ! - CALL SECOND_MNH2(ZTIME2) - ! - XT_IBM_FORC = XT_IBM_FORC + ZTIME2 - ZTIME1 - ! -ENDIF -!------------------------------------------------------------------------------- -! -!* 5. INITIALIZATION OF THE BUDGET VARIABLES -! -------------------------------------- -! -IF (NBUMOD==IMI) THEN - LBU_ENABLE = CBUTYPE /='NONE'.AND. CBUTYPE /='SKIP' -ELSE - LBU_ENABLE = .FALSE. -END IF -! -IF (NBUMOD==IMI .AND. CBUTYPE=='MASK' ) THEN - CALL SET_MASK() - if ( lbu_ru ) then - tbudgets(NBUDGET_U)%trhodj%xdata(:, nbutime, :) = tbudgets(NBUDGET_U)%trhodj%xdata(:, nbutime, :) & - + Mask_compress( Mxm( xrhodj(:, :, :) ) ) - end if - if ( lbu_rv ) then - tbudgets(NBUDGET_V)%trhodj%xdata(:, nbutime, :) = tbudgets(NBUDGET_V)%trhodj%xdata(:, nbutime, :) & - + Mask_compress( Mym( xrhodj(:, :, :) ) ) - end if - if ( lbu_rw ) then - tbudgets(NBUDGET_W)%trhodj%xdata(:, nbutime, :) = tbudgets(NBUDGET_W)%trhodj%xdata(:, nbutime, :) & - + Mask_compress( Mzm( xrhodj(:, :, :) ) ) - end if - if ( associated( tburhodj ) ) tburhodj%xdata(:, nbutime, :) = tburhodj%xdata(:, nbutime, :) + Mask_compress( xrhodj(:, :, :) ) -END IF -! -IF (NBUMOD==IMI .AND. CBUTYPE=='CART' ) THEN - if ( lbu_ru ) then - tbudgets(NBUDGET_U)%trhodj%xdata(:, :, :) = tbudgets(NBUDGET_U)%trhodj%xdata(:, :, :) + Cart_compress( Mxm( xrhodj(:, :, :) ) ) - end if - if ( lbu_rv ) then - tbudgets(NBUDGET_V)%trhodj%xdata(:, :, :) = tbudgets(NBUDGET_V)%trhodj%xdata(:, :, :) + Cart_compress( Mym( xrhodj(:, :, :) ) ) - end if - if ( lbu_rw ) then - tbudgets(NBUDGET_W)%trhodj%xdata(:, :, :) = tbudgets(NBUDGET_W)%trhodj%xdata(:, :, :) & - + Cart_compress( Mzm( xrhodj(:, :, :) ) ) - end if - if ( associated( tburhodj ) ) tburhodj%xdata(:, :, :) = tburhodj%xdata(:, :, :) + Cart_compress( xrhodj(:, :, :) ) -END IF -! -CALL BUDGET_FLAGS(LUSERV, LUSERC, LUSERR, & - LUSERI, LUSERS, LUSERG, LUSERH ) -! -XTIME_BU = 0.0 -! -!------------------------------------------------------------------------------- -! -!* 6. INITIALIZATION OF THE FIELD TENDENCIES -! -------------------------------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -! -CALL INITIAL_GUESS ( NRR, NSV, KTCOUNT, XRHODJ,IMI, XTSTEP, & - XRUS, XRVS, XRWS, XRTHS, XRRS, XRTKES, XRSVS, & - XUT, XVT, XWT, XTHT, XRT, XTKET, XSVT ) -! -CALL SECOND_MNH2(ZTIME2) -! -XT_GUESS = XT_GUESS + ZTIME2 - ZTIME1 - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 7. INITIALIZATION OF THE LES FOR CURRENT TIME-STEP -! ----------------------------------------------- -! -XTIME_LES_BU = 0.0 -XTIME_LES = 0.0 -IF (LLES) CALL LES_INI_TIMESTEP_n(KTCOUNT) -! -!------------------------------------------------------------------------------- -! -!* 8. TWO-WAY INTERACTIVE GRID-NESTING -! -------------------------------- -! -! -CALL SECOND_MNH2(ZTIME1) -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -GMASKkids(:,:)=.FALSE. -! -IF (NMODEL>1) THEN - ! correct an ifort bug - DPTR_XRHODJ=>XRHODJ - DPTR_XUM=>XUT - DPTR_XVM=>XVT - DPTR_XWM=>XWT - DPTR_XTHM=>XTHT - DPTR_XRM=>XRT - DPTR_XTKEM=>XTKET - DPTR_XSVM=>XSVT - DPTR_XRUS=>XRUS - DPTR_XRVS=>XRVS - DPTR_XRWS=>XRWS - DPTR_XRTHS=>XRTHS - DPTR_XRRS=>XRRS - DPTR_XRTKES=>XRTKES - DPTR_XRSVS=>XRSVS - DPTR_XINPRC=>XINPRC - DPTR_XINPRR=>XINPRR - DPTR_XINPRS=>XINPRS - DPTR_XINPRG=>XINPRG - DPTR_XINPRH=>XINPRH - DPTR_XPRCONV=>XPRCONV - DPTR_XPRSCONV=>XPRSCONV - DPTR_XDIRFLASWD=>XDIRFLASWD - DPTR_XSCAFLASWD=>XSCAFLASWD - DPTR_XDIRSRFSWD=>XDIRSRFSWD - DPTR_GMASKkids=>GMASKkids - ! - CALL TWO_WAY( NRR,NSV,KTCOUNT,DPTR_XRHODJ,IMI,XTSTEP, & - DPTR_XUM ,DPTR_XVM ,DPTR_XWM , DPTR_XTHM, DPTR_XRM,DPTR_XSVM, & - DPTR_XRUS,DPTR_XRVS,DPTR_XRWS,DPTR_XRTHS,DPTR_XRRS,DPTR_XRSVS, & - DPTR_XINPRC,DPTR_XINPRR,DPTR_XINPRS,DPTR_XINPRG,DPTR_XINPRH,DPTR_XPRCONV,DPTR_XPRSCONV, & - DPTR_XDIRFLASWD,DPTR_XSCAFLASWD,DPTR_XDIRSRFSWD,DPTR_GMASKkids ) -END IF -! -CALL SECOND_MNH2(ZTIME2) -XT_2WAY = XT_2WAY + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -!------------------------------------------------------------------------------- -! -!* 10. FORCING -! ------- -! -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -IF (LCARTESIAN) THEN - CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,ZJ) - XMAP=1. -ELSE - CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS, & - LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, & - XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, ZJ ) -END IF -! -IF ( LFORCING ) THEN - CALL FORCING(XTSTEP,LUSERV,XRHODJ,XCORIOZ,XZHAT,XZZ,TDTCUR,& - XUFRC_PAST, XVFRC_PAST,XWTFRC, & - XUT,XVT,XWT,XTHT,XTKET,XRT,XSVT, & - XRUS,XRVS,XRWS,XRTHS,XRTKES,XRRS,XRSVS,IMI,ZJ) -END IF -! -IF ( L2D_ADV_FRC ) THEN - CALL ADV_FORCING_n(XRHODJ,TDTCUR,XTHT,XRT,XZZ,XRTHS,XRRS) -END IF -IF ( L2D_REL_FRC ) THEN - CALL REL_FORCING_n(XRHODJ,TDTCUR,XTHT,XRT,XZZ,XRTHS,XRRS) -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_FORCING = XT_FORCING + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 11. NUDGING -! ------- -! -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF ( LNUDGING ) THEN - CALL NUDGING(LUSERV,XRHODJ,XTNUDGING, & - XUT,XVT,XWT,XTHT,XRT, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM, & - XRUS,XRVS,XRWS,XRTHS,XRRS) - -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_NUDGING = XT_NUDGING + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 12. DYNAMICAL SOURCES -! ----------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF( LTRANS ) THEN - XUT(:,:,:) = XUT(:,:,:) + XUTRANS - XVT(:,:,:) = XVT(:,:,:) + XVTRANS -END IF -! -CALL DYN_SOURCES( NRR,NRRL, NRRI, & - XUT, XVT, XWT, XTHT, XRT, & - XCORIOX, XCORIOY, XCORIOZ, XCURVX, XCURVY, & - XRHODJ, XZZ, XTHVREF, XEXNREF, & - XRUS, XRVS, XRWS, XRTHS ) -! -IF( LTRANS ) THEN - XUT(:,:,:) = XUT(:,:,:) - XUTRANS - XVT(:,:,:) = XVT(:,:,:) - XVTRANS -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_SOURCES = XT_SOURCES + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 13. NUMERICAL DIFFUSION -! ------------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF ( LNUMDIFU .OR. LNUMDIFTH .OR. LNUMDIFSV ) THEN -! - CALL UPDATE_HALO_ll(TFIELDT_ll, IINFO_ll) - CALL UPDATE_HALO2_ll(TFIELDT_ll, THALO2T_ll, IINFO_ll) - IF ( .NOT. LSTEADYLS ) THEN - CALL UPDATE_HALO_ll(TLSFIELD_ll, IINFO_ll) - CALL UPDATE_HALO_ll(TLSFIELD2D_ll,IINFO_ll) - CALL UPDATE_HALO2_ll(TLSFIELD_ll, TLSHALO2_ll, IINFO_ll) - END IF - CALL NUM_DIFF ( CLBCX, CLBCY, NRR, NSV, & - XDK2U, XDK4U, XDK2TH, XDK4TH, XDK2SV, XDK4SV, IMI, & - XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XRHODJ, & - XRUS, XRVS, XRWS, XRTHS, XRTKES, XRRS, XRSVS, & - LZDIFFU,LNUMDIFU, LNUMDIFTH, LNUMDIFSV, & - THALO2T_ll, TLSHALO2_ll,XZDIFFU_HALO2 ) -END IF - -if ( lbudget_sv ) then - do jsv = 1, nsv - call Budget_store_init( tbudgets(jsv + NBUDGET_SV1 - 1), 'NEGA2', xrsvs(:, :, :, jsv) ) - end do -end if - -DO JSV = NSV_CHEMBEG,NSV_CHEMEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_CHICBEG,NSV_CHICEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_AERBEG,NSV_AEREND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_LNOXBEG,NSV_LNOXEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_DSTBEG,NSV_DSTEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_SLTBEG,NSV_SLTEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_PPBEG,NSV_PPEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -#ifdef MNH_FOREFIRE -DO JSV = NSV_FFBEG,NSV_FFEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -#endif -! Blaze smoke -DO JSV = NSV_FIREBEG,NSV_FIREEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_CSBEG,NSV_CSEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -DO JSV = NSV_SNWBEG,NSV_SNWEND - XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.) -END DO -IF (CELEC .NE. 'NONE') THEN - XRSVS(:,:,:,NSV_ELECBEG) = MAX(XRSVS(:,:,:,NSV_ELECBEG),0.) - XRSVS(:,:,:,NSV_ELECEND) = MAX(XRSVS(:,:,:,NSV_ELECEND),0.) -END IF - -if ( lbudget_sv ) then - do jsv = 1, nsv - call Budget_store_end( tbudgets(jsv + NBUDGET_SV1 - 1), 'NEGA2', xrsvs(:, :, :, jsv) ) - end do -end if -! -CALL SECOND_MNH2(ZTIME2) -! -XT_DIFF = XT_DIFF + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 14. UPPER AND LATERAL RELAXATION -! ---------------------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF(LVE_RELAX .OR. LVE_RELAX_GRD .OR. LHORELAX_UVWTH .OR. LHORELAX_RV .OR.& - LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI .OR. LHORELAX_RS .OR. & - LHORELAX_RG .OR. LHORELAX_RH .OR. LHORELAX_TKE .OR. & - ANY(LHORELAX_SV)) THEN - CALL RELAXATION (LVE_RELAX,LVE_RELAX_GRD,LHORELAX_UVWTH,LHORELAX_RV,LHORELAX_RC, & - LHORELAX_RR,LHORELAX_RI,LHORELAX_RS,LHORELAX_RG, & - LHORELAX_RH,LHORELAX_TKE,LHORELAX_SV, & - LHORELAX_SVC2R2,LHORELAX_SVC1R3, & - LHORELAX_SVELEC,LHORELAX_SVLG, & - LHORELAX_SVCHEM,LHORELAX_SVCHIC,LHORELAX_SVAER, & - LHORELAX_SVDST,LHORELAX_SVSLT,LHORELAX_SVPP, & - LHORELAX_SVCS,LHORELAX_SVSNW,LHORELAX_SVFIRE, & -#ifdef MNH_FOREFIRE - LHORELAX_SVFF, & -#endif - KTCOUNT,NRR,NSV,XTSTEP,XRHODJ, & - XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, & - XLSUM, XLSVM, XLSWM, XLSTHM, & - XLBXUM, XLBXVM, XLBXWM, XLBXTHM, & - XLBXRM, XLBXSVM, XLBXTKEM, & - XLBYUM, XLBYVM, XLBYWM, XLBYTHM, & - XLBYRM, XLBYSVM, XLBYTKEM, & - NALBOT, XALK, XALKW, & - NALBAS, XALKBAS, XALKWBAS, & - LMASK_RELAX,XKURELAX, XKVRELAX, XKWRELAX, & - NRIMX,NRIMY, & - XRUS, XRVS, XRWS, XRTHS, XRRS, XRSVS, XRTKES ) -END IF - -IF (CELEC.NE.'NONE' .AND. LRELAX2FW_ION) THEN - CALL RELAX2FW_ION (KTCOUNT, IMI, XTSTEP, XRHODJ, XSVT, NALBOT, & - XALK, LMASK_RELAX, XKWRELAX, XRSVS ) -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_RELAX = XT_RELAX + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 15. PARAMETRIZATIONS' MONITOR -! ------------------------- -! -ZTIME1 = ZTIME2 -! -CALL PHYS_PARAM_n( KTCOUNT, TPBAKFILE, & - XT_RAD, XT_SHADOWS, XT_DCONV, XT_GROUND, & - XT_MAFL, XT_DRAG, XT_EOL, XT_TURB, XT_TRACER, & - ZTIME, ZWETDEPAER, GMASKkids, GCLOUD_ONLY ) -! -IF (CDCONV/='NONE') THEN - XPACCONV = XPACCONV + XPRCONV * XTSTEP - IF (LCH_CONV_LINOX) THEN - XIC_TOTAL_NUMBER = XIC_TOTAL_NUMBER + XIC_RATE * XTSTEP - XCG_TOTAL_NUMBER = XCG_TOTAL_NUMBER + XCG_RATE * XTSTEP - END IF -END IF -! -! -CALL SECOND_MNH2(ZTIME2) -! -XT_PARAM = XT_PARAM + ZTIME2 - ZTIME1 - XTIME_LES - ZTIME -! -!------------------------------------------------------------------------------- -! -!* 16. TEMPORAL SERIES -! --------------- -! -ZTIME1 = ZTIME2 -! -IF (LSERIES) THEN - IF ( MOD (KTCOUNT-1,NFREQSERIES) == 0 ) CALL SERIES_n -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_STEP_MISC = XT_STEP_MISC + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 17. LARGE SCALE FIELD REFRESH -! ------------------------- -! -ZTIME1 = ZTIME2 -! -IF (.NOT. LSTEADYLS) THEN - IF ( IMI==1 .AND. & - NCPL_CUR < NCPL_NBR ) THEN - IF (KTCOUNT+1 == NCPL_TIMES(NCPL_CUR,1) ) THEN - ! The next current time reachs a - NCPL_CUR=NCPL_CUR+1 ! coupling one, LS sources are refreshed - ! - CALL LS_COUPLING(XTSTEP,GSTEADY_DMASS,CCONF, & - CGETTKET, & - CGETRVT,CGETRCT,CGETRRT,CGETRIT, & - CGETRST,CGETRGT,CGETRHT,CGETSVT,LCH_INIT_FIELD, NSV, & - NIMAX_ll,NJMAX_ll, & - NSIZELBX_ll,NSIZELBXU_ll,NSIZELBY_ll,NSIZELBYV_ll, & - NSIZELBXTKE_ll,NSIZELBYTKE_ll, & - NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,XDRYMASST, & - XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & - XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,XLSZWSS,XDRYMASSS, & - XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS, & - XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS ) - ! - DO JSV=NSV_CHEMBEG,NSV_CHEMEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_LNOXBEG,NSV_LNOXEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_AERBEG,NSV_AEREND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_DSTBEG,NSV_DSTEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_DSTDEPBEG,NSV_DSTDEPEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_SLTBEG,NSV_SLTEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_SLTDEPBEG,NSV_SLTDEPEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_PPBEG,NSV_PPEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! -#ifdef MNH_FOREFIRE - DO JSV=NSV_FFBEG,NSV_FFEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! -#endif - DO JSV=NSV_FIREBEG,NSV_FIREEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_CSBEG,NSV_CSEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - DO JSV=NSV_SNWBEG,NSV_SNWEND - XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.) - XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.) - ENDDO - ! - END IF - END IF -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_COUPL = XT_COUPL + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -! -! -!* 8 Bis . Blowing snow scheme -! --------- -! -IF ( LBLOWSNOW ) THEN - CALL BLOWSNOW( XTSTEP, NRR, XPABST, XTHT, XRT, XZZ, XRHODREF, & - XRHODJ, XEXNREF, XRRS, XRTHS, XSVT, XRSVS, XSNWSUBL3D ) -ENDIF -! -!----------------------------------------------------------------------- -! -!* 8 Ter VISCOSITY (no-slip condition inside) -! --------- -! -! -IF ( LVISC ) THEN -! -ZTIME1 = ZTIME2 -! - CALL VISCOSITY(CLBCX, CLBCY, NRR, NSV, XMU_V,XPRANDTL, & - LVISC_UVW,LVISC_TH,LVISC_SV,LVISC_R, & - LDRAG, & - XUT, XVT, XWT, XTHT, XRT, XSVT, & - XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, & - XRUS, XRVS, XRWS, XRTHS, XRRS, XRSVS,XDRAG ) -! -ENDIF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_VISC = XT_VISC + ZTIME2 - ZTIME1 -!! -!------------------------------------------------------------------------------- -! -!* 9. ADVECTION -! --------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -! -! -CALL MPPDB_CHECK3DM("before ADVEC_METSV:XU/V/W/TH/TKE/T,XRHODJ",PRECISION,& - & XUT, XVT, XWT, XTHT, XTKET,XRHODJ) - CALL ADVECTION_METSV ( TPBAKFILE, CUVW_ADV_SCHEME, & - CMET_ADV_SCHEME, CSV_ADV_SCHEME, CCLOUD, NSPLIT, & - LSPLIT_CFL, XSPLIT_CFL, LCFL_WRIT, & - CLBCX, CLBCY, NRR, NSV, TDTCUR, XTSTEP, & - XUT, XVT, XWT, XTHT, XRT, XTKET, XSVT, XPABST, & - XTHVREF, XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, & - XRTHS, XRRS, XRTKES, XRSVS, & - XRTHS_CLD, XRRS_CLD, XRSVS_CLD, XRTKEMS ) -CALL MPPDB_CHECK3DM("after ADVEC_METSV:XU/V/W/TH/TKE/T,XRHODJ ",PRECISION,& - & XUT, XVT, XWT, XTHT, XTKET,XRHODJ) -! -CALL SECOND_MNH2(ZTIME2) -! -XT_ADV = XT_ADV + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -ZRWS = XRWS -! -CALL GRAVITY_IMPL ( CLBCX, CLBCY, NRR, NRRL, NRRI,XTSTEP, & - XTHT, XRT, XTHVREF, XRHODJ, XRWS, XRTHS, XRRS, & - XRTHS_CLD, XRRS_CLD ) -! -! At the initial instant the difference with the ref state creates a -! vertical velocity production that must not be advected as it is -! compensated by the pressure gradient -! -IF (KTCOUNT == 1 .AND. CCONF=='START') XRWS_PRES = - (XRWS - ZRWS) -! -CALL SECOND_MNH2(ZTIME2) -! -XT_GRAV = XT_GRAV + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -IF ( LIBM .AND. CIBM_ADV=='FORCIN' ) THEN - ! - ZTIME1=ZTIME2 - ! - CALL IBM_FORCING_ADV (XRUS,XRVS,XRWS) - ! - CALL SECOND_MNH2(ZTIME2) - ! - XT_IBM_FORC = XT_IBM_FORC + ZTIME2 - ZTIME1 - ! -ENDIF -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -!MPPDB_CHECK_LB=.TRUE. -CALL MPPDB_CHECK3DM("before ADVEC_UVW:XU/V/W/TH/TKE/T,XRHODJ,XRU/V/Ws",PRECISION,& - & XUT, XVT, XWT, XTHT, XTKET,XRHODJ,XRUS,XRVS,XRWS) -IF ((CUVW_ADV_SCHEME(1:3)=='CEN') .AND. (CTEMP_SCHEME == 'LEFR')) THEN - IF (CUVW_ADV_SCHEME=='CEN4TH') THEN - NULLIFY(TZFIELDC_ll) - NULLIFY(TZHALO2C_ll) - CALL ADD3DFIELD_ll( TZFIELDC_ll, XUT, 'MODEL_n::XUT' ) - CALL ADD3DFIELD_ll( TZFIELDC_ll, XVT, 'MODEL_n::XVT' ) - CALL ADD3DFIELD_ll( TZFIELDC_ll, XWT, 'MODEL_n::XWT' ) - CALL INIT_HALO2_ll(TZHALO2C_ll,3,IIU,IJU,IKU) - CALL UPDATE_HALO_ll(TZFIELDC_ll,IINFO_ll) - CALL UPDATE_HALO2_ll(TZFIELDC_ll, TZHALO2C_ll, IINFO_ll) - END IF - CALL ADVECTION_UVW_CEN(CUVW_ADV_SCHEME, & - CLBCX, CLBCY, & - XTSTEP, KTCOUNT, & - XUM, XVM, XWM, XDUM, XDVM, XDWM, & - XUT, XVT, XWT, & - XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, & - XRUS,XRVS, XRWS, & - TZHALO2C_ll ) - IF (CUVW_ADV_SCHEME=='CEN4TH') THEN - CALL CLEANLIST_ll(TZFIELDC_ll) - NULLIFY(TZFIELDC_ll) - CALL DEL_HALO2_ll(TZHALO2C_ll) - NULLIFY(TZHALO2C_ll) - END IF -ELSE - - CALL ADVECTION_UVW(CUVW_ADV_SCHEME, CTEMP_SCHEME, & - NWENO_ORDER, LSPLIT_WENO, & - CLBCX, CLBCY, XTSTEP, & - XUT, XVT, XWT, & - XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, & - XRUS, XRVS, XRWS, & - XRUS_PRES, XRVS_PRES, XRWS_PRES ) -END IF -! -CALL MPPDB_CHECK3DM("after ADVEC_UVW:XU/V/W/TH/TKE/T,XRHODJ,XRU/V/Ws",PRECISION,& - & XUT, XVT, XWT, XTHT, XTKET,XRHODJ,XRUS,XRVS,XRWS) -!MPPDB_CHECK_LB=.FALSE. -! -CALL SECOND_MNH2(ZTIME2) -! -XT_ADVUVW = XT_ADVUVW + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -IF (LCLOUDMODIFLM) THEN - CALL TURB_CLOUD_INDEX( XTSTEP, TPBAKFILE, & - LTURB_DIAG, NRRI, & - XRRS, XRT, XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, & - XCEI ) -END IF -! -!------------------------------------------------------------------------------- -! -!* 18. LATERAL BOUNDARY CONDITION FOR THE NORMAL VELOCITY -! -------------------------------------------------- -! -ZTIME1 = ZTIME2 -! -CALL MPPDB_CHECK3DM("before RAD_BOUND :XRU/V/WS",PRECISION,XRUS,XRVS,XRWS) -ZRUS=XRUS -ZRVS=XRVS -ZRWS=XRWS -! -if ( .not. l1d ) then - if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U), 'PRES', xrus(:, :, :) ) - if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V), 'PRES', xrvs(:, :, :) ) - if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W), 'PRES', xrws(:, :, :) ) -end if -! -CALL MPPDB_CHECK3DM("before RAD_BOUND : other var",PRECISION,XUT,XVT,XRHODJ,XTKET) -CALL MPPDB_CHECKLB(XLBXUM,"modeln XLBXUM",PRECISION,'LBXU',NRIMX) -CALL MPPDB_CHECKLB(XLBYVM,"modeln XLBYVM",PRECISION,'LBYV',NRIMY) -CALL MPPDB_CHECKLB(XLBXUS,"modeln XLBXUS",PRECISION,'LBXU',NRIMX) -CALL MPPDB_CHECKLB(XLBYVS,"modeln XLBYVS",PRECISION,'LBYV',NRIMY) -! - CALL RAD_BOUND (CLBCX,CLBCY,CTURB,XCARPKMAX, & - XTSTEP, & - XDXHAT, XDYHAT, XZHAT, & - XUT, XVT, & - XLBXUM, XLBYVM, XLBXUS, XLBYVS, & - XFLUCTUNW,XFLUCTVNN,XFLUCTUNE,XFLUCTVNS, & - XCPHASE, XCPHASE_PBL, XRHODJ, & - XTKET,XRUS, XRVS, XRWS ) -ZRUS=XRUS-ZRUS -ZRVS=XRVS-ZRVS -ZRWS=XRWS-ZRWS -! -CALL SECOND_MNH2(ZTIME2) -! -XT_RAD_BOUND = XT_RAD_BOUND + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 19. PRESSURE COMPUTATION -! -------------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -ZPABST = XPABST -! -IF(.NOT. L1D) THEN -! -CALL MPPDB_CHECK3DM("before pressurez:XRU/V/WS",PRECISION,XRUS,XRVS,XRWS) - XRUS_PRES = XRUS - XRVS_PRES = XRVS - XRWS_PRES = XRWS -! - CALL PRESSUREZ( CLBCX,CLBCY,CPRESOPT,NITR,LITRADJ,KTCOUNT, XRELAX,IMI, & - XRHODJ,XDXX,XDYY,XDZZ,XDZX,XDZY,XDXHATM,XDYHATM,XRHOM, & - XAF,XBFY,XCF,XTRIGSX,XTRIGSY,NIFAXX,NIFAXY, & - NRR,NRRL,NRRI,XDRYMASST,XREFMASS,XMASS_O_PHI0, & - XTHT,XRT,XRHODREF,XTHVREF,XRVREF,XEXNREF, XLINMASS, & - XRUS, XRVS, XRWS, XPABST, & - XBFB,& - XBF_SXP2_YP1_Z) !JUAN Z_SPLITING -! - XRUS_PRES = XRUS - XRUS_PRES + ZRUS - XRVS_PRES = XRVS - XRVS_PRES + ZRVS - XRWS_PRES = XRWS - XRWS_PRES + ZRWS - CALL MPPDB_CHECK3DM("after pressurez:XRU/V/WS",PRECISION,XRUS,XRVS,XRWS) -! -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_PRESS = XT_PRESS + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 20. CHEMISTRY/AEROSOLS -! ------------------ -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF (LUSECHEM) THEN - CALL CH_MONITOR_n(ZWETDEPAER,KTCOUNT,XTSTEP, ILUOUT, NVERB) -END IF -! -! For inert aerosol (dust and sea salt) => aer_monitor_n -IF ((LDUST).OR.(LSALT)) THEN -! -! tests to see if any cloud exists -! - GCLD=.TRUE. - IF (GCLD .AND. NRR.LE.3 ) THEN - IF( MAX(MAXVAL(XCLDFR(:,:,:)),MAXVAL(XICEFR(:,:,:))).LE. 1.E-10 .AND. GCLOUD_ONLY ) THEN - GCLD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no clouds - END IF - END IF -! - IF (GCLD .AND. NRR.GE.4 ) THEN - IF( CCLOUD(1:3)=='ICE' )THEN - IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN(2) .AND. & - MAXVAL(XRT(:,:,:,4)).LE.XRTMIN(4) .AND. GCLOUD_ONLY ) THEN - GCLD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no cloudwater and ice - END IF - END IF - IF( CCLOUD=='C3R5' )THEN - IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_C1R3(2) .AND. & - MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_C1R3(4) .AND. GCLOUD_ONLY ) THEN - GCLD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no cloudwater and ice - END IF - END IF - IF( CCLOUD=='LIMA' )THEN - IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_LIMA(2) .AND. & - MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_LIMA(4) .AND. GCLOUD_ONLY ) THEN - GCLD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no cloudwater and ice - END IF - END IF - END IF - -! - CALL AER_MONITOR_n(KTCOUNT,XTSTEP, ILUOUT, NVERB, GCLD) -END IF -! -! -CALL SECOND_MNH2(ZTIME2) -! -XT_CHEM = XT_CHEM + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -ZTIME = ZTIME + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS - -!------------------------------------------------------------------------------- -! -!* 20. WATER MICROPHYSICS -! ------------------ -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN -! - IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' .OR. CCLOUD == 'C3R5' & - .OR. CCLOUD == "LIMA" ) THEN - IF ( LFORCING ) THEN - XWT_ACT_NUC(:,:,:) = XWT(:,:,:) + XWTFRC(:,:,:) - ELSE - XWT_ACT_NUC(:,:,:) = XWT(:,:,:) - END IF - IF (CTURB /= 'NONE' ) THEN - IF ( ((CCLOUD=='C2R2'.OR.CCLOUD=='KHKO').AND.LACTTKE) .OR. (CCLOUD=='LIMA'.AND.MACTTKE) ) THEN - XWT_ACT_NUC(:,:,:) = XWT_ACT_NUC(:,:,:) + (2./3. * XTKET(:,:,:))**0.5 - ELSE - XWT_ACT_NUC(:,:,:) = XWT_ACT_NUC(:,:,:) - ENDIF - ENDIF - ELSE - XWT_ACT_NUC(:,:,:) = 0. - END IF -! - XRTHS_CLD = XRTHS - XRRS_CLD = XRRS - XRSVS_CLD = XRSVS - IF (CSURF=='EXTE') THEN - ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2))) - ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2))) - ZSEA(:,:) = 0. - ZTOWN(:,:)= 0. - CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:)) - CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR, & - NSPLITG, IMI, KTCOUNT, & - CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM, & - LSUBG_COND,LSIGMAS,CSUBG_AUCV_RC,XTSTEP, & - XZZ, XRHODJ, XRHODREF, XEXNREF, & - ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & - XPABST, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & - XSVT, XRSVS, & - XSRCT, XCLDFR,XICEFR, XCIT, & - LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI, & - LCONVHG, XCF_MF,XRC_MF, XRI_MF, & - XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D, & - XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D, & - XSOLORG, XMI,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH, & - XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR, & - XHLC_HRC, XHLC_HCF, XHLI_HRI, XHLI_HCF, & - ZSEA, ZTOWN ) - DEALLOCATE(ZTOWN) - DEALLOCATE(ZSEA) - ELSE - CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR, & - NSPLITG, IMI, KTCOUNT, & - CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM, & - LSUBG_COND,LSIGMAS,CSUBG_AUCV_RC, & - XTSTEP,XZZ, XRHODJ, XRHODREF, XEXNREF, & - ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & - XPABST, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & - XSVT, XRSVS, & - XSRCT, XCLDFR, XICEFR, XCIT, & - LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI, & - LCONVHG, XCF_MF,XRC_MF, XRI_MF, & - XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D, & - XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D, & - XSOLORG, XMI,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH, & - XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR, & - XHLC_HRC, XHLC_HCF, XHLI_HRI, XHLI_HCF ) - END IF - XRTHS_CLD = XRTHS - XRTHS_CLD - XRRS_CLD = XRRS - XRRS_CLD - XRSVS_CLD = XRSVS - XRSVS_CLD -! - IF (CCLOUD /= 'REVE' ) THEN - XACPRR = XACPRR + XINPRR * XTSTEP - IF ( (CCLOUD(1:3) == 'ICE' .AND. LSEDIC ) .OR. & - ((CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' & - .OR. CCLOUD == 'LIMA' ) .AND. KSEDC ) ) THEN - XACPRC = XACPRC + XINPRC * XTSTEP - IF (LDEPOSC .OR. LDEPOC) XACDEP = XACDEP + XINDEP * XTSTEP - END IF - IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. & - (CCLOUD == 'LIMA' .AND. NMOM_I.GE.1 ) ) THEN - XACPRS = XACPRS + XINPRS * XTSTEP - XACPRG = XACPRG + XINPRG * XTSTEP - IF (CCLOUD == 'ICE4' .OR. (CCLOUD == 'LIMA' .AND. NMOM_H.GE.1)) XACPRH = XACPRH + XINPRH * XTSTEP - END IF -! -! Lessivage des CCN et IFN nucléables par Slinn -! - IF (LSCAV .AND. (CCLOUD == 'LIMA')) THEN - CALL LIMA_PRECIP_SCAVENGING( YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS), & - CCLOUD, CCONF, ILUOUT, KTCOUNT,XTSTEP,XRT(:,:,:,3), & - XRHODREF, XRHODJ, XZZ, XPABST, XTHT, & - XSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - XRSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), XINPAP ) -! - XACPAP(:,:) = XACPAP(:,:) + XINPAP(:,:) * XTSTEP - END IF - END IF -! -! It is necessary that SV_C2R2 and SV_C1R3 are contiguous in the preceeding CALL -! -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_CLOUD = XT_CLOUD + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 21. CLOUD ELECTRIFICATION AND LIGHTNING FLASHES -! ------------------------------------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF (CELEC /= 'NONE' .AND. (CCLOUD(1:3) == 'ICE')) THEN - XWT_ACT_NUC(:,:,:) = 0. -! - XRTHS_CLD = XRTHS - XRRS_CLD = XRRS - XRSVS_CLD = XRSVS - IF (CSURF=='EXTE') THEN - ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2))) - ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2))) - ZSEA(:,:) = 0. - ZTOWN(:,:)= 0. - CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:)) - CALL RESOLVED_ELEC_n (CCLOUD, CSCONV, CMF_CLOUD, & - NRR, NSPLITR, IMI, KTCOUNT, OEXIT, & - CLBCX, CLBCY, CRAD, CTURBDIM, & - LSUBG_COND, LSIGMAS,VSIGQSAT,CSUBG_AUCV_RC, & - XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & - ZPABST, XTHT, XRTHS, XWT, XRT, XRRS, & - XSVT, XRSVS, XCIT, & - XSIGS, XSRCT, XCLDFR, XMFCONV, XCF_MF, XRC_MF, & - XRI_MF, LSEDIC, LWARM, & - XINPRC, XINPRR, XINPRR3D, XEVAP3D, & - XINPRS, XINPRG, XINPRH, & - ZSEA, ZTOWN ) - DEALLOCATE(ZTOWN) - DEALLOCATE(ZSEA) - ELSE - CALL RESOLVED_ELEC_n (CCLOUD, CSCONV, CMF_CLOUD, & - NRR, NSPLITR, IMI, KTCOUNT, OEXIT, & - CLBCX, CLBCY, CRAD, CTURBDIM, & - LSUBG_COND, LSIGMAS,VSIGQSAT, CSUBG_AUCV_RC, & - XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & - ZPABST, XTHT, XRTHS, XWT, & - XRT, XRRS, XSVT, XRSVS, XCIT, & - XSIGS, XSRCT, XCLDFR, XMFCONV, XCF_MF, XRC_MF, & - XRI_MF, LSEDIC, LWARM, & - XINPRC, XINPRR, XINPRR3D, XEVAP3D, & - XINPRS, XINPRG, XINPRH ) - END IF - XRTHS_CLD = XRTHS - XRTHS_CLD - XRRS_CLD = XRRS - XRRS_CLD - XRSVS_CLD = XRSVS - XRSVS_CLD -! - XACPRR = XACPRR + XINPRR * XTSTEP - IF ((CCLOUD(1:3) == 'ICE' .AND. LSEDIC)) & - XACPRC = XACPRC + XINPRC * XTSTEP - IF (CCLOUD(1:3) == 'ICE') THEN - XACPRS = XACPRS + XINPRS * XTSTEP - XACPRG = XACPRG + XINPRG * XTSTEP - IF (CCLOUD == 'ICE4') XACPRH = XACPRH + XINPRH * XTSTEP - END IF -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_ELEC = XT_ELEC + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 21. L.E.S. COMPUTATIONS -! ------------------- -! -ZTIME1 = ZTIME2 -! -CALL LES_n -! -CALL SECOND_MNH2(ZTIME2) -! -XT_SPECTRA = XT_SPECTRA + ZTIME2 - ZTIME1 + XTIME_LES_BU + XTIME_LES -! -!------------------------------------------------------------------------------- -! -!* 21. bis MEAN_UM -! -------------------- -! -IF (LMEAN_FIELD) THEN - CALL MEAN_FIELD(XUT, XVT, XWT, XTHT, XTKET, XPABST, XRT(:,:,:,1), XSVT(:,:,:,1)) -END IF -! -!------------------------------------------------------------------------------- -! -!* 22. UPDATE HALO OF EACH SUBDOMAINS FOR TIME T+DT -! -------------------------------------------- -! -ZTIME1 = ZTIME2 -! -CALL EXCHANGE (XTSTEP,NRR,NSV,XRHODJ,TFIELDS_ll, & - XRUS, XRVS,XRWS,XRTHS,XRRS,XRTKES,XRSVS) -! -CALL SECOND_MNH2(ZTIME2) -! -XT_HALO = XT_HALO + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 23. TEMPORAL SWAPPING -! ----------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -! -CALL ENDSTEP ( XTSTEP,NRR,NSV,KTCOUNT,IMI, & - CUVW_ADV_SCHEME,CTEMP_SCHEME,XRHODJ, & - XRUS,XRVS,XRWS,XDRYMASSS, & - XRTHS,XRRS,XRTKES,XRSVS, & - XLSUS,XLSVS,XLSWS, & - XLSTHS,XLSRVS,XLSZWSS, & - XLBXUS,XLBXVS,XLBXWS, & - XLBXTHS,XLBXRS,XLBXTKES,XLBXSVS, & - XLBYUS,XLBYVS,XLBYWS, & - XLBYTHS,XLBYRS,XLBYTKES,XLBYSVS, & - XUM,XVM,XWM,XZWS, & - XUT,XVT,XWT,XPABST,XDRYMASST, & - XTHT, XRT, XTHM, XRCM, XPABSM,XTKET, XSVT,& - XLSUM,XLSVM,XLSWM, & - XLSTHM,XLSRVM,XLSZWSM, & - XLBXUM,XLBXVM,XLBXWM, & - XLBXTHM,XLBXRM,XLBXTKEM,XLBXSVM, & - XLBYUM,XLBYVM,XLBYWM, & - XLBYTHM,XLBYRM,XLBYTKEM,XLBYSVM ) -! -CALL SECOND_MNH2(ZTIME2) -! -XT_STEP_SWA = XT_STEP_SWA + ZTIME2 - ZTIME1 - XTIME_BU_PROCESS -! -!------------------------------------------------------------------------------- -! -!* 24.1 BALLOON and AIRCRAFT -! -------------------- -! -ZTIME1 = ZTIME2 -! -IF (LFLYER) THEN - IF (CSURF=='EXTE') THEN - ALLOCATE(ZSEA(IIU,IJU)) - ZSEA(:,:) = 0. - CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:)) - CALL AIRCRAFT_BALLOON( XTSTEP, XZZ, XMAP, XLONORI, XLATORI, & - XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, & - XRHODREF, XCIT, PSEA = ZSEA(:,:) ) - DEALLOCATE(ZSEA) - ELSE - CALL AIRCRAFT_BALLOON( XTSTEP, XZZ, XMAP, XLONORI, XLATORI, & - XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, & - XRHODREF, XCIT ) - END IF -END IF - -!------------------------------------------------------------------------------- -! -!* 24.2 STATION (observation diagnostic) -! -------------------------------- -! -IF ( LSTATION ) & - CALL STATION_n( XZZ, XRHODREF, XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST ) -! -!--------------------------------------------------------- -! -!* 24.3 PROFILER (observation diagnostic) -! --------------------------------- -! -IF (LPROFILER) THEN - IF (CSURF=='EXTE') THEN - ALLOCATE(ZSEA(IIU,IJU)) - ZSEA(:,:) = 0. - CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:)) - CALL PROFILER_n( XZZ, XRHODREF, & - XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, & - XTSRAD, XPABST, XAER, XCIT, PSEA=ZSEA(:,:) ) - DEALLOCATE(ZSEA) - ELSE - CALL PROFILER_n( XZZ, XRHODREF, & - XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, & - XTSRAD, XPABST, XAER, XCIT ) - END IF -END IF -! -IF (ALLOCATED(ZSEA)) DEALLOCATE (ZSEA) -! -CALL SECOND_MNH2(ZTIME2) -! -XT_STEP_MISC = XT_STEP_MISC + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 24.4 deallocation of observation diagnostics -! --------------------------------------- -! -CALL END_DIAG_IN_RUN -! -!------------------------------------------------------------------------------- -! -! -!* 25. STORAGE OF BUDGET FIELDS -! ------------------------ -! -ZTIME1 = ZTIME2 -! -IF ( .NOT. LIO_NO_WRITE ) THEN - IF (NBUMOD==IMI .AND. CBUTYPE/='NONE') THEN - CALL ENDSTEP_BUDGET(TDIAFILE,KTCOUNT,TDTCUR,XTSTEP,NSV) - END IF -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -XT_STEP_BUD = XT_STEP_BUD + ZTIME2 - ZTIME1 + XTIME_BU -! -!------------------------------------------------------------------------------- -! -!* 27. CURRENT TIME REFRESH -! -------------------- -! -TDTCUR%xtime=TDTCUR%xtime + XTSTEP -CALL DATETIME_CORRECTDATE(TDTCUR) -! -!------------------------------------------------------------------------------- -! -!* 28. CPU ANALYSIS -! ------------ -! -CALL SECOND_MNH2(ZTIME2) -XT_START=XT_START+ZTIME2-ZEND -! -! -IF ( KTCOUNT == NSTOP .AND. IMI==1) THEN - OEXIT=.TRUE. -END IF -! -IF (OEXIT) THEN -! - IF ( .NOT. LIO_NO_WRITE ) THEN - IF (LSERIES) CALL WRITE_SERIES_n(TDIAFILE) - CALL WRITE_AIRCRAFT_BALLOON(TDIAFILE) - CALL WRITE_STATPROF_n( TDIAFILE, TSTATIONS ) - CALL WRITE_STATPROF_n( TDIAFILE, TPROFILERS ) - call Write_les_n( tdiafile ) -#ifdef MNH_IOLFI - CALL MENU_DIACHRO(TDIAFILE,'END') -#endif - CALL IO_File_close(TDIAFILE) - ! Free memory of flyer that is not present on the master process of the file (was allocated in WRITE_AIRCRAFT_BALLOON) - CALL AIRCRAFT_BALLOON_FREE_NONLOCAL( TDIAFILE ) - END IF - ! - CALL IO_File_close(TINIFILE) - IF (CSURF=="EXTE") CALL IO_File_close(TINIFILEPGD) -! -!* 28.1 print statistics! -! - ! Set File Timing OUTPUT - ! - CALL SET_ILUOUT_TIMING(TLUOUT) - ! - ! Compute global time - ! - CALL TIME_STAT_ll(XT_START,ZTOT) - ! - CALL TIME_HEADER_ll(IMI) - ! - CALL TIME_STAT_ll(XT_1WAY,ZTOT, ' ONE WAY','=') - CALL TIME_STAT_ll(XT_BOUND,ZTOT, ' BOUNDARIES','=') - CALL TIME_STAT_ll(XT_STORE,ZTOT, ' STORE-FIELDS','=') - CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_SEND,ZTOT, ' W3D_SEND ','-') - CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_RECV,ZTOT, ' W3D_RECV ','-') - CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_WRIT,ZTOT, ' W3D_WRIT ','-') - CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_WAIT,ZTOT, ' W3D_WAIT ','-') - CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_ALL ,ZTOT, ' W3D_ALL ','-') - CALL TIME_STAT_ll(TIMEZ%T_WRIT2D_GATH,ZTOT, ' W2D_GATH ','-') - CALL TIME_STAT_ll(TIMEZ%T_WRIT2D_WRIT,ZTOT, ' W2D_WRIT ','-') - CALL TIME_STAT_ll(TIMEZ%T_WRIT2D_ALL ,ZTOT, ' W2D_ALL ','-') - CALL TIME_STAT_ll(XT_GUESS,ZTOT, ' INITIAL_GUESS','=') - CALL TIME_STAT_ll(XT_2WAY,ZTOT, ' TWO WAY','=') - CALL TIME_STAT_ll(XT_ADV,ZTOT, ' ADVECTION MET','=') - CALL TIME_STAT_ll(XT_ADVUVW,ZTOT, ' ADVECTION UVW','=') - CALL TIME_STAT_ll(XT_GRAV,ZTOT, ' GRAVITY','=') - CALL TIME_STAT_ll(XT_FORCING,ZTOT, ' FORCING','=') - CALL TIME_STAT_ll(XT_IBM_FORC,ZTOT, ' IBM','=') - CALL TIME_STAT_ll(XT_NUDGING,ZTOT, ' NUDGING','=') - CALL TIME_STAT_ll(XT_SOURCES,ZTOT, ' DYN_SOURCES','=') - CALL TIME_STAT_ll(XT_DIFF,ZTOT, ' NUM_DIFF','=') - CALL TIME_STAT_ll(XT_RELAX,ZTOT, ' RELAXATION','=') - ! - CALL TIMING_LEGEND() - ! - CALL TIME_STAT_ll(XT_PARAM,ZTOT, ' PHYS_PARAM','=') - CALL TIME_STAT_ll(XT_RAD,ZTOT, ' RAD = '//CRAD ,'-') - CALL TIME_STAT_ll(XT_SHADOWS,ZTOT, ' SHADOWS' ,'-') - CALL TIME_STAT_ll(XT_DCONV,ZTOT, ' DEEP CONV = '//CDCONV,'-') - CALL TIME_STAT_ll(XT_GROUND,ZTOT, ' GROUND' ,'-') - ! Blaze perf - IF (LBLAZE) THEN - CALL TIME_STAT_ll(XFIREPERF,ZBLAZETOT) - CALL TIME_STAT_ll(XFIREPERF,ZTOT, ' BLAZE' ,'~') - CALL TIME_STAT_ll(XGRADPERF,ZBLAZETOT, ' GRAD(PHI)' ,' ') - CALL TIME_STAT_ll(XROSWINDPERF,ZBLAZETOT, ' ROS & WIND' ,' ') - CALL TIME_STAT_ll(XPROPAGPERF,ZBLAZETOT, ' PROPAGATION' ,' ') - CALL TIME_STAT_ll(XFLUXPERF,ZBLAZETOT, ' HEAT FLUXES' ,' ') - END IF - CALL TIME_STAT_ll(XT_TURB,ZTOT, ' TURB = '//CTURB ,'-') - CALL TIME_STAT_ll(XT_MAFL,ZTOT, ' MAFL = '//CSCONV,'-') - CALL TIME_STAT_ll(XT_CHEM,ZTOT, ' CHIMIE' ,'-') - CALL TIME_STAT_ll(XT_EOL,ZTOT, ' WIND TURBINE' ,'-') - CALL TIMING_LEGEND() - CALL TIME_STAT_ll(XT_COUPL,ZTOT, ' SET_COUPLING','=') - CALL TIME_STAT_ll(XT_RAD_BOUND,ZTOT, ' RAD_BOUND','=') - ! - CALL TIMING_LEGEND() - ! - CALL TIME_STAT_ll(XT_PRESS,ZTOT, ' PRESSURE ','=','F') - !JUAN Z_SPLITTING - CALL TIME_STAT_ll(TIMEZ%T_MAP_B_SX_YP2_ZP1,ZTOT, ' REMAP B=>FFTXZ' ,'-','F') - CALL TIME_STAT_ll(TIMEZ%T_MAP_SX_YP2_ZP1_SXP2_Y_ZP1,ZTOT, ' REMAP FFTXZ=>FFTYZ' ,'-','F') - CALL TIME_STAT_ll(TIMEZ%T_MAP_SXP2_Y_ZP1_B,ZTOT, ' REMAP FTTYZ=>B' ,'-','F') - CALL TIME_STAT_ll(TIMEZ%T_MAP_SXP2_Y_ZP1_SXP2_YP1_Z,ZTOT, ' REMAP FFTYZ=>SUBZ' ,'-','F') - CALL TIME_STAT_ll(TIMEZ%T_MAP_B_SXP2_Y_ZP1,ZTOT, ' REMAP B=>FFTYZ-1','-','F') - CALL TIME_STAT_ll(TIMEZ%T_MAP_SXP2_YP1_Z_SXP2_Y_ZP1,ZTOT, ' REMAP SUBZ=>FFTYZ-1','-','F') - CALL TIME_STAT_ll(TIMEZ%T_MAP_SXP2_Y_ZP1_SX_YP2_ZP1,ZTOT, ' REMAP FFTYZ-1=>FFTXZ-1','-','F') - CALL TIME_STAT_ll(TIMEZ%T_MAP_SX_YP2_ZP1_B,ZTOT, ' REMAP FFTXZ-1=>B ' ,'-','F') - ! JUAN P1/P2 - CALL TIME_STAT_ll(XT_CLOUD,ZTOT, ' RESOLVED_CLOUD','=') - CALL TIME_STAT_ll(XT_ELEC,ZTOT, ' RESOLVED_ELEC','=') - CALL TIME_STAT_ll(XT_HALO,ZTOT, ' EXCHANGE_HALO','=') - CALL TIME_STAT_ll(XT_STEP_SWA,ZTOT, ' ENDSTEP','=') - CALL TIME_STAT_ll(XT_STEP_BUD,ZTOT, ' BUDGETS','=') - CALL TIME_STAT_ll(XT_SPECTRA,ZTOT, ' LES','=') - CALL TIME_STAT_ll(XT_STEP_MISC,ZTOT, ' MISCELLANEOUS','=') - IF (LIBM) CALL TIME_STAT_ll(XT_IBM_FORC,ZTOT,' IBM FORCING','=') - ! - ! sum of call subroutine - ! - ZALL = XT_1WAY + XT_BOUND + XT_STORE + XT_GUESS + XT_2WAY + & - XT_ADV + XT_FORCING + XT_NUDGING + XT_SOURCES + XT_DIFF + & - XT_ADVUVW + XT_GRAV + XT_IBM_FORC + & - XT_RELAX+ XT_PARAM + XT_COUPL + XT_RAD_BOUND+XT_PRESS + & - XT_CLOUD+ XT_ELEC + XT_HALO + XT_SPECTRA + XT_STEP_SWA + & - XT_STEP_MISC+ XT_STEP_BUD - CALL TIME_STAT_ll(ZALL,ZTOT, ' SUM(CALL)','=') - CALL TIMING_SEPARATOR('=') - ! - ! Gobale Stat - ! - WRITE(ILUOUT,FMT=*) - WRITE(ILUOUT,FMT=*) - CALL TIMING_LEGEND() - ! - ! MODELN all included - ! - CALL TIMING_SEPARATOR('+') - CALL TIMING_SEPARATOR('+') - WRITE(YMI,FMT="(I0)") IMI - CALL TIME_STAT_ll(XT_START,ZTOT, ' MODEL'//YMI,'+') - CALL TIMING_SEPARATOR('+') - CALL TIMING_SEPARATOR('+') - CALL TIMING_SEPARATOR('+') - ! - ! Timing/ Steps - ! - ZTIME_STEP = XT_START / REAL(KTCOUNT) - WRITE(YTCOUNT,FMT="(I0)") KTCOUNT - CALL TIME_STAT_ll(ZTIME_STEP,ZTOT, ' SECOND/STEP='//YTCOUNT,'=') - ! - ! Timing/Step/Points - ! - IPOINTS = NIMAX_ll*NJMAX_ll*NKMAX - WRITE(YPOINTS,FMT="(I0)") IPOINTS - ZTIME_STEP_PTS = ZTIME_STEP / REAL(IPOINTS) * 1e6 - CALL TIME_STAT_ll(ZTIME_STEP_PTS,ZTOT_PT) - CALL TIME_STAT_ll(ZTIME_STEP_PTS,ZTOT_PT, ' MICROSEC/STP/PT='//YPOINTS,'-') - ! - CALL TIMING_SEPARATOR('=') - ! -END IF -! -END SUBROUTINE MODEL_n diff --git a/src/PHYEX/ext/phys_paramn.f90 b/src/PHYEX/ext/phys_paramn.f90 deleted file mode 100644 index ef93f2ccc..000000000 --- a/src/PHYEX/ext/phys_paramn.f90 +++ /dev/null @@ -1,1764 +0,0 @@ -!MNH_LIC Copyright 1995-2022 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ######################## - MODULE MODI_PHYS_PARAM_n -! ######################## -! -! -INTERFACE -! - SUBROUTINE PHYS_PARAM_n( KTCOUNT, TPFILE, & - PRAD, PSHADOWS, PKAFR, PGROUND, PMAFL, PDRAG,PEOL, PTURB, & - PTRACER, PTIME_BU, PWETDEPAER, OMASKkids, OCLOUD_ONLY ) -! -USE MODD_IO, ONLY: TFILEDATA -use modd_precision, only: MNHTIME -! -INTEGER, INTENT(IN) :: KTCOUNT ! temporal iteration count -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Synchronous output file -! advection schemes -REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PRAD,PSHADOWS,PKAFR,PGROUND,PTURB,PMAFL,PDRAG,PTRACER,PEOL ! to store CPU - ! time for computing time -REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PTIME_BU ! time used in budget&LES budgets statistics -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PWETDEPAER -LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASKkids ! kids domains mask -LOGICAL, INTENT(OUT) :: OCLOUD_ONLY ! conditionnal radiation computations for - ! the only cloudy columns - ! -END SUBROUTINE PHYS_PARAM_n -! -END INTERFACE -! -END MODULE MODI_PHYS_PARAM_n -! -! ######################################################################################## - SUBROUTINE PHYS_PARAM_n( KTCOUNT, TPFILE, & - PRAD, PSHADOWS, PKAFR, PGROUND, PMAFL, PEOL, PDRAG, PTURB, & - PTRACER, PTIME_BU, PWETDEPAER, OMASKkids, OCLOUD_ONLY ) -! ######################################################################################## -! -!!**** *PHYS_PARAM_n * -monitor of the parameterizations used by model _n -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to update the sources by adding the -! parameterized terms. This is realized by sequentially calling the -! specialized routines. -! -!!** METHOD -!! ------ -!! The first parametrization is the radiation scheme: -!! ---------------- -!! * CRAD = 'FIXE' -!! In this case, a temporal interpolation is performed for the downward -!! surface fluxes XFLALWD and XFLASWD. -!! * CRAD = 'ECMWF' -!! Several tests are performed before calling the radiation computations -!! interface with the ECMWF radiation scheme code. A control is made to -!! ensure that: -!! - the full radiation code is called at the first model timestep -!! - there is a priority for calling the full radiation instead of the -!! cloud-only approximation if both must be called at the current -!! timestep -!! - the cloud-only option (approximation) is coherent with the -!! occurence of one cloudy vertical column at least -!! If all the above conditions are fulfilled (GRAD is .TRUE.) then the -!! position of the sun is computed in routine SUNPOS_n and the interfacing -!! routine RADIATIONS is called to update the radiative tendency XDTHRAD -!! and the downward surface fluxes XFLALWD and XFLASWD. Finally, the -!! radiative tendency is integrated as a source term in the THETA prognostic -!! equation. -!! -!! The second parameterization is the soil scheme: -!! ----------- -!! -!! externalized surface -!! -!! The third parameterization is the turbulence scheme: -!! ----------------- -!! * CTURB='NONE' -!! no turbulent mixing is taken into account -!! * CTURB='TKEL' -!! The turbulent fluxes are computed according to a one and half order -!! closure of the hydrodynamical equations. This scheme is based on a -!! prognostic for the turbulent kinetic energy and a mixing length -!! computation ( the mesh size or a physically based length). Other -!! turbulent moments are diagnosed according to a stationarization of the -!! second order turbulent moments. This turbulent scheme forecasts -!! either a purely vertical turbulent mixing or 3-dimensional mixing -!! according to its internal degrees of freedom. -!! -!! -!! The LAST parameterization is the chemistry scheme: -!! ----------------- -!! The chemistry part of MesoNH has two namelists, NAM_SOLVER for the -!! parameters concerning the stiff solver, and NAM_MNHCn concerning the -!! configuration and options of the chemistry module itself. -!! The switch LUSECHEM in NAM_CONF acitvates or deactivates the chemistry. -!! The only variables of MesoNH that are modified by chemistry are the -!! scalar variables. If calculation of chemical surface fluxes is -!! requested, those fluxes are calculated before -!! entering the turbulence scheme, since those fluxes are taken into -!! account by TURB as surface boundary conditions. -!! CAUTION: chemistry has allways to be called AFTER ALL OTHER TERMS -!! that affect the scalar variables (dynamical terms, forcing, -!! parameterizations (like TURB, CONVECTION), since it uses the variables -!! XRSVS as input in case of the time-split option. -!! -!! EXTERNAL -!! -------- -!! Subroutine SUNPOS_n : computes the position of the sun -!! Subroutine RADIATIONS : computes the radiative tendency and fluxes -!! Subroutine TSZ0 : computes the surface from temporally -!! interpolated Ts and given z0 -!! Subroutine ISBA : computes the surface fluxes from a soil scheme -!! Subroutine TURB : computes the turbulence source terms -!! Subroutine CONVECTION : computes the convection source term -!! Subroutine CH_SURFACE_FLUX_n: computes the surface flux for chemical -!! species -!! Subroutine CH_MONITOR_n : computes the chemistry source terms -!! that are applied to the scalar variables -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! USE MODD_DYN -!! USE MODD_CONF -!! USE MODD_CONF_n -!! USE MODD_CURVCOR_n -!! USE MODD_DYN_n -!! USE MODD_FIELD_n -!! USE MODD_GR_FIELD_n -!! USE MODD_LSFIELD_n -!! USE MODD_GRID_n -!! USE MODD_LBC_n -!! USE MODD_PARAM_RAD_n -!! USE MODD_RADIATIONS_n -!! USE MODD_REF_n -!! USE MODD_LUNIT_n -!! USE MODD_TIME_n -!! USE MODD_CH_MNHC_n -!! -!! REFERENCE -!! --------- -!! None -!! -!! AUTHOR -!! ------ -!! J. Stein * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 05/01/95 -!! Modifications Feb 14, 1995 (J.Cuxart) add the I/O arguments, -!! the director cosinus and change the names of the surface fluxes -!! Modifications March 21, 1995 (J.M.Carriere) take into account liquid -!! water -!! June 30,1995 (J.Stein) initialize at 0 the surf. fluxes -!! Modifications Sept. 1, 1995 (S.Belair) ISBA scheme -!! Modifications Sept.25, 1995 (J.Stein) switch on the radiation scheme -!! Modifications Sept. 11, 1995 (J.-P. Pinty) radiation scheme -!! Nov. 15, 1995 (J.Stein) cleaning + change the temporal -!! algorithm for the soil scheme-turbulence -!! Jan. 23, 1996 (J.Stein) add a new option for the surface -!! fluxes where Ts and z0 are given -!! March 18, 1996 (J.Stein) add the cloud fraction -!! March 28, 1996 (J.Stein) the soil scheme gives energy -!! fluxes + cleaning -!! June 17, 1996 (Lafore) statistics of computing time -!! August 4, 1996 (K. Suhre) add chemistry -!! Oct. 12, 1996 (J.Stein) use XSRCM in the turbulence -!! scheme -!! Nov. 18, 1996 (J.-P. Pinty) add domain translation -!! change arg. in radiations -!! Fev. 4, 1997 (J.Viviand) change isba's calling for ice -!! Jun. 22, 1997 (J.Stein) change the equation system and use -!! the absolute pressure -!! Jul. 09, 1997 (V.Masson) add directional z0 -!! Jan. 24, 1998 (P.Bechtold) add convective transport for tracers -!! Jan. 24, 1998 (J.-P. Pinty) split SW and LW part for radiation -!! Mai. 10, 1999 (P.Bechtold) shallow convection -!! Oct. 20, 1999 (P.Jabouille) domain translation for turbulence -!! Jan. 04, 2000 (V.Masson) removes TSZ0 case -!! Jan. 04, 2000 (V.Masson) modifies albedo computation -! Jul 02, 2000 (F.Solmon/V.Masson) adaptation for patch approach -!! Nov. 15, 2000 (V.Masson) LES routines -!! Nov. 15, 2000 (V.Masson) effect of slopes on surface fluxes -!! Feb. 02, 2001 (P.Tulet) add friction velocities and aerodynamical -!! resistance (patch approach) -!! Jan. 04, 2000 (V.Masson) modify surf_rad_modif computation -!! Mar. 04, 2002 (F.Solmon) new interface for radiation call -!! Nov. 06, 2002 (V.Masson) LES budgets & budget time counters -!! Jan. 2004 (V.Masson) surface externalization -!! Jan. 13, 2004 (J.Escobar) bug correction : compute "GRAD" in parallel -!! Jan. 20, 2005 (P. Tulet) add dust sedimentation -!! Jan. 20, 2005 (P. Tulet) climatologic SSA -!! Jan. 20, 2005 (P. Tulet) add aerosol / dust scavenging -!! Jul. 2005 (N. Asencio) use the two-way result-fields -!! before ground_param call -!! May 2006 Remove EPS -!! Oct. 2007 (J.Pergaud) Add shallow_MF -!! Oct. 2009 (C.Lac) Introduction of different PTSTEP according to the -!! advection schemes -!! Oct. 2009 (V. MAsson) optimization of Pergaud et al massflux scheme -!! Aug. 2010 (V.Masson, C.Lac) Exchange of SBL_DEPTH for -!! reproducibility -!! Oct. 2010 (J.Escobar) init ZTIME_LES_MF ( pb detected with g95 ) -!! Feb. 2011 (V.Masson, C.Lac) SBL_DEPTH values on outer pts -!! for RMC01 -!! Sept.2011 (J.Escobar) init YINST_SFU ='M' -!! -!! Specific for 2D modeling : -!! -!! 06/2010 (P.Peyrille) add Call to aerozon.f90 if LAERO_FT=T -!! to update -!! aerosols and ozone climatology at each call to -!! phys_param otherwise it is constant to monthly average -!! 03/2013 (C.Lac) FIT temporal scheme -!! 01/2014 (C.Lac) correction for the nesting of 2D surface -!! fields if the number of the son model does not -!! follow the number of the dad model -!! J.Escobar 21/03/2013: for HALOK comment all NHALO=1 test -!! 2014 (M.Faivre) -!! 06/2016 (G.Delautier) phasage surfex 8 -!! 2016 B.VIE LIMA -!! M. Leriche 02/2017 Avoid negative fluxes if sv=0 outside the physics domain -!! C.Lac 10/2017 : ch_monitor and aer_monitor extracted from phys_param -!! to be called directly by modeln as the last process -!! 02/2018 Q.Libois ECRAD -! P. Wautelet 28/03/2018: replace TEMPORAL_DIST by DATETIME_DISTANCE -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! P. Wautelet 21/11/2019: ZRG_HOUR and ZRAT_HOUR are now parameter arrays -! C. Lac 11/2019: correction in the drag formula and application to building in addition to tree -! F. Auguste 02/2021: add IBM -! JL Redelsperger 03/2021: add the SW flux penetration for Ocean model case -! R. Schoetter 12/2021: multi-level coupling between MesoNH and SURFEX -! P. Wautelet 30/11/2022: compute XTHW_FLUX, XRCW_FLUX and XSVW_FLUX only when needed -! A. Costes 12/2021: add Blaze fire model -! Q. Rodier 2022 : integration with PHYEX -!!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_ADV_n, ONLY : XRTKEMS -USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODD_BLOWSNOW, ONLY : LBLOWSNOW,XRSNOW -USE MODD_BUDGET, ONLY: NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & - TBUDGETS, xtime_bu_process, TBUCONF -USE MODD_CH_AEROSOL -USE MODD_CH_MNHC_n, ONLY : LUSECHEM, &! indicates if chemistry is used - LCH_CONV_SCAV, & - LCH_CONV_LINOX -USE MODD_CLOUD_MF_n -USE MODD_CONDSAMP -USE MODD_CONF -USE MODD_CONF_n -USE MODD_CST, ONLY : CST -USE MODD_CTURB, ONLY : CSTURB -USE MODD_CURVCOR_n -USE MODD_DEEP_CONVECTION_n -USE MODD_DEF_EDDY_FLUX_n ! Ajout PP -USE MODD_DEF_EDDYUV_FLUX_n ! Ajout PP -USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN, XCURRENT_TKE_DISS -USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll -USE MODD_DRAGBLDG_n -USE MODD_DRAGTREE_n -USE MODD_DUST -USE MODD_DYN -USE MODD_DYN_n -USE MODD_EOL_MAIN, ONLY: LMAIN_EOL, CMETH_EOL, NMODEL_EOL -USE MODD_FIELD_n -USE MODD_FRC -USE MODD_FRC_n -USE MODD_GRID -USE MODD_GRID_n -USE MODD_IBM_PARAM_n, ONLY: LIBM, XIBM_EPSI, XIBM_LS, XIBM_XMUT -USE MODD_ICE_C1R3_DESCR, ONLY : XRTMIN_C1R3=>XRTMIN -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LATZ_EDFLX -USE MODD_LBC_n -USE MODD_LES -USE MODD_LES_n, ONLY: NLES_TIMES -USE MODD_LES_BUDGET -USE MODD_LSFIELD_n -USE MODD_LUNIT_n -USE MODD_METRICS_n -USE MODD_MNH_SURFEX_n -USE MODD_NESTING, ONLY : XWAY,NDAD, NDXRATIO_ALL, NDYRATIO_ALL -USE MODD_NSV, ONLY : NSV, NSV_LGBEG, NSV_LGEND, & - NSV_SLTBEG,NSV_SLTEND,NSV_SLT,& - NSV_AERBEG,NSV_AEREND, & - NSV_DSTBEG,NSV_DSTEND, NSV_DST,& - NSV_LIMA_NR,NSV_LIMA_NS,NSV_LIMA_NG,NSV_LIMA_NH -USE MODD_OCEANH -USE MODD_OUT_n -USE MODD_PARAM_C2R2, ONLY : LSEDC -USE MODD_PARAMETERS -USE MODD_PARAM_ICE_n, ONLY : LSEDIC -USE MODD_PARAM_KAFR_n -USE MODD_PARAM_LIMA, ONLY : MSEDC => LSEDC, XRTMIN_LIMA=>XRTMIN -USE MODD_PARAM_MFSHALL_n, ONLY: CMF_CLOUD -USE MODD_PARAM_n -USE MODD_PARAM_RAD_n -USE MODD_PASPOL -USE MODD_PASPOL_n -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_PRECIP_n -use modd_precision, only: MNHTIME -USE MODD_RADIATIONS_n -USE MODD_RAIN_ICE_DESCR_n, ONLY: XRTMIN -USE MODD_REF, ONLY: LCOUPLES -USE MODD_REF_n -USE MODD_SALT -USE MODD_SHADOWS_n -USE MODD_SUB_PHYS_PARAM_n -USE MODD_TIME_n -USE MODD_TIME_n -USE MODD_TIME, ONLY : TDTEXP ! Ajout PP -USE MODD_TURB_FLUX_AIRCRAFT_BALLOON, ONLY : XTHW_FLUX, XRCW_FLUX, XSVW_FLUX -USE MODD_TURB_n -USE MODD_NEB_n, ONLY: NEBN - -USE MODE_AERO_PSD -use mode_budget, only: Budget_store_end, Budget_store_init -USE MODE_DATETIME -USE MODE_DUST_PSD -USE MODE_ll -USE MODE_GATHER_ll -USE MODE_MNH_TIMING -USE MODE_MODELN_HANDLER -USE MODE_MPPDB -USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX -USE MODE_SALT_PSD - -USE MODI_AEROZON ! Ajout PP -USE MODI_CONDSAMP -USE MODI_CONVECTION -USE MODI_DRAG_BLD -USE MODI_DRAG_VEG -USE MODI_DUST_FILTER -USE MODI_EDDY_FLUX_n ! Ajout PP -USE MODI_EDDY_FLUX_ONE_WAY_n ! Ajout PP -USE MODI_EDDYUV_FLUX_n ! Ajout PP -USE MODI_EDDYUV_FLUX_ONE_WAY_n ! Ajout PP -USE MODI_EOL_MAIN -USE MODI_GROUND_PARAM_n -USE MODI_GRADIENT_M -USE MODI_GRADIENT_W -USE MODI_PASPOL -USE MODI_RADIATIONS -USE MODI_SALT_FILTER -USE MODI_SEDIM_DUST -USE MODI_SEDIM_SALT -USE MODI_SHALLOW_MF_PACK -USE MODI_SUNPOS_n -USE MODI_SURF_RAD_MODIF -USE MODI_SWITCH_SBG_LES_N -USE MODI_TURB - -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KTCOUNT ! temporal iteration count -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Synchronous output file -! advection schemes -REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PRAD,PSHADOWS,PKAFR,PGROUND,PTURB,PMAFL,PDRAG,PTRACER,PEOL ! to store CPU - ! time for computing time -REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PTIME_BU ! time used in budget&LES budgets statistics -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PWETDEPAER -LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASKkids ! kids domains mask -LOGICAL, INTENT(OUT) :: OCLOUD_ONLY ! conditionnal radiation computations for - ! the only cloudy columns - ! -! -!* 0.2 declarations of local variables -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFU ! surface flux of x and -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFV ! y component of wind -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFTH ! surface flux of theta -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFRV ! surface flux of vapor -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSFSV ! surface flux of scalars -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFCO2! surface flux of CO2 -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFTH_WALL -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFTH_ROOF -REAL, DIMENSION(:,:), ALLOCATABLE :: ZCD_ROOF -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFRV_WALL -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFRV_ROOF -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDIR_ALB ! direct albedo -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSCA_ALB ! diffuse albedo -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEMIS ! emissivity -REAL, DIMENSION(:,:), ALLOCATABLE :: ZTSRAD ! surface temperature -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRGDST,ZSIGDST,ZNDST,ZSVDST -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRGSLT,ZSIGSLT,ZNSLT,ZSVSLT -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRGAER,ZSIGAER,ZNAER,ZSVAER -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVT -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN ! Atmospheric density and Exner -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSIGMF ! MF contribution to XSIGS -! -REAL, DIMENSION(0:24), parameter :: ZRG_HOUR = (/ 0., 0., 0., 0., 0., 32.04, 114.19, & - 228.01, 351.25, 465.49, 557.24, & - 616.82, 638.33, 619.43, 566.56, & - 474.71, 359.20, 230.87, 115.72, & - 32.48, 0., 0., 0., 0., 0. /) -! -REAL, DIMENSION(0:24), parameter :: ZRAT_HOUR = (/ 326.00, 325.93, 325.12, 324.41, & - 323.16, 321.95, 322.51, 325.16, & - 328.01, 331.46, 335.58, 340.00, & - 345.20, 350.32, 354.20, 356.58, & - 356.56, 355.33, 352.79, 351.34, & - 347.00, 342.00, 337.00, 332.00, & - 326.00 /) -! -! -character(len=6) :: ynum -INTEGER :: IHOUR ! parameters necessary for the temporal -REAL :: ZTIME, ZDT ! interpolation -REAL :: ZTEMP_DIST ! time between 2 instants (in seconds) -! -LOGICAL :: GRAD ! conditionnal call for the full radiation - ! computations -REAL :: ZRAD_GLOB_ll ! 'real' global parallel mask of 'GRAD' -INTEGER :: INFO_ll ! error report of parallel routines - ! the only cloudy columns -! -REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME1, ZTIME2, ZTIME3, ZTIME4 ! for computing time analysis -REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME_LES_MF ! time spent in LES computation in shallow conv. -LOGICAL :: GDCONV ! conditionnal call for the deep convection - ! computations -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC, ZRI, ZWT ! additional dummies -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDXDY ! grid area - ! for rc, ri, w required if main variables not allocated -! -INTEGER :: IIU, IJU, IKU ! dimensional indexes -! -INTEGER :: JSV ! Loop index for Scalar Variables -INTEGER :: JSWB ! loop on SW spectral bands -INTEGER :: IIB,IIE,IJB,IJE, IKB, IKE, JI,JJ -INTEGER :: IMODEIDX - ! index values for the Beginning or the End of the physical - ! domain in x and y directions -TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange -INTEGER :: IINFO_ll ! return code of parallel routine -! -!* variables for writing in a fm file -! -INTEGER :: IRESP ! IRESP : return-code if a problem appears - !in LFI subroutines at the open of the file -INTEGER :: ILUOUT ! logical unit numbers of output-listing -INTEGER :: IMI ! model index -INTEGER :: JKID ! loop index to look for the KID models -REAL :: ZINIRADIUSI, ZINIRADIUSJ ! ORILAM initial radius -REAL, DIMENSION(NMODE_DST) :: ZINIRADIUS ! DUST initial radius -REAL, DIMENSION(NMODE_SLT) :: ZINIRADIUS_SLT ! Sea Salt initial radius -REAL, DIMENSION(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), SIZE(XRSVS,4)) :: ZRSVS -LOGICAL :: GCLD ! conditionnal call for dust wet deposition -! * arrays to store the surface fields before radiation and convection scheme -! calls -INTEGER :: IMODSON ! Number of son models of IMI with XWAY=2 -INTEGER :: IKIDM ! index loop -INTEGER :: IGRADIENTS ! Number of horizontal gradients in turb -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSAVE_INPRR,ZSAVE_INPRS,ZSAVE_INPRG,ZSAVE_INPRH -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSAVE_INPRC,ZSAVE_PRCONV,ZSAVE_PRSCONV -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSAVE_DIRFLASWD, ZSAVE_SCAFLASWD,ZSAVE_DIRSRFSWD -! for ocean model -INTEGER :: JKM , JSW ! vertical index loop -REAL :: ZSWA,TINTSW ! index for SW interpolation and int time betwenn forcings (ocean model) -REAL, DIMENSION(:), ALLOCATABLE :: ZIZOCE(:) ! Solar flux penetrating in ocean -REAL, DIMENSION(:), ALLOCATABLE :: ZPROSOL1(:),ZPROSOL2(:) ! Funtions for penetrating solar flux -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLENGTHM, ZLENGTHH, ZMFMOIST !OHARAT turb option from AROME (not allocated in MNH) - ! to be moved as optional args for turb -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTDIFF, ZTDISS -REAL, DIMENSION(:),ALLOCATABLE :: ZXHAT_ll,ZYHAT_ll ! Position x/y in the conformal - ! plane (array on the complete domain) -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDIST ! distance from the center of the cooling -! -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZHGRAD ! horizontal gradient used in turb -TYPE(DIMPHYEX_t) :: YLDIMPHYEX -LOGICAL :: GCOMPUTE_SRC ! flag to define dimensions of SIGS and SRCT variables -!----------------------------------------------------------------------------- - -NULLIFY(TZFIELDS_ll) -IMI=GET_CURRENT_MODEL_INDEX() -! -ILUOUT = TLUOUT%NLU -CALL GET_DIM_EXT_ll ('B',IIU,IJU) -IKU=SIZE(XTHT,3) -IKB = 1 + JPVEXT -IKE = IKU - JPVEXT -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -CALL FILL_DIMPHYEX(YLDIMPHYEX, SIZE(XTHT,1), SIZE(XTHT,2), SIZE(XTHT,3),.TRUE.,NLES_TIMES) -! -ZTIME1 = 0.0_MNHTIME -ZTIME2 = 0.0_MNHTIME -ZTIME3 = 0.0_MNHTIME -ZTIME4 = 0.0_MNHTIME -PTIME_BU = 0._MNHTIME -ZTIME_LES_MF = 0.0_MNHTIME -PWETDEPAER(:,:,:,:) = 0. -! -!* allocation of variables used in more than one parameterization -! -ALLOCATE(ZSFU (IIU,IJU)) ! surface schemes + turbulence -ALLOCATE(ZSFV (IIU,IJU)) -ALLOCATE(ZSFTH (IIU,IJU)) -ALLOCATE(ZSFRV (IIU,IJU)) -ALLOCATE(ZSFSV (IIU,IJU,NSV)) -ALLOCATE(ZSFCO2(IIU,IJU)) -! -ALLOCATE(ZSFTH_WALL (IIU,IJU)) -ALLOCATE(ZSFTH_ROOF (IIU,IJU)) -ALLOCATE(ZCD_ROOF (IIU,IJU)) -ALLOCATE(ZSFRV_WALL (IIU,IJU)) -ALLOCATE(ZSFRV_ROOF (IIU,IJU)) -! -!* if XWAY(son)=2 save surface fields before radiation or convective scheme -! calls -! -IMODSON = 0 -DO JKID = IMI+1,NMODEL ! min value of the possible kids - IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. CPROGRAM=='MESONH' & - .AND. (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN - IMODSON = IMODSON + 1 - END IF -END DO -! - IF (IMODSON /= 0 ) THEN - IF (LUSERC .AND. ( & - (LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR. & - (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. & - (MSEDC .AND. CCLOUD=='LIMA') & - )) THEN - ALLOCATE( ZSAVE_INPRC(SIZE(XINPRC,1),SIZE(XINPRC,2),IMODSON)) - ELSE - ALLOCATE( ZSAVE_INPRC(0,0,0)) - END IF - IF (LUSERR) THEN - ALLOCATE( ZSAVE_INPRR(SIZE(XINPRR,1),SIZE(XINPRR,2),IMODSON)) - ELSE - ALLOCATE( ZSAVE_INPRR(0,0,0)) - END IF - IF (LUSERS) THEN - ALLOCATE( ZSAVE_INPRS(SIZE(XINPRS,1),SIZE(XINPRS,2),IMODSON)) - ELSE - ALLOCATE( ZSAVE_INPRS(0,0,0)) - END IF - IF (LUSERG) THEN - ALLOCATE( ZSAVE_INPRG(SIZE(XINPRG,1),SIZE(XINPRG,2),IMODSON)) - ELSE - ALLOCATE( ZSAVE_INPRG(0,0,0)) - END IF - IF (LUSERH) THEN - ALLOCATE( ZSAVE_INPRH(SIZE(XINPRH,1),SIZE(XINPRH,2),IMODSON)) - ELSE - ALLOCATE( ZSAVE_INPRH(0,0,0)) - END IF - IF (CDCONV /= 'NONE') THEN - ALLOCATE( ZSAVE_PRCONV(SIZE(XPRCONV,1),SIZE(XPRCONV,2),IMODSON)) - ALLOCATE( ZSAVE_PRSCONV(SIZE(XPRSCONV,1),SIZE(XPRSCONV,2),IMODSON)) - ELSE - ALLOCATE( ZSAVE_PRCONV(0,0,0)) - ALLOCATE( ZSAVE_PRSCONV(0,0,0)) - END IF - IF (CRAD /= 'NONE') THEN - ALLOCATE( ZSAVE_DIRFLASWD(SIZE(XDIRFLASWD,1),SIZE(XDIRFLASWD,2),SIZE(XDIRFLASWD,3),IMODSON)) - ALLOCATE( ZSAVE_SCAFLASWD(SIZE(XSCAFLASWD,1),SIZE(XSCAFLASWD,2),SIZE(XSCAFLASWD,3),IMODSON)) - ALLOCATE( ZSAVE_DIRSRFSWD(SIZE(XDIRSRFSWD,1),SIZE(XDIRSRFSWD,2),SIZE(XDIRSRFSWD,3),IMODSON)) - ELSE - ALLOCATE( ZSAVE_DIRFLASWD(0,0,0,0)) - ALLOCATE( ZSAVE_SCAFLASWD(0,0,0,0)) - ALLOCATE( ZSAVE_DIRSRFSWD(0,0,0,0)) - END IF - ENDIF -! -IKIDM=0 -DO JKID = IMI+1,NMODEL ! min value of the possible kids - IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. CPROGRAM=='MESONH' & - .AND. (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN -! BUG if number of the son does not follow the number of the dad -! IKIDM = JKID-IMI - IKIDM = IKIDM + 1 - IF (LUSERC .AND. ( & - (LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR. & - (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. & - (MSEDC .AND. CCLOUD=='LIMA') & - )) THEN - ZSAVE_INPRC(:,:,IKIDM) = XINPRC(:,:) - END IF - IF (LUSERR) THEN - ZSAVE_INPRR(:,:,IKIDM) = XINPRR(:,:) - END IF - IF (LUSERS) THEN - ZSAVE_INPRS(:,:,IKIDM) = XINPRS(:,:) - END IF - IF (LUSERG) THEN - ZSAVE_INPRG(:,:,IKIDM) = XINPRG(:,:) - END IF - IF (LUSERH) THEN - ZSAVE_INPRH(:,:,IKIDM) = XINPRH(:,:) - END IF - IF (CDCONV /= 'NONE') THEN - ZSAVE_PRCONV(:,:,IKIDM) = XPRCONV(:,:) - ZSAVE_PRSCONV(:,:,IKIDM) = XPRSCONV(:,:) - END IF - IF (CRAD /= 'NONE') THEN - ZSAVE_DIRFLASWD(:,:,:,IKIDM) = XDIRFLASWD(:,:,:) - ZSAVE_SCAFLASWD(:,:,:,IKIDM) = XSCAFLASWD(:,:,:) - ZSAVE_DIRSRFSWD(:,:,:,IKIDM) = XDIRSRFSWD(:,:,:) - END IF - ENDIF -END DO -! -!----------------------------------------------------------------------------- -! -!* 1. RADIATION SCHEME -! ---------------- -! -! -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -CALL SECOND_MNH2(ZTIME1) -! -! -!* 1.1 Tests to control how the radiation package should be called (at the current timestep) -! ----------------------------------------------------------- -! -! -GRAD = .FALSE. -OCLOUD_ONLY = .FALSE. -! -IF (CRAD /='NONE') THEN -! -! test to see if the partial radiations for cloudy must be called -! - IF (CRAD =='ECMW' .OR. CRAD =='ECRA') THEN - CALL DATETIME_DISTANCE(TDTRAD_CLONLY,TDTCUR,ZTEMP_DIST) - IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTRAD_CLONLY/XTSTEP))==0 ) THEN - TDTRAD_CLONLY = TDTCUR - GRAD = .TRUE. - OCLOUD_ONLY = .TRUE. - END IF - END IF -! -! test to see if the full radiations must be called -! - CALL DATETIME_DISTANCE(TDTCUR,TDTRAD_FULL,ZTEMP_DIST) - IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTRAD/XTSTEP))==0 ) THEN - TDTRAD_FULL = TDTCUR - GRAD = .TRUE. - OCLOUD_ONLY = .FALSE. - END IF -! -! tests to see if any cloud exists -! - IF (CRAD =='ECMW' .OR. CRAD =='ECRA') THEN - IF (GRAD .AND. NRR.LE.3 ) THEN - IF( MAX(MAXVAL(XCLDFR(:,:,:)),MAXVAL(XICEFR(:,:,:))).LE. 1.E-10 .AND. OCLOUD_ONLY ) THEN - GRAD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no clouds - END IF - END IF -! - IF (GRAD .AND. NRR.GE.4 ) THEN - IF( CCLOUD(1:3)=='ICE' )THEN - IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN(2) .AND. & - MAXVAL(XRT(:,:,:,4)).LE.XRTMIN(4) .AND. OCLOUD_ONLY ) THEN - GRAD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no cloudwater and ice - END IF - END IF - IF( CCLOUD=='C3R5' )THEN - IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_C1R3(2) .AND. & - MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_C1R3(4) .AND. OCLOUD_ONLY ) THEN - GRAD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no cloudwater and ice - END IF - END IF - IF( CCLOUD=='LIMA' )THEN - IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_LIMA(2) .AND. & - MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_LIMA(4) .AND. OCLOUD_ONLY ) THEN - GRAD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no cloudwater and ice - END IF - END IF - END IF - END IF -! -END IF -! -! global parallel mask for 'GRAD' -ZRAD_GLOB_ll = 0.0 -IF (GRAD) ZRAD_GLOB_ll = 1.0 -CALL REDUCESUM_ll(ZRAD_GLOB_ll,INFO_ll) -if (ZRAD_GLOB_ll .NE. 0.0 ) GRAD = .TRUE. -! -! -IF( GRAD ) THEN - ALLOCATE(ZCOSZEN(IIU,IJU)) - ALLOCATE(ZSINZEN(IIU,IJU)) - ALLOCATE(ZAZIMSOL(IIU,IJU)) -! -! -!* 1.2. Astronomical computations -! ------------------------- -! -! Ajout PP -IF (.NOT. OCLOUD_ONLY .AND. KTCOUNT /= 1) THEN - IF (LAERO_FT) THEN - CALL AEROZON (XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP, & - NDLON,NFLEV,CAER,NAER,NSTATM, & - XSINDEL,XCOSDEL,XTSIDER,XCORSOL, & - XSTATM,XOZON, XAER) - XAER_CLIM = XAER - END IF -END IF -! -CALL SUNPOS_n ( XZENITH, ZCOSZEN, ZSINZEN, ZAZIMSOL ) -! -!* 1.3 Call to radiation scheme -! ------------------------ -! - SELECT CASE ( CRAD ) -! -!* 1.3.1 TOP of Atmposphere radiation -! ---------------------------- - CASE('TOPA') -! - XFLALWD (:,:) = 300. - DO JSWB=1,NSWB_MNH - XDIRFLASWD(:,:,JSWB) = CST%XI0 * MAX(COS(XZENITH(:,:)),0.)/REAL(NSWB_MNH) - XSCAFLASWD(:,:,JSWB) = 0. - END DO - XDTHRAD(:,:,:) = 0. - -! -!* 1.3.1 FIXEd radiative surface fluxes -! ------------------------------ -! - CASE('FIXE') - ZTIME = MOD(TDTCUR%xtime +XLON0*240., CST%XDAY) - IHOUR = INT( ZTIME/3600. ) - IF (IHOUR < 0) IHOUR=IHOUR + 24 - ZDT = ZTIME/3600. - REAL(IHOUR) - XDIRFLASWD(:,:,:) =(( ZRG_HOUR(IHOUR+1)-ZRG_HOUR(IHOUR) )*ZDT + ZRG_HOUR(IHOUR)) / REAL(NSWB_MNH) - XFLALWD (:,:) = (ZRAT_HOUR(IHOUR+1)-ZRAT_HOUR(IHOUR))*ZDT + ZRAT_HOUR(IHOUR) - DO JSWB=1,NSWB_MNH - WHERE(ZCOSZEN(:,:)<0.) XDIRFLASWD(:,:,JSWB) = 0. - END DO - - XSCAFLASWD(:,:,:) = XDIRFLASWD(:,:,:) * 0.2 - XDIRFLASWD(:,:,:) = XDIRFLASWD(:,:,:) * 0.8 - XDTHRAD(:,:,:) = 0. - ! -! -!* 1.3.2 ECMWF or ECRAD radiative surface and atmospheric fluxes -! ---------------------------------------------- -! - CASE('ECMW' , 'ECRA') - IF (LLES_MEAN) OCLOUD_ONLY=.FALSE. - XRADEFF(:,:,:)=0.0 - XSWU(:,:,:)=0.0 - XSWD(:,:,:)=0.0 - XLWU(:,:,:)=0.0 - XLWD(:,:,:)=0.0 - XDTHRADSW(:,:,:)=0.0 - XDTHRADLW(:,:,:)=0.0 - CALL RADIATIONS( TPFILE, & - LCLEAR_SKY, OCLOUD_ONLY, NCLEARCOL_TM1, CEFRADL, CEFRADI, COPWSW, COPISW, & - COPWLW, COPILW, XFUDG, & - NDLON, NFLEV, NRAD_DIAG, NFLUX, NRAD, NAER, NSWB_OLD, NSWB_MNH, NLWB_MNH, & - NSTATM, NRAD_COLNBR, ZCOSZEN, XSEA, XCORSOL, & - XDIR_ALB, XSCA_ALB, XEMIS, MAX(XCLDFR,XICEFR), XCCO2, XTSRAD, XSTATM, XTHT, XRT, & - XPABST, XOZON, XAER,XDST_WL, XAER_CLIM, XSVT, & - XDTHRAD, XFLALWD, XDIRFLASWD, XSCAFLASWD, XRHODREF, XZZ , & - XRADEFF, XSWU, XSWD, XLWU, XLWD, XDTHRADSW, XDTHRADLW ) -! - - WRITE(UNIT=ILUOUT,FMT='(" RADIATIONS called for KTCOUNT=",I6, & - & "with the CLOUD_ONLY option set ",L2)') KTCOUNT,OCLOUD_ONLY -! - ! - WHERE (XDIRFLASWD.LT.0.0) - XDIRFLASWD=0.0 - ENDWHERE - ! - WHERE (XDIRFLASWD.GT.1500.0) - XDIRFLASWD=1500.0 - ENDWHERE - ! - WHERE (XSCAFLASWD.LT.0.0) - XSCAFLASWD=0.0 - ENDWHERE - ! - WHERE (XSCAFLASWD.GT.1500.0) - XSCAFLASWD=1500.0 - ENDWHERE - ! - WHERE( XDIRFLASWD(:,:,1) + XSCAFLASWD(:,:,1) >0. ) - XALBUV(:,:) = ( XDIR_ALB(:,:,1) * XDIRFLASWD(:,:,1) & - + XSCA_ALB(:,:,1) * XSCAFLASWD(:,:,1) ) & - / (XDIRFLASWD(:,:,1) + XSCAFLASWD(:,:,1) ) - ELSEWHERE - XALBUV(:,:) = XDIR_ALB(:,:,1) - END WHERE -! - END SELECT -! - CALL SECOND_MNH2(ZTIME2) -! - PRAD = PRAD + ZTIME2 - ZTIME1 -! - ZTIME1 = ZTIME2 -! - CALL SURF_RAD_MODIF (XMAP, XDXHAT, XDYHAT, XXHAT, XYHAT, & - ZCOSZEN, ZSINZEN, ZAZIMSOL, XZS, XZS_XY, & - XDIRFLASWD, XDIRSRFSWD ) -! -!* Azimuthal angle to be sent later to surface processes -! Defined in radian, clockwise, from North -! - XAZIM = ZAZIMSOL -! - CALL SECOND_MNH2(ZTIME2) -! - PSHADOWS = PSHADOWS + ZTIME2 - ZTIME1 -! - ZTIME1 = ZTIME2 -! - DEALLOCATE(ZCOSZEN) - DEALLOCATE(ZSINZEN) - DEALLOCATE(ZAZIMSOL) -! -END IF -! -! -!* 1.4 control prints -! -------------- -! -!* 1.5 Radiative tendency integration -! ------------------------------ -! -IF (CRAD /='NONE') THEN - if ( TBUCONF%LBUDGET_th ) call Budget_store_init( TBUDGETS(NBUDGET_TH), 'RAD', xrths(:, :, :) ) - XRTHS(:,:,:) = XRTHS(:,:,:) + XRHODJ(:,:,:)*XDTHRAD(:,:,:) - if ( TBUCONF%LBUDGET_th ) call Budget_store_end ( TBUDGETS(NBUDGET_TH), 'RAD', xrths(:, :, :) ) -END IF -! -! -!* 1.6 Ocean case: -! Sfc turbulent fluxes & Radiative tendency due to SW penetrating ocean -! -IF (LCOUPLES) THEN -ZSFU(:,:)= XSSUFL_C(:,:,1) -ZSFV(:,:)= XSSVFL_C(:,:,1) -ZSFTH(:,:)= XSSTFL_C(:,:,1) -ZSFRV(:,:)=XSSRFL_C(:,:,1) -ELSE -IF (LOCEAN) THEN -! - ALLOCATE( ZIZOCE(IKU)); ZIZOCE(:)=0. - ALLOCATE( ZPROSOL1(IKU)) - ALLOCATE( ZPROSOL2(IKU)) - ALLOCATE(XSSOLA(IIU,IJU)) - ! Time interpolation - JSW = INT(TDTCUR%xtime/REAL(NINFRT)) - ZSWA = TDTCUR%xtime/REAL(NINFRT)-REAL(JSW) - ZSFRV = 0. - ZSFTH = (XSSTFL_T(JSW+1)*(1.-ZSWA)+XSSTFL_T(JSW+2)*ZSWA) - ZSFU = (XSSUFL_T(JSW+1)*(1.-ZSWA)+XSSUFL_T(JSW+2)*ZSWA) - ZSFV = (XSSVFL_T(JSW+1)*(1.-ZSWA)+XSSVFL_T(JSW+2)*ZSWA) -! - ZIZOCE(IKU) = XSSOLA_T(JSW+1)*(1.-ZSWA)+XSSOLA_T(JSW+2)*ZSWA - ZPROSOL1(IKU) = CST%XROC*ZIZOCE(IKU) - ZPROSOL2(IKU) = (1.-CST%XROC)*ZIZOCE(IKU) - if ( TBUCONF%LBUDGET_th ) call Budget_store_init( TBUDGETS(NBUDGET_TH), 'OCEAN', xrths(:, :, :) ) - DO JKM=IKU-1,2,-1 - ZPROSOL1(JKM) = ZPROSOL1(JKM+1)* exp(-XDZZ(2,2,JKM)/CST%XD1) - ZPROSOL2(JKM) = ZPROSOL2(JKM+1)* exp(-XDZZ(2,2,JKM)/CST%XD2) - ZIZOCE(JKM) = (ZPROSOL1(JKM+1)-ZPROSOL1(JKM) + ZPROSOL2(JKM+1)-ZPROSOL2(JKM))/XDZZ(2,2,JKM) - ! Adding to temperature tendency, the solar radiation penetrating in ocean - XRTHS(:,:,JKM) = XRTHS(:,:,JKM) + XRHODJ(:,:,JKM)*ZIZOCE(JKM) - END DO - if ( TBUCONF%LBUDGET_th ) call Budget_store_end ( TBUDGETS(NBUDGET_TH), 'OCEAN', xrths(:, :, :) ) - DEALLOCATE (XSSOLA) - DEALLOCATE( ZIZOCE) - DEALLOCATE (ZPROSOL1) - DEALLOCATE (ZPROSOL2) -END IF! LOCEAN NO LCOUPLES -END IF!NO LCOUPLES -! -! -CALL SECOND_MNH2(ZTIME2) -! -PRAD = PRAD + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS -! -! -!----------------------------------------------------------------------------- -! -!* 2. DEEP CONVECTION SCHEME -! ---------------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -CALL SECOND_MNH2(ZTIME1) -! -IF( CDCONV == 'KAFR' .OR. CSCONV == 'KAFR' ) THEN - - if ( TBUCONF%LBUDGET_th ) call Budget_store_init( TBUDGETS(NBUDGET_TH), 'DCONV', xrths(:, :, :) ) - if ( TBUCONF%LBUDGET_rv ) call Budget_store_init( TBUDGETS(NBUDGET_RV), 'DCONV', xrrs (:, :, :, 1) ) - if ( TBUCONF%LBUDGET_rc ) call Budget_store_init( TBUDGETS(NBUDGET_RC), 'DCONV', xrrs (:, :, :, 2) ) - if ( TBUCONF%LBUDGET_ri ) call Budget_store_init( TBUDGETS(NBUDGET_RI), 'DCONV', xrrs (:, :, :, 4) ) - if ( TBUCONF%LBUDGET_sv .and. lchtrans ) then - do jsv = 1, size( xrsvs, 4 ) - call Budget_store_init( TBUDGETS(NBUDGET_SV1 - 1 + jsv), 'DCONV', xrsvs (:, :, :, jsv) ) - end do - end if -! -! test to see if the deep convection scheme should be called -! - GDCONV = .FALSE. -! - CALL DATETIME_DISTANCE(TDTDCONV,TDTCUR,ZTEMP_DIST) - IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTCONV/XTSTEP))==0 ) THEN - TDTDCONV = TDTCUR - GDCONV = .TRUE. - END IF -! - IF( GDCONV ) THEN - IF (CDCONV == 'KAFR' .OR. CSCONV == 'KAFR' ) THEN - ALLOCATE( ZRC(IIU,IJU,IKU) ) - ALLOCATE( ZRI(IIU,IJU,IKU) ) - ALLOCATE( ZWT(IIU,IJU,IKU) ) - ALLOCATE( ZDXDY(IIU,IJU) ) - ! Compute grid area - ZDXDY(:,:) = SPREAD(XDXHAT(1:IIU),2,IJU) * SPREAD(XDYHAT(1:IJU),1,IIU) - ! - IF( LUSERC .AND. LUSERI ) THEN - ZRC(:,:,:) = XRT(:,:,:,2) - ZRI(:,:,:) = XRT(:,:,:,4) - ELSE IF( LUSERC .AND. (.NOT. LUSERI) ) THEN - ZRC(:,:,:) = XRT(:,:,:,2) - ZRI(:,:,:) = 0.0 - ELSE - ZRC(:,:,:) = 0.0 - ZRI(:,:,:) = 0.0 - END IF - WRITE(UNIT=ILUOUT,FMT='(" CONVECTION called for KTCOUNT=",I6)') & - KTCOUNT - IF ( LFORCING .AND. L1D ) THEN - ZWT(:,:,:) = XWTFRC(:,:,:) - ELSE - ZWT(:,:,:) = XWT(:,:,:) - ENDIF - IF (LDUST) CALL DUST_FILTER(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF(:,:,:)) - IF (LSALT) CALL SALT_FILTER(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF(:,:,:)) - IF (LCH_CONV_LINOX) THEN - CALL CONVECTION( XDTCONV, CDCONV, CSCONV, LREFRESH_ALL, LDOWN, NICE, & - LSETTADJ, XTADJD, XTADJS, LDIAGCONV, NENSM, & - XPABST, XZZ, ZDXDY, & - XTHT, XRT(:,:,:,1), ZRC, ZRI, XUT, XVT, & - ZWT,XTKET(:,:,IKB), & - NCOUNTCONV, XDTHCONV, XDRVCONV, XDRCCONV, XDRICONV, & - XPRCONV, XPRSCONV, & - XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV, & - XCAPE, NCLTOPCONV, NCLBASCONV, & - LCHTRANS, XSVT, XDSVCONV, & - LUSECHEM, LCH_CONV_SCAV, LCH_CONV_LINOX, & - LDUST, LSALT, & - XRHODREF, XIC_RATE, XCG_RATE ) - ELSE - CALL CONVECTION( XDTCONV, CDCONV, CSCONV, LREFRESH_ALL, LDOWN, NICE, & - LSETTADJ, XTADJD, XTADJS, LDIAGCONV, NENSM, & - XPABST, XZZ, ZDXDY, & - XTHT, XRT(:,:,:,1), ZRC, ZRI, XUT, XVT, & - ZWT,XTKET(:,:,IKB), & - NCOUNTCONV, XDTHCONV, XDRVCONV, XDRCCONV, XDRICONV, & - XPRCONV, XPRSCONV, & - XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV, & - XCAPE, NCLTOPCONV, NCLBASCONV, & - LCHTRANS, XSVT, XDSVCONV, & - LUSECHEM, LCH_CONV_SCAV, LCH_CONV_LINOX, & - LDUST, LSALT, & - XRHODREF ) - END IF -! - DEALLOCATE( ZRC ) - DEALLOCATE( ZRI ) - DEALLOCATE( ZWT ) - DEALLOCATE( ZDXDY ) - END IF - END IF -! -! Deep convection tendency integration -! - XRTHS(:,:,:) = XRTHS(:,:,:) + XRHODJ(:,:,:) * XDTHCONV(:,:,:) - XRRS(:,:,:,1) = XRRS(:,:,:,1) + XRHODJ(:,:,:) * XDRVCONV(:,:,:) -! -! -! Aerosols size distribution -! Compute Rg and sigma before tracers convection tendency (for orilam, dust and sea -! salt) -! - - IF ( LCHTRANS ) THEN ! update tracers for chemical transport - IF (LORILAM) ZRSVS(:,:,:,:) = XRSVS(:,:,:,:) ! - IF ((LDUST)) THEN ! dust convective balance - ALLOCATE(ZSIGDST(IIU,IJU,IKU,NMODE_DST)) - ALLOCATE(ZRGDST(IIU,IJU,IKU,NMODE_DST)) - ALLOCATE(ZNDST(IIU,IJU,IKU,NMODE_DST)) - ALLOCATE(ZSVDST(IIU,IJU,IKU,NSV_DST)) - ! - DO JSV=1,NMODE_DST - IMODEIDX = JPDUSTORDER(JSV) - IF (CRGUNITD=="MASS") THEN - ZINIRADIUS(JSV) = XINIRADIUS(IMODEIDX) * EXP(-3.*(LOG(XINISIG(IMODEIDX)))**2) - ELSE - ZINIRADIUS(JSV) = XINIRADIUS(IMODEIDX) - END IF - ZSIGDST(:,:,:,JSV) = XINISIG(IMODEIDX) - ZRGDST(:,:,:,JSV) = ZINIRADIUS(JSV) - ZNDST(:,:,:,JSV) = XN0MIN(IMODEIDX) - ENDDO - ! - IF (CPROGRAM == "MESONH") THEN - DO JSV=NSV_DSTBEG,NSV_DSTEND - ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) - ENDDO - ELSE - DO JSV=NSV_DSTBEG,NSV_DSTEND - ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XSVT(:,:,:,JSV) - ENDDO - ENDIF - CALL PPP2DUST(ZSVDST(IIB:IIE,IJB:IJE,IKB:IKE,:), XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE),& - PSIG3D=ZSIGDST(IIB:IIE,IJB:IJE,IKB:IKE,:), PRG3D=ZRGDST(IIB:IIE,IJB:IJE,IKB:IKE,:), & - PN3D=ZNDST(IIB:IIE,IJB:IJE,IKB:IKE,:)) - END IF - ! - IF ((LSALT)) THEN ! sea salt convective balance - ALLOCATE(ZSIGSLT(IIU,IJU,IKU,NMODE_SLT)) - ALLOCATE(ZRGSLT(IIU,IJU,IKU,NMODE_SLT)) - ALLOCATE(ZNSLT(IIU,IJU,IKU,NMODE_SLT)) - ALLOCATE(ZSVSLT(IIU,IJU,IKU,NSV_SLT)) - ! - DO JSV=1,NMODE_SLT - IMODEIDX = JPSALTORDER(JSV) - IF (CRGUNITS=="MASS") THEN - ZINIRADIUS_SLT(JSV) = XINIRADIUS_SLT(IMODEIDX) * & - EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2) - ELSE - ZINIRADIUS_SLT(JSV) = XINIRADIUS_SLT(IMODEIDX) - END IF - ZSIGSLT(:,:,:,JSV) = XINISIG_SLT(IMODEIDX) - ZRGSLT(:,:,:,JSV) = ZINIRADIUS_SLT(JSV) - ZNSLT(:,:,:,JSV) = XN0MIN_SLT(IMODEIDX) - ENDDO - ! - IF (CPROGRAM == "MESONH") THEN - DO JSV=NSV_SLTBEG,NSV_SLTEND - ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) - ENDDO - ELSE - DO JSV=NSV_SLTBEG,NSV_SLTEND - ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XSVT(:,:,:,JSV) - ENDDO - END IF - CALL PPP2SALT(ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE),& - PSIG3D=ZSIGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), PRG3D=ZRGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), & - PN3D=ZNSLT(IIB:IIE,IJB:IJE,IKB:IKE,:)) - END IF - ! -! -! Compute convective tendency for all tracers -! - IF (LCHTRANS) THEN - DO JSV = 1, SIZE(XRSVS,4) - XRSVS(:,:,:,JSV) = XRSVS(:,:,:,JSV) + XRHODJ(:,:,:) * XDSVCONV(:,:,:,JSV) - END DO - IF (LORILAM) THEN - DO JSV = NSV_AERBEG,NSV_AEREND - PWETDEPAER(:,:,:,JSV-NSV_AERBEG+1) = XDSVCONV(:,:,:,JSV) * XRHODJ(:,:,:) - XRSVS(:,:,:,JSV) = ZRSVS(:,:,:,JSV) - END DO - END IF - END IF -! - IF ((LDUST).AND.(LCHTRANS)) THEN ! dust convective balance - IF (CPROGRAM == "MESONH") THEN - DO JSV=NSV_DSTBEG,NSV_DSTEND - ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) - ENDDO - ELSE - DO JSV=NSV_DSTBEG,NSV_DSTEND - ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XSVT(:,:,:,JSV) - ENDDO - ENDIF - CALL DUST2PPP(ZSVDST(IIB:IIE,IJB:IJE,IKB:IKE,:), & - XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), ZSIGDST(IIB:IIE,IJB:IJE,IKB:IKE,:),& - ZRGDST(IIB:IIE,IJB:IJE,IKB:IKE,:)) - DO JSV=NSV_DSTBEG,NSV_DSTEND - XRSVS(:,:,:,JSV) = ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) * XRHODJ(:,:,:) / XTSTEP - ENDDO - ! - DEALLOCATE(ZSVDST) - DEALLOCATE(ZNDST) - DEALLOCATE(ZRGDST) - DEALLOCATE(ZSIGDST) - END IF - ! - IF ((LSALT).AND.(LCHTRANS)) THEN ! sea salt convective balance - IF (CPROGRAM == "MESONH") THEN - DO JSV=NSV_SLTBEG,NSV_SLTEND - ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) - ENDDO - ELSE - DO JSV=NSV_SLTBEG,NSV_SLTEND - ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XSVT(:,:,:,JSV) - ENDDO - END IF - CALL SALT2PPP(ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), & - XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), ZSIGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:),& - ZRGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:)) - DO JSV=NSV_SLTBEG,NSV_SLTEND - XRSVS(:,:,:,JSV) = ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) * XRHODJ(:,:,:) / XTSTEP - ENDDO - ! - DEALLOCATE(ZSVSLT) - DEALLOCATE(ZNSLT) - DEALLOCATE(ZRGSLT) - DEALLOCATE(ZSIGSLT) - END IF - ! -END IF -! - IF( LUSERC .AND. LUSERI ) THEN - XRRS(:,:,:,2) = XRRS(:,:,:,2) + XRHODJ(:,:,:) * XDRCCONV(:,:,:) - XRRS(:,:,:,4) = XRRS(:,:,:,4) + XRHODJ(:,:,:) * XDRICONV(:,:,:) -! - ELSE IF ( LUSERC .AND. (.NOT. LUSERI) ) THEN -! -! If only cloud water but no cloud ice is used, the convective tendency -! for cloud ice is added to the tendency for cloud water -! - XRRS(:,:,:,2) = XRRS(:,:,:,2) + XRHODJ(:,:,:) * (XDRCCONV(:,:,:) + & - XDRICONV(:,:,:) ) -! and cloud ice is melted -! - XRTHS(:,:,:) = XRTHS(:,:,:) - XRHODJ(:,:,:) * & - ( XP00/XPABST(:,:,:) )**(XRD/XCPD) * CST%XLMTT / XCPD * XDRICONV(:,:,:) -! - ELSE IF ( (.NOT. LUSERC) .AND. (.NOT. LUSERI) ) THEN -! -! If no cloud water and no cloud ice are used the convective tendencies for these -! variables are added to the water vapor tendency -! - XRRS(:,:,:,1) = XRRS(:,:,:,1) + XRHODJ(:,:,:) * (XDRCCONV(:,:,:) + & - XDRICONV(:,:,:) ) -! and all cloud condensate is evaporated -! - XRTHS(:,:,:) = XRTHS(:,:,:) - XRHODJ(:,:,:) / XCPD * ( & - CST%XLVTT * XDRCCONV(:,:,:) + CST%XLSTT * XDRICONV(:,:,:) ) *& - ( XP00 / XPABST(:,:,:) ) ** ( XRD / XCPD ) - END IF - - if ( TBUCONF%LBUDGET_th ) call Budget_store_end( TBUDGETS(NBUDGET_TH), 'DCONV', xrths(:, :, :) ) - if ( TBUCONF%LBUDGET_rv ) call Budget_store_end( TBUDGETS(NBUDGET_RV), 'DCONV', xrrs (:, :, :, 1) ) - if ( TBUCONF%LBUDGET_rc ) call Budget_store_end( TBUDGETS(NBUDGET_RC), 'DCONV', xrrs (:, :, :, 2) ) - if ( TBUCONF%LBUDGET_ri ) call Budget_store_end( TBUDGETS(NBUDGET_RI), 'DCONV', xrrs (:, :, :, 4) ) - if ( TBUCONF%LBUDGET_sv .and. lchtrans ) then - do jsv = 1, size( xrsvs, 4 ) - call Budget_store_end( TBUDGETS(NBUDGET_SV1 - 1 + jsv), 'DCONV', xrsvs (:, :, :, jsv) ) - end do - end if -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -PKAFR = PKAFR + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS -! -!----------------------------------------------------------------------------- -! -!* 3. TURBULENT SURFACE FLUXES -! ------------------------ -! -ZTIME1 = ZTIME2 -! -IF (CSURF=='EXTE') THEN - CALL GOTO_SURFEX(IMI) -! - IF( LTRANS ) THEN - XUT(:,:,1+JPVEXT) = XUT(:,:,1+JPVEXT) + XUTRANS - XVT(:,:,1+JPVEXT) = XVT(:,:,1+JPVEXT) + XVTRANS - END IF - ! - ALLOCATE(ZDIR_ALB(IIU,IJU,NSWB_MNH)) - ALLOCATE(ZSCA_ALB(IIU,IJU,NSWB_MNH)) - ALLOCATE(ZEMIS (IIU,IJU,NLWB_MNH)) - ALLOCATE(ZTSRAD (IIU,IJU)) - ! - IKIDM=0 - DO JKID = IMI+1,NMODEL ! min value of the possible kids - IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. & - CPROGRAM=='MESONH' .AND. & - (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN - ! where kids exist, use the two-way output fields (i.e. OMASKkids true) - ! rather than the farther calculations in radiation and convection schemes -! BUG if number of the son does not follow the number of the dad -! IKIDM = JKID-IMI - IKIDM = IKIDM + 1 - IF (LUSERC .AND. ( & - (LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR. & - (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. & - (MSEDC .AND. CCLOUD=='LIMA') & - )) THEN - WHERE (OMASKkids(:,:) ) - XINPRC(:,:) = ZSAVE_INPRC(:,:,IKIDM) - ENDWHERE - END IF - IF (LUSERR) THEN - WHERE (OMASKkids(:,:) ) - XINPRR(:,:) = ZSAVE_INPRR(:,:,IKIDM) - ENDWHERE - END IF - IF (LUSERS) THEN - WHERE (OMASKkids(:,:) ) - XINPRS(:,:) = ZSAVE_INPRS(:,:,IKIDM) - ENDWHERE - END IF - IF (LUSERG) THEN - WHERE (OMASKkids(:,:) ) - XINPRG(:,:) = ZSAVE_INPRG(:,:,IKIDM) - ENDWHERE - END IF - IF (LUSERH) THEN - WHERE (OMASKkids(:,:) ) - XINPRH(:,:) = ZSAVE_INPRH(:,:,IKIDM) - ENDWHERE - END IF - IF (CDCONV /= 'NONE') THEN - WHERE (OMASKkids(:,:) ) - XPRCONV(:,:) = ZSAVE_PRCONV(:,:,IKIDM) - XPRSCONV(:,:) = ZSAVE_PRSCONV(:,:,IKIDM) - ENDWHERE - END IF - IF (CRAD /= 'NONE') THEN - DO JSWB=1,NSWB_MNH - WHERE (OMASKkids(:,:) ) - XDIRFLASWD(:,:,JSWB) = ZSAVE_DIRFLASWD(:,:,JSWB,IKIDM) - XSCAFLASWD(:,:,JSWB) = ZSAVE_SCAFLASWD(:,:,JSWB,IKIDM) - XDIRSRFSWD(:,:,JSWB) = ZSAVE_DIRSRFSWD(:,:,JSWB,IKIDM) - ENDWHERE - ENDDO - END IF - ENDIF - END DO - ! - IF (IMODSON /= 0 ) THEN - DEALLOCATE( ZSAVE_INPRR,ZSAVE_INPRS,ZSAVE_INPRG,ZSAVE_INPRH) - DEALLOCATE( ZSAVE_INPRC,ZSAVE_PRCONV,ZSAVE_PRSCONV) - DEALLOCATE( ZSAVE_DIRFLASWD,ZSAVE_SCAFLASWD,ZSAVE_DIRSRFSWD) - END IF - CALL GROUND_PARAM_n(YLDIMPHYEX,ZSFTH, ZSFTH_WALL, ZSFTH_ROOF, ZCD_ROOF, ZSFRV, ZSFRV_WALL, ZSFRV_ROOF, & - ZSFSV, ZSFCO2, ZSFU, ZSFV, ZDIR_ALB, ZSCA_ALB, ZEMIS, ZTSRAD, KTCOUNT, TPFILE ) - ! - IF (LIBM) THEN - WHERE(XIBM_LS(:,:,IKB,1).GT.-XIBM_EPSI) - ZSFTH(:,:)=0. - ZSFRV(:,:)=0. - ZSFU (:,:)=0. - ZSFV (:,:)=0. - ENDWHERE - IF (NSV>0) THEN - DO JSV = 1 , NSV - WHERE(XIBM_LS(:,:,IKB,1).GT.-XIBM_EPSI) ZSFSV(:,:,JSV)=0. - ENDDO - ENDIF - ENDIF - ! - IF (SIZE(XEMIS)>0) THEN - XDIR_ALB = ZDIR_ALB - XSCA_ALB = ZSCA_ALB - XEMIS = ZEMIS - XTSRAD = ZTSRAD - END IF - ! - DEALLOCATE(ZDIR_ALB) - DEALLOCATE(ZSCA_ALB) - DEALLOCATE(ZEMIS ) - DEALLOCATE(ZTSRAD ) - ! - ! - IF( LTRANS ) THEN - XUT(:,:,1+JPVEXT) = XUT(:,:,1+JPVEXT) - XUTRANS - XVT(:,:,1+JPVEXT) = XVT(:,:,1+JPVEXT) - XVTRANS - END IF -! -ELSE ! case no SURFEX (CSURF logical) - ZSFSV = 0. - ZSFCO2 = 0. - ZSFTH_WALL = 0. - ZSFTH_ROOF = 0. - ZCD_ROOF = 0. - ZSFRV_WALL = 0. - ZSFRV_ROOF = 0. - IF (.NOT.LOCEAN) THEN - ZSFTH = 0. - ZSFRV = 0. - ZSFSV = 0. - ZSFCO2 = 0. - ZSFU = 0. - ZSFV = 0. - END IF -END IF !CSURF -! -CALL SECOND_MNH2(ZTIME2) -! -PGROUND = PGROUND + ZTIME2 - ZTIME1 -! -!----------------------------------------------------------------------------- -! -!* 3.1 EDDY FLUXES PARAMETRIZATION -! ------------------ -! -IF (IMI==1) THEN ! On calcule les flus turb. comme preconise par PP - - ! Heat eddy fluxes - IF ( LTH_FLX ) CALL EDDY_FLUX_n(IMI,KTCOUNT,XVT,XTHT,XRHODJ,XRTHS,XVTH_FLUX_M,XWTH_FLUX_M) - ! - ! Momentum eddy fluxes - IF ( LUV_FLX ) CALL EDDYUV_FLUX_n(IMI,KTCOUNT,XVT,XTHT,XRHODJ,XRHODREF,XPABSM,XRVS,XVU_FLUX_M) - -ELSE - ! TEST pour maille infèrieure à 20km ? - ! car pb d'instabilités ? - ! Pour le modèle fils, on spawne les flux du modèle père - ! Heat eddy fluxes - IF ( LTH_FLX ) CALL EDDY_FLUX_ONE_WAY_n (IMI,KTCOUNT,NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI),CLBCX,CLBCY) - ! - ! Momentum eddy fluxes - IF ( LUV_FLX ) CALL EDDYUV_FLUX_ONE_WAY_n (IMI,KTCOUNT,NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI),CLBCX,CLBCY) - ! -END IF -!----------------------------------------------------------------------------- -! -!* 4. PASSIVE POLLUTANTS -! ------------------ -! -ZTIME1 = ZTIME2 -! -IF (LPASPOL) CALL PASPOL(XTSTEP, ZSFSV, ILUOUT, NVERB, TPFILE) -! -! -!* 4b. PASSIVE POLLUTANTS FOR MASS-FLUX SCHEME DIAGNOSTICS -! --------------------------------------------------- -! -IF (LCONDSAMP) CALL CONDSAMP(XTSTEP, ZSFSV, ILUOUT, NVERB) -! -CALL SECOND_MNH2(ZTIME2) -! -PTRACER = PTRACER + ZTIME2 - ZTIME1 -!----------------------------------------------------------------------------- -! -!* 5a. Drag force -! ---------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -CALL ADD2DFIELD_ll(TZFIELDS_ll,ZSFTH_WALL, 'PHYS_PARAM_n::ZSFTH_WALL') -CALL ADD2DFIELD_ll(TZFIELDS_ll,ZSFTH_ROOF, 'PHYS_PARAM_n::ZSFTH_ROOF') -CALL ADD2DFIELD_ll(TZFIELDS_ll,ZCD_ROOF, 'PHYS_PARAM_n::ZCD_ROOF') -CALL ADD2DFIELD_ll(TZFIELDS_ll,ZSFRV_WALL, 'PHYS_PARAM_n::ZSFRV_WALL') -CALL ADD2DFIELD_ll(TZFIELDS_ll,ZSFRV_ROOF, 'PHYS_PARAM_n::ZSFRV_ROOF') -! -IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN - ZSFTH_WALL(IIB-1,:)=ZSFTH_WALL(IIB,:) - ZSFTH_ROOF(IIB-1,:)=ZSFTH_ROOF(IIB,:) - ZCD_ROOF (IIB-1,:)=ZCD_ROOF(IIB,:) - ZSFRV_WALL(IIB-1,:)=ZSFRV_WALL(IIB,:) - ZSFRV_ROOF(IIB-1,:)=ZSFRV_ROOF(IIB,:) -ENDIF -! -IF ( CLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN - ZSFTH_WALL(IIE+1,:)=ZSFTH_WALL(IIE,:) - ZSFTH_ROOF(IIE+1,:)=ZSFTH_ROOF(IIE,:) - ZCD_ROOF(IIE+1,:) =ZCD_ROOF(IIE,:) - ZSFRV_WALL(IIE+1,:)=ZSFRV_WALL(IIE,:) - ZSFRV_ROOF(IIE+1,:)=ZSFRV_ROOF(IIE,:) -ENDIF -! -IF ( CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN - ZSFTH_WALL(:,IJB-1)=ZSFTH_WALL(:,IJB) - ZSFTH_ROOF(:,IJB-1)=ZSFTH_ROOF(:,IJB) - ZCD_ROOF(:,IJB-1) =ZCD_ROOF(:,IJB) - ZSFRV_WALL(:,IJB-1)=ZSFRV_WALL(:,IJB) - ZSFRV_ROOF(:,IJB-1)=ZSFRV_ROOF(:,IJB) -ENDIF -! -IF ( CLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN - ZSFTH_WALL(:,IJE+1)=ZSFTH_WALL(:,IJE) - ZSFTH_ROOF(:,IJE+1)=ZSFTH_ROOF(:,IJE) - ZCD_ROOF(:,IJE+1)=ZCD_ROOF(:,IJE) - ZSFRV_WALL(:,IJE+1)=ZSFRV_WALL(:,IJE) - ZSFRV_ROOF(:,IJE+1)=ZSFRV_ROOF(:,IJE) -ENDIF -! -! -IF (LDRAGTREE) CALL DRAG_VEG( XTSTEP, XUT, XVT, XTKET, LDEPOTREE, XVDEPOTREE, & - CCLOUD, XPABST, XTHT, XRT, XSVT, XRHODJ, XZZ, & - XRUS, XRVS, XRTKES, XRRS, XRSVS ) -! -IF (LDRAGBLDG) CALL DRAG_BLD ( XTSTEP, XUT, XVT, XTKET, XPABST, XTHT, XRT, XSVT, & - XRHODJ, XZZ, XRUS, XRVS, XRTKES, XRTHS, XRRS, & - ZSFTH_WALL, ZSFTH_ROOF, ZCD_ROOF, ZSFRV_WALL, & - ZSFRV_ROOF ) -! -CALL SECOND_MNH2(ZTIME2) -! -PDRAG = PDRAG + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS -! -!* 5b. Drag force from wind turbines -! ----------------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF (LMAIN_EOL .AND. IMI == NMODEL_EOL) THEN - CALL EOL_MAIN(KTCOUNT,XTSTEP, & - XDXX,XDYY,XDZZ, & - XRHODJ, & - XUT,XVT,XWT, & - XRUS, XRVS, XRWS ) -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -PEOL = PEOL + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS -! -!* -!----------------------------------------------------------------------------- -! -!* 6. TURBULENCE SCHEME -! ----------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -ZSFTH(:,:) = ZSFTH(:,:) * XDIRCOSZW(:,:) -ZSFRV(:,:) = ZSFRV(:,:) * XDIRCOSZW(:,:) -DO JSV=1,NSV - ZSFSV(:,:,JSV) = ZSFSV(:,:,JSV) * XDIRCOSZW(:,:) -END DO -! -IF (LLES_CALL) CALL SWITCH_SBG_LES_n -! -! -IF ( CTURB == 'TKEL' ) THEN -! - -!* 6.1 complete surface flux fields on the border -! -!!$ IF(NHALO == 1) THEN - CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFTH, 'PHYS_PARAM_n::ZSFTH' ) - CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFRV, 'PHYS_PARAM_n::ZSFRV' ) - CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFU, 'PHYS_PARAM_n::ZSFU' ) - CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFV, 'PHYS_PARAM_n::ZSFV' ) - IF(NSV >0)THEN - DO JSV=1,NSV - write ( ynum, '( I6 ) ' ) jsv - CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFSV(:,:,JSV), 'PHYS_PARAM_n::ZSFSV:'//trim( adjustl( ynum ) ) ) - END DO - END IF - CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFCO2, 'PHYS_PARAM_n::ZSFCO2' ) - CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS_ll) -!!$ END IF -! - CALL MPPDB_CHECK2D(ZSFU,"phys_param::ZSFU",PRECISION) - ! - IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN - ZSFTH(IIB-1,:)=ZSFTH(IIB,:) - ZSFRV(IIB-1,:)=ZSFRV(IIB,:) - ZSFU(IIB-1,:)=ZSFU(IIB,:) - ZSFV(IIB-1,:)=ZSFV(IIB,:) - IF (NSV>0) THEN - ZSFSV(IIB-1,:,:)=ZSFSV(IIB,:,:) - WHERE ((ZSFSV(IIB-1,:,:).LT.0.).AND.(XSVT(IIB-1,:,IKB,:).EQ.0.)) - ZSFSV(IIB-1,:,:) = 0. - END WHERE - ENDIF - ZSFCO2(IIB-1,:)=ZSFCO2(IIB,:) - END IF - ! - IF ( CLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN - ZSFTH(IIE+1,:)=ZSFTH(IIE,:) - ZSFRV(IIE+1,:)=ZSFRV(IIE,:) - ZSFU(IIE+1,:)=ZSFU(IIE,:) - ZSFV(IIE+1,:)=ZSFV(IIE,:) - IF (NSV>0) THEN - ZSFSV(IIE+1,:,:)=ZSFSV(IIE,:,:) - WHERE ((ZSFSV(IIE+1,:,:).LT.0.).AND.(XSVT(IIE+1,:,IKB,:).EQ.0.)) - ZSFSV(IIE+1,:,:) = 0. - END WHERE - ENDIF - ZSFCO2(IIE+1,:)=ZSFCO2(IIE,:) - END IF - ! - IF ( CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN - ZSFTH(:,IJB-1)=ZSFTH(:,IJB) - ZSFRV(:,IJB-1)=ZSFRV(:,IJB) - ZSFU(:,IJB-1)=ZSFU(:,IJB) - ZSFV(:,IJB-1)=ZSFV(:,IJB) - IF (NSV>0) THEN - ZSFSV(:,IJB-1,:)=ZSFSV(:,IJB,:) - WHERE ((ZSFSV(:,IJB-1,:).LT.0.).AND.(XSVT(:,IJB-1,IKB,:).EQ.0.)) - ZSFSV(:,IJB-1,:) = 0. - END WHERE - ENDIF - ZSFCO2(:,IJB-1)=ZSFCO2(:,IJB) - END IF - ! - IF ( CLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN - ZSFTH(:,IJE+1)=ZSFTH(:,IJE) - ZSFRV(:,IJE+1)=ZSFRV(:,IJE) - ZSFU(:,IJE+1)=ZSFU(:,IJE) - ZSFV(:,IJE+1)=ZSFV(:,IJE) - IF (NSV>0) THEN - ZSFSV(:,IJE+1,:)=ZSFSV(:,IJE,:) - WHERE ((ZSFSV(:,IJE+1,:).LT.0.).AND.(XSVT(:,IJE+1,IKB,:).EQ.0.)) - ZSFSV(:,IJE+1,:) = 0. - END WHERE - ENDIF - ZSFCO2(:,IJE+1)=ZSFCO2(:,IJE) - END IF -! - IF( LTRANS ) THEN - XUT(:,:,:) = XUT(:,:,:) + XUTRANS - XVT(:,:,:) = XVT(:,:,:) + XVTRANS - END IF -! -! -IF ( ALLOCATED( XTHW_FLUX ) ) DEALLOCATE( XTHW_FLUX ) -IF ( LFLYER ) THEN - ALLOCATE( XTHW_FLUX(SIZE( XTHT, 1 ), SIZE( XTHT, 2 ), SIZE( XTHT, 3 )) ) -ELSE - ALLOCATE( XTHW_FLUX(0, 0, 0) ) -END IF - -IF ( ALLOCATED( XRCW_FLUX ) ) DEALLOCATE( XRCW_FLUX ) -IF ( LFLYER ) THEN - ALLOCATE( XRCW_FLUX(SIZE( XTHT, 1 ), SIZE( XTHT, 2 ), SIZE( XTHT, 3 )) ) -ELSE - ALLOCATE( XRCW_FLUX(0, 0, 0) ) -END IF - -IF ( ALLOCATED( XSVW_FLUX ) ) DEALLOCATE( XSVW_FLUX ) -IF ( LFLYER ) THEN - ALLOCATE( XSVW_FLUX(SIZE( XSVT, 1 ), SIZE( XSVT, 2 ), SIZE( XSVT, 3 ), SIZE( XSVT, 4 )) ) -ELSE - ALLOCATE( XSVW_FLUX(0, 0, 0, 0) ) -END IF -! -GCOMPUTE_SRC=SIZE(XSIGS, 3)/=0 -! -ALLOCATE(ZTDIFF(IIU,IJU,IKU)) -ALLOCATE(ZTDISS(IIU,IJU,IKU)) -! -!! Compute Shape of sfc flux for Oceanic Deep Conv Case -! -IF (LOCEAN .AND. LDEEPOC) THEN - ALLOCATE(ZDIST(IIU,IJU)) - !* COMPUTES THE PHYSICAL SUBDOMAIN BOUNDS - ALLOCATE(ZXHAT_ll(NIMAX_ll+2*JPHEXT),ZYHAT_ll(NJMAX_ll+2*JPHEXT)) - !compute ZXHAT_ll = position in the (0:Lx) domain 1 (Lx=Size of domain1 ) - !compute XXHAT_ll = position in the (L0_subproc,Lx_subproc) domain for the current subproc - ! L0_subproc as referenced in the full domain 1 - CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) - CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) - CALL GET_DIM_EXT_ll('B',IIU,IJU) - DO JJ = IJB,IJE - DO JI = IIB,IIE - ZDIST(JI,JJ) = SQRT( & - (( (XXHAT(JI)+XXHAT(JI+1))*0.5 - XCENTX_OC ) / XRADX_OC)**2 + & - (( (XYHAT(JJ)+XYHAT(JJ+1))*0.5 - XCENTY_OC ) / XRADY_OC)**2 & - ) - END DO - END DO - DO JJ=IJB,IJE - DO JI=IIB,IIE - IF ( ZDIST(JI,JJ) > 1.) ZSFTH(JI,JJ)=0. - END DO - END DO -END IF !END DEEP OCEAN CONV CASE -! -IF(LLEONARD) THEN - IGRADIENTS=6 - ALLOCATE(ZHGRAD(IIU,IJU,IKU,IGRADIENTS)) - ZHGRAD(:,:,:,1) = GX_W_UW(XWT(:,:,:), XDXX,XDZZ,XDZX,1,IKU,1) - ZHGRAD(:,:,:,2) = GY_W_VW(XWT(:,:,:), XDXX,XDZZ,XDZX,1,IKU,1) - ZHGRAD(:,:,:,3) = GX_M_M(XTHT(:,:,:), XDXX,XDZZ,XDZX,1,IKU,1) - ZHGRAD(:,:,:,4) = GY_M_M(XTHT(:,:,:), XDXX,XDZZ,XDZX,1,IKU,1) - ZHGRAD(:,:,:,5) = GX_M_M(XRT(:,:,:,1), XDXX,XDZZ,XDZX,1,IKU,1) - ZHGRAD(:,:,:,6) = GY_M_M(XRT(:,:,:,1), XDXX,XDZZ,XDZX,1,IKU,1) -END IF - CALL TURB( CST,CSTURB, TBUCONF, TURBN, NEBN, YLDIMPHYEX,TLES, & - NRR, NRRL, NRRI, CLBCX, CLBCY, IGRADIENTS, NHALO, NTURBSPLIT, & - LCLOUDMODIFLM, NSV, NSV_LGBEG, NSV_LGEND, & - NSV_LIMA_NR, NSV_LIMA_NS, NSV_LIMA_NG, NSV_LIMA_NH, & - L2D, LNOMIXLG,LFLAT, & - LCOUPLES, LBLOWSNOW, LIBM,LFLYER, & - GCOMPUTE_SRC, XRSNOW, & - LOCEAN, LDEEPOC, LDIAG_IN_RUN, & - CTURBLEN_CLOUD, CCLOUD, & - XTSTEP, TPFILE, & - XDXX, XDYY, XDZZ, XDZX, XDZY, XZZ, & - XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, XCOSSLOPE, XSINSLOPE, & - XRHODJ, XTHVREF, ZHGRAD, XZS, & - ZSFTH, ZSFRV, ZSFSV, ZSFU, ZSFV, & - XPABST, XUT, XVT, XWT, XTKET, XSVT, XSRCT, & - ZLENGTHM, ZLENGTHH, ZMFMOIST, & - XBL_DEPTH, XSBL_DEPTH, & - XCEI, XCEI_MIN, XCEI_MAX, XCOEF_AMPL_SAT, & - XTHT, XRT, & - XRUS, XRVS, XRWS, XRTHS, XRRS, XRSVS, XRTKES, XSIGS, XWTHVMF, & - XTHW_FLUX, XRCW_FLUX, XSVW_FLUX,XDYP, XTHP, ZTDIFF, ZTDISS, & - TBUDGETS, KBUDGETS=SIZE(TBUDGETS),PLEM=XLEM,PRTKEMS=XRTKEMS, & - PTR=XTR, PDISS=XDISS, PCURRENT_TKE_DISS=XCURRENT_TKE_DISS, & - PIBM_LS=XIBM_LS(:,:,:,1), PIBM_XMUT=XIBM_XMUT, & - PSSTFL=XSSTFL, PSSTFL_C=XSSTFL_C, PSSRFL_C=XSSRFL_C, & - PSSUFL_C=XSSUFL_C, PSSVFL_C=XSSVFL_C, PSSUFL=XSSUFL, PSSVFL=XSSVFL ) -! -DEALLOCATE(ZTDIFF) -DEALLOCATE(ZTDISS) -IF(LLEONARD) DEALLOCATE(ZHGRAD) -! -IF (LRMC01) THEN - CALL ADD2DFIELD_ll( TZFIELDS_ll, XSBL_DEPTH, 'PHYS_PARAM_n::XSBL_DEPTH' ) - CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS_ll) - IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN - XSBL_DEPTH(IIB-1,:)=XSBL_DEPTH(IIB,:) - END IF - IF ( CLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN - XSBL_DEPTH(IIE+1,:)=XSBL_DEPTH(IIE,:) - END IF - IF ( CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN - XSBL_DEPTH(:,IJB-1)=XSBL_DEPTH(:,IJB) - END IF - IF ( CLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN - XSBL_DEPTH(:,IJE+1)=XSBL_DEPTH(:,IJE) - END IF -END IF -! -CALL SECOND_MNH2(ZTIME3) -! -!----------------------------------------------------------------------------- -! -!* 7. EDMF SCHEME -! ----------- -! -IF (CSCONV == 'EDKF') THEN - ALLOCATE(ZEXN (IIU,IJU,IKU)) - ALLOCATE(ZSIGMF (IIU,IJU,IKU)) - ZSIGMF(:,:,:)=0. - ZEXN(:,:,:)=(XPABST(:,:,:)/XP00)**(XRD/XCPD) - !$20131113 check3d on ZEXN - CALL MPPDB_CHECK3D(ZEXN,"physparan.7::ZEXN",PRECISION) - CALL ADD3DFIELD_ll( TZFIELDS_ll, ZEXN, 'PHYS_PARAM_n::ZEXN' ) - !$20131113 add update_halo_ll - CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS_ll) - CALL MPPDB_CHECK3D(ZEXN,"physparam.7::ZEXN",PRECISION) - ! - CALL SHALLOW_MF_PACK(NRR,NRRL,NRRI, & - TPFILE,ZTIME_LES_MF, & - XTSTEP, & - XDZZ, XZZ,XDXHAT(1),XDYHAT(1), & - XRHODJ, XRHODREF, XPABST, ZEXN, ZSFTH, ZSFRV, & - XTHT,XRT,XUT,XVT,XTKET,XSVT, & - XRTHS,XRRS,XRUS,XRVS,XRSVS, & - ZSIGMF,XRC_MF, XRI_MF, XCF_MF, XWTHVMF) -! -ELSE - XWTHVMF(:,:,:)=0. - XRC_MF(:,:,:)=0. - XRI_MF(:,:,:)=0. - XCF_MF(:,:,:)=0. -ENDIF -! -CALL SECOND_MNH2(ZTIME4) - - IF( LTRANS ) THEN - XUT(:,:,:) = XUT(:,:,:) - XUTRANS - XVT(:,:,:) = XVT(:,:,:) - XVTRANS - END IF - IF (CMF_CLOUD == 'STAT') THEN - XSIGS =SQRT( XSIGS**2 + ZSIGMF**2 ) - ENDIF - IF (CSCONV == 'EDKF') THEN - DEALLOCATE(ZSIGMF) - DEALLOCATE(ZEXN) - ENDIF -END IF -! -IF (LLES_CALL) CALL SWITCH_SBG_LES_n -! -CALL SECOND_MNH2(ZTIME2) -! -PTURB = PTURB + ZTIME2 - ZTIME1 - (XTIME_LES-ZTIME_LES_MF) - XTIME_LES_BU_PROCESS & - - XTIME_BU_PROCESS - (ZTIME4 - ZTIME3) -! -PMAFL = PMAFL + ZTIME4 - ZTIME3 - ZTIME_LES_MF -! -PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS -! -! -!------------------------------------------------------------------------------- -! -!* deallocation of variables used in more than one parameterization -! -DEALLOCATE(ZSFU ) ! surface schemes + turbulence -DEALLOCATE(ZSFV ) -DEALLOCATE(ZSFTH ) -DEALLOCATE(ZSFRV ) -DEALLOCATE(ZSFSV ) -DEALLOCATE(ZSFCO2) -! -DEALLOCATE(ZSFTH_WALL ) -DEALLOCATE(ZSFTH_ROOF ) -DEALLOCATE(ZCD_ROOF ) -DEALLOCATE(ZSFRV_WALL ) -DEALLOCATE(ZSFRV_ROOF ) -!------------------------------------------------------------------------------- -! -END SUBROUTINE PHYS_PARAM_n - diff --git a/src/PHYEX/ext/prep_ideal_case.f90 b/src/PHYEX/ext/prep_ideal_case.f90 deleted file mode 100644 index 25eac5bc1..000000000 --- a/src/PHYEX/ext/prep_ideal_case.f90 +++ /dev/null @@ -1,1953 +0,0 @@ -!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ####################### - PROGRAM PREP_IDEAL_CASE -! ####################### -! -!!**** *PREP_IDEAL_CASE* - program to write an initial FM-file -!! -!! PURPOSE -!! ------- -! The purpose of this program is to prepare an initial meso-NH file -! (LFIFM and DESFM files) filled with some idealized fields. -! -! ---- The present version can provide two types of fields: -! -! 1) CIDEAL = 'CSTN' : 3D fields derived from a vertical profile with -! --------------- n levels of constant moist Brunt Vaisala frequency -! The vertical profile is read in EXPRE file. -! These fields can be used for model runs -! -! 2) CIDEAL = 'RSOU' : 3D fields derived from a radiosounding. -! --------------- -! The radiosounding is read in EXPRE file. -! The following kind of data is permitted : -! YKIND = 'STANDARD' : Zsol, Psol, Tsol, TDsol -! (Pressure, dd, ff) , -! (Pressure, T, Td) -! YKIND = 'PUVTHVMR' : zsol, Psol, Thvsol, Rsol -! (Pressure, U, V) , -! (Pressure, THv, R) -! YKIND = 'PUVTHVHU' : zsol, Psol, Thvsol, Husol -! (Pressure, U, V) , -! (Pressure, THv, Hu) -! YKIND = 'ZUVTHVHU' : zsol, Psol, Thvsol, Husol -! (height, U, V) , -! (height, THv, Hu) -! YKIND = 'ZUVTHVMR' : zsol, Psol, Thvsol, Rsol -! (height, U, V) , -! (height, THv, R) -! YKIND = 'PUVTHDMR' : zsol, Psol, Thdsol, Rsol -! (Pressure, U, V) , -! (Pressure, THd, R) -! YKIND = 'PUVTHDHU' : zsol, Psol, Thdsol, Husol -! (Pressure, U, V) , -! (Pressure, THd, Hu) -! YKIND = 'ZUVTHDMR' : zsol, Psol, Thdsol, Rsol -! (height, U, V) , -! (height, THd, R) -! YKIND = 'ZUVTHLMR' : zsol, Psol, Thdsol, Rsol -! (height, U, V) , -! (height, THl, Rt) -! -! These fields can be used for model runs -! -! Cases (1) and (2) can be balanced -! (geostrophic, hydrostatic and anelastic balances) if desired. -! -! ---- The orography can be flat (YZS='FLAT'), but also -! sine-shaped (YZS='SINE') or bell-shaped (YZS='BELL') -! -! ---- The U(z) profile given in the RSOU and CSTN cases can -! be multiplied (CUFUN="Y*Z") by a function of y (function FUNUY) -! The V(z) profile given in the RSOU and CSTN cases can -! be multiplied (CVFUN="X*Z") by a function of x (function FUNVX). -! If it is not the case, i.e. U(y,z)=U(z) then CUFUN="ZZZ" and -! CVFUN="ZZZ" for V(y,z)=V(z). Instead of these separable forms, -! non-separables functions FUNUYZ (CUFUN="Y,Z") and FUNVXZ (CVFUN="X,Z") -! can be used to specify the wind components. -! -!!** METHOD -!! ------ -!! The directives and data to perform the preparation of the initial FM -!! file are stored in EXPRE file. This file is composed of two parts : -!! - a namelists-format part which is present in all cases -!! - a free-format part which contains data in cases -!! of discretised orography (CZS='DATA') -!! of radiosounding (CIDEAL='RSOU') or Nv=cste profile (CIDEAL='CSTN') -!! of forced version (LFORCING=.TRUE.) -!! -!! -!! The following PREP_IDEAL_CASE program : -!! -!! - initializes physical constants by calling INI_CST -!! -!! - sets default values for global variables which will be -!! written in DESFM file and for variables in EXPRE file (namelists part) -!! which will be written in LFIFM file. -!! -!! - reads the namelists part of EXPRE file which gives -!! informations about the preinitialization to perform, -!! -!! - allocates memory for arrays, -!! -!! - initializes fields depending on the -!! directives (CIDEAL in namelist NAM_CONF_PRE) : -!! -!! * grid variables : -!! The gridpoints are regularly spaced by XDELTAX, XDELTAY. -!! The grid is stretched along the z direction, the mesh varies -!! from XDZGRD near the ground to XDZTOP near the top and the -!! weigthing function is a TANH function characterized by its -!! center and width above and under this center -!! The orography is initialized following the kind of orography -!! (YZS in namelist NAM_CONF_PRE) and the degrees of freedom : -!! sine-shape ---> ZHMAX, IEXPX,IEXPY -!! bell-shape ---> ZHMAX, ZAX,ZAY,IIZS,IJZS -!! The horizontal grid variables are initialized following -!! the kind of geometry (LCARTESIAN in namelist NAM_CONF_PRE) -!! and the grid parameters XLAT0,XLON0,XBETA in both geometries -!! and XRPK,XLONORI,XLATORI in conformal projection. -!! In the case of initialization from a radiosounding, the -!! date and time is read in free-part of the EXPRE file. In other -!! cases year, month and day are set to NUNDEF and time to 0. -!! -!! * prognostic fields : -!! -!! U,V,W, Theta and r. are first determined. They are -!! multiplied by rhoj after the anelastic reference state -!! computation. -!! For the CSTN and RSOU cases, the determination of -!! Theta and rv is performed respectively by SET_RSOU -!! and by SET_CSTN which call the common routine SET_MASS. -!! These three routines have the following actions : -!! --- The input vertical profile is converted in -!! variables (U,V,thetav,r) and interpolated -!! on a mixed grid (with VERT_COORD) as in PREP_REAL_CASE -!! --- A variation of the u-wind component( x-model axis component) -!! is possible in y direction, a variation of the v-wind component -!! (y-model axis component) is possible in x direction. -!! --- Thetav could be computed with thermal wind balance -!! (LGEOSBAL=.TRUE. with call of SET_GEOSBAL) -!! --- The mass fields (theta and r ) and the wind components are -!! then interpolated on the model grid with orography as in -!! PREP_REAL_CASE with the option LSHIFT -!! --- An anelastic correction is applied in PRESSURE_IN_PREP in -!! the case of non-vanishing orography. -!! -!! * anelastic reference state variables : -!! -!! 1D reference state : -!! RSOU and CSTN cases : rhorefz and thvrefz are computed -!! by SET_REFZ (called by SET_MASS). -!! They are deduced from thetav and r on the model grid -!! without orography. -!! The 3D reference state is computed by SET_REF -!! -!! * The total mass of dry air is computed by TOTAL_DMASS -!! -!! - writes the DESFM file, -!! -!! - writes the LFIFM file . -!! -!! EXTERNAL -!! -------- -!! DEFAULT_DESFM : to set default values for variables which can be -!! contained in DESFM file -!! DEFAULT_EXPRE : to set default values for other global variables -!! which can be contained in namelist-part of EXPRE file -!! Module MODE_GRIDPROJ : contains conformal projection routines -!! SM_GRIDPROJ : to compute some grid variables, in -!! case of conformal projection. -!! Module MODE_GRIDCART : contains cartesian geometry routines -!! SM_GRIDCART : to compute some grid variables, in -!! case of cartesian geometry. -!! SET_RSOU : to initialize mass fields from a radiosounding -!! SET_CSTN : to initialize mass fields from a vertical profile of -!! n layers of Nv=cste -!! SET_REF : to compute rhoJ -!! RESSURE_IN_PREP : to apply an anelastic correction in the case of -!! non-vanishing orography -!! IO_File_open : to open a FM-file (DESFM + LFIFM) -!! WRITE_DESFM : to write the DESFM file -!! WRI_LFIFM : to write the LFIFM file -!! IO_File_close : to close a FM-file (DESFM + LFIFM) -!! -!! MXM,MYM,MZM : Shuman operators -!! WGUESS : to compute W with the continuity equation from -!! the U,V values -!! -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_PARAMETERS : contains parameters -!! Module MODD_DIM1 : contains dimensions -!! Module MODD_CONF : contains configuration variables for -!! all models -!! Module MODD_CST : contains physical constants -!! Module MODD_GRID : contains grid variables for all models -!! Module MODD_GRID1 : contains grid variables -!! Module MODD_TIME : contains time variables for all models -!! Module MODD_TIME1 : contains time variables -!! Module MODD_REF : contains reference state variables for -!! all models -!! Module MODD_REF1 : contains reference state variables -!! Module MODD_LUNIT : contains variables which concern names -!! and logical unit numbers of files for all models -!! Module MODD_FIELD1 : contains prognostics variables -!! Module MODD_GR_FIELD1 : contains the surface prognostic variables -!! Module MODD_LSFIELD1 : contains Larger Scale fields -!! Module MODD_DYN1 : contains dynamic control variables for model 1 -!! Module MODD_LBC1 : contains lbc control variables for model 1 -!! -!! -!! Module MODN_CONF1 : contains configuration variables for model 1 -!! and the NAMELIST list -!! Module MODN_LUNIT1 : contains variables which concern names -!! and logical unit numbers of files and -!! the NAMELIST list -!! -!! -!! REFERENCE -!! --------- -!! Book2 of MESO-NH documentation (program PREP_IDEAL_CASE) -!! -!! AUTHOR -!! ------ -!! V. Ducrocq *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 05/05/94 -!! updated V. Ducrocq 27/06/94 -!! updated P.M. 27/07/94 -!! updated V. Ducrocq 23/08/94 -!! updated V. Ducrocq 01/09/94 -!! namelist changes J. Stein 26/10/94 -!! namelist changes J. Stein 04/11/94 -!! remove the second step of the geostrophic balance 14/11/94 (J.Stein) -!! add grid stretching in the z direction + Larger scale fields + -!! cleaning 6/12/94 (J.Stein) -!! periodize the orography and the grid sizes in the periodic case -!! 19/12/94 (J.Stein) -!! correct a bug in the Larger Scale Fields initialization -!! 19/12/94 (J.Stein) -!! add the vertical grid stretching 02/01/95 (J. Stein) -!! Total mass of dry air computation 02/01/95 (J.P.Lafore) -!! add the 1D switch 13/01/95 (J. Stein) -!! enforce a regular vertical grid if desired 18/01/95 (J. Stein) -!! add the tdtcur initialization 26/01/95 (J. Stein) -!! bug in the test of the type of RS localization 25/02/95 (J. Stein) -!! remove R from the historical variables 16/03/95 (J. Stein) -!! error on the grid stretching 30/06/95 (J. Stein) -!! add the soil fields 01/09/95 (S.Belair) -!! change the streching function and the wind guess -!! (J. Stein and V.Masson) 21/09/95 -!! reset to FALSE LUSERC,..,LUSERH 12/12/95 (J. Stein) -!! enforce the RS localization in 1D and 2D config. -!! + add the 'TSZ0' option for the soil variables 28/01/96 (J. Stein) -!! initialization of domain from center point 31/01/96 (V. Masson) -!! add the constant file reading 05/02/96 (J. Stein) -!! enter vertical model levels values 20/10/95 (T.Montmerle) -!! add LFORCING option 19/02/96 (K. Suhre) -!! modify structure of NAM_CONF_PRE 20/02/96 (J.-P. Pinty) -!! default of the domain center when use of pgd file 12/03/96 (V. Masson) -!! change the surface initialization 20/03/96 ( Stein, -!! Bougeault, Kastendeutsch ) -!! change the DEFAULT_DESFMN CALL 17/04/96 ( Lafore ) -!! set the STORAGE_TYPE to 'TT' (a single instant) 30/04/96 (Stein, -!! Jabouille) -!! new wguess to spread the divergence 15/05/96 (Stein) -!! set LTHINSHELL to TRUE + return to the old wguess 29/08/96 (Stein) -!! MY_NAME and DAD_NAME writing for nesting 30/07/96 (Lafore) -!! MY_NAME and DAD_NAME reading in pgd file 26/09/96 (Masson) -!! and reading of pgd grid in a new routine -!! XXHAT and XYHAT are set to 0. at origine point 02/10/96 (Masson) -!! add LTHINSHELL in namelist NAM_CONF_PRE 08/10/96 (Masson) -!! restores use of TS and T2 26/11/96 (Masson) -!! value XUNDEF for soil and vegetation fields on sea 27/11/96 (Masson) -!! use of HUG and HU2 in both ISBA and TSZ0 cases 04/12/96 (Masson) -!! add initialization of chemical variables 06/08/96 (K. Suhre) -!! add MANUAL option for the terrain elevation 12/12/96 (J.-P. Pinty) -!! set DATA instead of MANUAL for the terrain -!! elevation option -!! add new anelastic equations' systems 29/06/97 (Stein) -!! split mode_lfifm_pgd 29/07/97 (Masson) -!! add directional z0 and subgrid scale orography 31/07/97 (Masson) -!! separates surface treatment in PREP_IDEAL_SURF 15/03/99 (Masson) -!! new PGD fields allocations 15/03/99 (Masson) -!! iterative call to pressure solver 15/03/99 (Masson) -!! removes TSZ0 case 04/01/00 (Masson) -!! parallelization 18/06/00 (Pinty) -!! adaptation for patch approach 02/07/00 (Solmon/Masson) -!! bug in W LB field on Y direction 05/03/01 (Stein) -!! add module MODD_NSV for NSV variable 01/02/01 (D. Gazen) -!! allow namelists in different orders 15/10/01 (I. Mallet) -!! allow LUSERC and LUSERI in 1D configuration 05/06/02 (P. Jabouille) -!! add ZUVTHLMR case (move in set_rsou latter) 05/12/02 Jabouille/Masson -!! move LHORELAX_SV (after INI_NSV) 30/04/04 (Pinty) -!! Correction Parallel bug IBEG & IDEND evalution 13/11/08 J.Escobar -!! add the option LSHIFT for interpolation of 26/10/10 (G.Tanguy) -!! correction for XHAT & parallelizarion of ZSDATA 23/09/11 J.Escobar -!! the vertical profile (as in PREP_REAL_CASE) -!! add use MODI of SURFEX routines 10/10/111 J.Escobar -!! -!! For 2D modeling: -!! Initialization of ADVFRC profiles (SET_ADVFRC) 06/2010 (P.Peyrille) -!! when LDUMMY(2)=T in PRE_IDEA1.nam -!! USE MODDB_ADVFRC_n for grid-nesting 02*2012 (M. Tomasini) -!! LBOUSS in MODD_REF 07/2013 (C.Lac) -!! Correction for ZS in PGD file 04/2014 (G. TANGUY) -!! Bug : remove NC WRITE_HGRID 05/2014 (S. Bielli via J.Escobar ) -!! BUG if ZFRC and ZFRC_ADV or ZFRC_REL are used together 11/2014 (G. Delautier) -!! Bug : detected with cray compiler , -!! missing '&' in continuation string 3/12/2014 J.Escobar -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! 06/2016 (G.Delautier) phasage surfex 8 -!! P.Wautelet : 08/07/2016 : removed MNH_NCWRIT define -!! 01/2018 (G.Delautier) SURFEX 8.1 -! P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables -! P. Wautelet 28/03/2019: use TFILE instead of unit number for set_iluout_timing -! P. Wautelet 19/04/2019: removed unused dummy arguments and variables -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! F. Auguste 02/2021: add IBM -! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv -! Jean-Luc Redelsperger 03/2021: ocean LES case -! P. Wautelet 06/07/2021: use FINALIZE_MNH -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS ! Declarative modules -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODD_BUDGET, ONLY: TBUCONF_ASSOCIATE -USE MODD_DIM_n -USE MODD_CONF -USE MODD_CST -USE MODD_GRID -USE MODD_GRID_n -USE MODD_IBM_LSF, ONLY: CIBM_TYPE, LIBM_LSF, NIBM_SMOOTH, XIBM_SMOOTH -USE MODD_IBM_PARAM_n, ONLY: XIBM_LS -USE MODD_METRICS_n -USE MODD_LES, ONLY : LES_ASSOCIATE -USE MODD_PGDDIM -USE MODD_PGDGRID -USE MODD_TIME -USE MODD_TIME_n -USE MODD_REF -USE MODD_REF_n -USE MODD_LUNIT -USE MODD_FIELD_n -USE MODD_DYN_n -USE MODD_LBC_n -USE MODD_LSFIELD_n -USE MODD_PARAM_n -USE MODD_CH_MNHC_n, ONLY: LUSECHEM, LUSECHAQ, LUSECHIC, LCH_PH, LCH_INIT_FIELD -USE MODD_CH_AEROSOL,ONLY: LORILAM, CORGANIC, LVARSIGI, LVARSIGJ, LINITPM, XINIRADIUSI, & - XINIRADIUSJ, XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT -USE MODD_DUST, ONLY: LDUST, NMODE_DST, CRGUNITD, XINISIG, XINIRADIUS, XN0MIN -USE MODD_SALT, ONLY: LSALT, NMODE_SLT, CRGUNITS, XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT -USE MODD_VAR_ll, ONLY: NPROC -USE MODD_LUNIT, ONLY: TLUOUT0, TOUTDATAFILE -USE MODD_LUNIT_n -USE MODD_IO, ONLY: TFILE_DUMMY, TFILE_OUTPUTLISTING -USE MODD_CONF_n -USE MODD_NSV, ONLY: NSV, NSV_ASSOCIATE -use modd_precision, only: LFIINT, MNHREAL_MPI, MNHTIME -! -USE MODN_BLANK_n -! -USE MODE_FINALIZE_MNH, only: FINALIZE_MNH -USE MODE_THERMO -USE MODE_POS -USE MODE_GRIDCART ! Executive modules -USE MODE_GRIDPROJ -USE MODE_GATHER_ll -USE MODE_IO, only: IO_Config_set, IO_Init, IO_Pack_set -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Header_write -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -USE MODE_ll -USE MODE_MODELN_HANDLER -use mode_field, only: Alloc_field_scalars, Ini_field_list, Ini_field_scalars -USE MODE_MSG -USE MODE_SET_GRID, only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_HORGRID -! -USE MODI_DEFAULT_DESFM_n ! Interface modules -USE MODI_DEFAULT_EXPRE -USE MODI_IBM_INIT_LS -USE MODI_READ_HGRID -USE MODI_SHUMAN -USE MODI_SET_RSOU -USE MODI_SET_CSTN -USE MODI_SET_FRC -USE MODI_PRESSURE_IN_PREP -USE MODI_WRITE_DESFM_n -USE MODI_WRITE_LFIFM_n -USE MODI_METRICS -USE MODI_UPDATE_METRICS -USE MODI_SET_REF -USE MODI_SET_PERTURB -USE MODI_TOTAL_DMASS -USE MODI_CH_INIT_FIELD_n -USE MODI_INI_NSV -USE MODI_READ_PRE_IDEA_NAM_n -USE MODI_ZSMT_PIC -USE MODI_ZSMT_PGD -USE MODI_READ_VER_GRID -USE MODI_READ_ALL_NAMELISTS -USE MODI_PGD_GRID_SURF_ATM -USE MODI_SPLIT_GRID -USE MODI_PGD_SURF_ATM -USE MODI_ICE_ADJUST_BIS -USE MODI_WRITE_PGD_SURF_ATM_n -USE MODI_PREP_SURF_MNH -USE MODI_INIT_SALT -USE MODI_AER2LIMA -USE MODD_PARAM_LIMA -! -!JUAN -USE MODE_SPLITTINGZ_ll -USE MODD_SUB_MODEL_n -USE MODE_MNH_TIMING -USE MODN_CONFZ -!JUAN -! -USE MODI_VERSION -USE MODI_INIT_PGD_SURF_ATM -USE MODI_WRITE_SURF_ATM_N -USE MODD_MNH_SURFEX_n -! Modif ADVFRC -USE MODD_2D_FRC -USE MODD_ADVFRC_n ! Modif for grid-nesting -USE MODI_SETADVFRC -USE MODD_RELFRC_n ! Modif for grid-nesting -USE MODI_SET_RELFRC -! -USE MODE_INI_CST, ONLY: INI_CST -USE MODD_NEB_n, ONLY: NEBN -USE MODI_WRITE_HGRID -USE MODD_MPIF -USE MODD_VAR_ll -USE MODD_IO, ONLY: TFILEDATA,TFILE_SURFEX -! -USE MODE_MPPDB -! -USE MODD_GET_n -! -USE MODN_CONFIO, ONLY : NAM_CONFIO -! -IMPLICIT NONE -! -!* 0.1 Declarations of global variables not declared in the modules -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: XJ ! Jacobian -REAL :: XLATCEN=XUNDEF, XLONCEN=XUNDEF ! latitude and longitude of the center of - ! the domain for initialization. This - ! point is vertical vorticity point - ! ------------------------ -REAL :: XDELTAX=0.5E4, XDELTAY=0.5E4 ! horizontal mesh lengths - ! used to determine XXHAT,XYHAT -! -INTEGER :: NLUPRE,NLUOUT ! Logical unit numbers for EXPRE file - ! and for output_listing file -INTEGER :: NRESP ! return code in FM routines -INTEGER :: NTYPE ! type of file (cpio or not) -INTEGER(KIND=LFIINT) :: NNPRAR ! number of articles predicted in the LFIFM file -LOGICAL :: GFOUND ! Return code when searching namelist -! -INTEGER :: JLOOP,JILOOP,JJLOOP ! Loop indexes -! -INTEGER :: NIB,NJB,NKB ! Begining useful area in x,y,z directions -INTEGER :: NIE,NJE ! Ending useful area in x,y directions -INTEGER :: NIU,NJU,NKU ! Upper bounds in x,y,z directions -CHARACTER(LEN=4) :: CIDEAL ='CSTN' ! kind of idealized fields - ! 'CSTN' : Nv=cste case - ! 'RSOU' : radiosounding case -CHARACTER(LEN=4) :: CZS ='FLAT' ! orography selector - ! 'FLAT' : zero orography - ! 'SINE' : sine-shaped orography - ! 'BELL' : bell-shaped orography -REAL :: XHMAX=XUNDEF ! Maximum height for orography -REAL :: NEXPX=3,NEXPY=1 ! Exponents for orography in case of CZS='SINE' -REAL :: XAX= 1.E4, XAY=1.E4 ! Widths for orography in case CZS='BELL' - ! along x and y -INTEGER :: NIZS = 5, NJZS = 5 ! Localization of the center in - ! case CZS ='BELL' -! -!* 0.1.1 Declarations of local variables for N=cste and -! radiosounding cases : -! -INTEGER :: NYEAR,NMONTH,NDAY ! year, month and day in EXPRE file -REAL :: XTIME ! time in EXPRE file -LOGICAL :: LPERTURB =.FALSE. ! Logical to add a perturbation to - ! a basic state -LOGICAL :: LGEOSBAL =.FALSE. ! Logical to satisfy the geostrophic - ! balance - ! .TRUE. for geostrophic balance - ! .FALSE. to ignore this balance -LOGICAL :: LSHIFT =.FALSE. ! flag to perform vertical shift or not. -CHARACTER(LEN=3) :: CFUNU ='ZZZ' ! CHARACTER STRING for variation of - ! U in y direction - ! 'ZZZ' : U = U(Z) - ! 'Y*Z' : U = F(Y) * U(Z) - ! 'Y,Z' : U = G(Y,Z) -CHARACTER(LEN=3) :: CFUNV ='ZZZ' ! CHARACTER STRING for variation of - ! V in x direction - ! 'ZZZ' : V = V(Z) - ! 'Y*Z' : V = F(X) * V(Z) - ! 'Y,Z' : V = G(X,Z) -CHARACTER(LEN=6) :: CTYPELOC='IJGRID' ! Type of informations used to give the - ! localization of vertical profile - ! 'IJGRID' for (i,j) point on index space - ! 'XYHATM' for (x,y) coordinates on - ! conformal or cartesian plane - ! 'LATLON' for (latitude,longitude) on - ! spherical earth -REAL :: XLATLOC= 45., XLONLOC=0. - ! Latitude and longitude of the vertical - ! profile localization (used in case - ! CTYPELOC='LATLON') -REAL :: XXHATLOC=2.E4, XYHATLOC=2.E4 - ! (x,y) of the vertical profile - ! localization (used in cases - ! CTYPELOC='LATLON' and 'XYHATM') -INTEGER, DIMENSION(1) :: NILOC=4, NJLOC=4 - ! (i,j) of the vertical profile - ! localization -! -! -REAL,DIMENSION(:,:,:),ALLOCATABLE :: XCORIOZ ! Coriolis parameter (this - ! is exceptionnaly a 3D array - ! for computing needs) -! -! -!* 0.1.2 Declarations of local variables used when a PhysioGraphic Data -! file is used : -! -INTEGER :: JSV ! loop index on scalar var. -CHARACTER(LEN=28) :: CPGD_FILE=' ' ! Physio-Graphic Data file name -LOGICAL :: LREAD_ZS = .TRUE., & ! switch to use orography - ! coming from the PGD file - LREAD_GROUND_PARAM = .TRUE. ! switch to use soil parameters - ! useful for the soil scheme - ! coming from the PGD file - -INTEGER :: NSLEVE =12 ! number of iteration for smooth orography -REAL :: XSMOOTH_ZS = XUNDEF ! optional uniform smooth orography for SLEVE coordinate -CHARACTER(LEN=28) :: YPGD_NAME, YPGD_DAD_NAME ! general information -CHARACTER(LEN=2) :: YPGD_TYPE -! -INTEGER :: IINFO_ll ! return code of // routines -TYPE(LIST_ll), POINTER :: TZ_FIELDS_ll ! list of metric coefficient fields -! -INTEGER :: IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU ! dimensions of the -INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2 ! West-east LB arrays -INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV ! dimensions of the -INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2 ! North-south LB arrays -INTEGER :: IBEG,IEND,IXOR,IXDIM,IYOR,IYDIM,ILBX,ILBY -! -REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZTHL,ZT,ZRT,ZFRAC_ICE,& - ZEXN,ZLVOCPEXN,ZLSOCPEXN,ZCPH, & - ZRSATW, ZRSATI -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZBUF - ! variables for adjustement -REAL :: ZDIST -! -!JUAN TIMING -REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME1, ZTIME2, ZEND, ZTOT -CHARACTER :: YMI -INTEGER :: IMI -!JUAN TIMING -! -REAL, DIMENSION(:), ALLOCATABLE :: ZZS_ll -INTEGER :: IJ -! -REAL :: ZZS_MAX, ZZS_MAX_ll -INTEGER :: IJPHEXT -! -TYPE(TFILEDATA),POINTER :: TZEXPREFILE => NULL() -! -! -!* 0.2 Namelist declarations -! -NAMELIST/NAM_CONF_PRE/ LTHINSHELL,LCARTESIAN, &! Declarations in MODD_CONF - LPACK, &! - NVERB,CIDEAL,CZS, &!+global variables initialized - LBOUSS,LOCEAN,LPERTURB, &! at their declarations - LFORCING,CEQNSYS, &! at their declarations - LSHIFT,L2D_ADV_FRC,L2D_REL_FRC, & - NHALO , JPHEXT -NAMELIST/NAM_GRID_PRE/ XLON0,XLAT0, & ! Declarations in MODD_GRID - XBETA,XRPK, & - XLONORI,XLATORI -NAMELIST/NAM_GRIDH_PRE/ XLATCEN,XLONCEN, & ! local variables initialized - XDELTAX,XDELTAY, & ! at their declarations - XHMAX,NEXPX,NEXPY, & - XAX,XAY,NIZS,NJZS -NAMELIST/NAM_VPROF_PRE/LGEOSBAL, CFUNU,CFUNV, &! global variables initialized - CTYPELOC,XLATLOC,XLONLOC, &! at their declarations - XXHATLOC,XYHATLOC,NILOC,NJLOC -NAMELIST/NAM_REAL_PGD/CPGD_FILE, & ! Physio-Graphic Data file - ! name - LREAD_ZS, & ! switch to use orography - ! coming from the PGD file - LREAD_GROUND_PARAM -NAMELIST/NAM_SLEVE/NSLEVE, XSMOOTH_ZS -! -!* 0.3 Auxillary Namelist declarations -! -NAMELIST/NAM_AERO_PRE/ LORILAM, LINITPM, XINIRADIUSI, XINIRADIUSJ, & - XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT, & - LDUST, LSALT, CRGUNITD, CRGUNITS,& - NMODE_DST, XINISIG, XINIRADIUS, XN0MIN,& - XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT, & - NMODE_SLT -! -NAMELIST/NAM_IBM_LSF/ LIBM_LSF, CIBM_TYPE, NIBM_SMOOTH, XIBM_SMOOTH -! -!------------------------------------------------------------------------------- -! -!* 0. PROLOGUE -! -------- -CALL MPPDB_INIT() -! -CALL GOTO_MODEL(1) -! -CALL IO_Init() -NULLIFY(TZ_FIELDS_ll) -CALL VERSION -CPROGRAM='IDEAL ' -! -!JUAN TIMING - XT_START = 0.0_MNHTIME - XT_STORE = 0.0_MNHTIME -! - CALL SECOND_MNH2(ZEND) -! -!JUAN TIMING -! -!* 1. INITIALIZE PHYSICAL CONSTANTS : -! ------------------------------ -! -NVERB = 5 -CALL INI_CST -! -!------------------------------------------------------------------------------- -! -! -!* 2. SET DEFAULT VALUES : -! -------------------- -! -! -!* 2.1 For variables in DESFM file -! -CALL ALLOC_FIELD_SCALARS() -CALL TBUCONF_ASSOCIATE() -CALL LES_ASSOCIATE() -CALL DEFAULT_DESFM_n(1) -CALL NSV_ASSOCIATE() -! -CSURF = "NONE" -! -! -!* 2.2 For other global variables in EXPRE file -! -CALL DEFAULT_EXPRE -!------------------------------------------------------------------------------- -! -!* 3. READ THE EXPRE FILE : -! -------------------- -! -!* 3.1 initialize logical unit numbers (EXPRE and output-listing files) -! and open these files : -! -! -CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING1','OUTPUTLISTING','WRITE') -CALL IO_File_open(TLUOUT0) -NLUOUT = TLUOUT0%NLU -!Set output files for PRINT_MSG -TLUOUT => TLUOUT0 -TFILE_OUTPUTLISTING => TLUOUT0 -! -CALL IO_File_add2list(TZEXPREFILE,'PRE_IDEA1.nam','NML','READ') -CALL IO_File_open(TZEXPREFILE) -NLUPRE=TZEXPREFILE%NLU -! -!* 3.2 read in NLUPRE the namelist informations -! -WRITE(NLUOUT,FMT=*) 'attempt to read ',TRIM(TZEXPREFILE%CNAME),' file' -CALL POSNAM( TZEXPREFILE, 'NAM_REAL_PGD', GFOUND ) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_REAL_PGD) -! -! -CALL POSNAM( TZEXPREFILE, 'NAM_CONF_PRE', GFOUND ) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONF_PRE) -!JUANZ -CALL POSNAM( TZEXPREFILE, 'NAM_CONFZ', GFOUND ) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFZ) -!JUANZ -CALL POSNAM( TZEXPREFILE, 'NAM_CONFIO', GFOUND ) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFIO) -CALL IO_Config_set() -CALL POSNAM( TZEXPREFILE, 'NAM_GRID_PRE', GFOUND ) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_GRID_PRE) -CALL POSNAM( TZEXPREFILE, 'NAM_GRIDH_PRE', GFOUND ) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_GRIDH_PRE) -CALL POSNAM( TZEXPREFILE, 'NAM_VPROF_PRE', GFOUND ) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_VPROF_PRE) -CALL POSNAM( TZEXPREFILE, 'NAM_BLANKN', GFOUND ) -CALL INIT_NAM_BLANKn -IF (GFOUND) THEN - READ(UNIT=NLUPRE,NML=NAM_BLANKn) - CALL UPDATE_NAM_BLANKn -END IF -CALL READ_PRE_IDEA_NAM_n( TZEXPREFILE ) -CALL POSNAM( TZEXPREFILE, 'NAM_AERO_PRE', GFOUND ) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_AERO_PRE) -CALL POSNAM( TZEXPREFILE, 'NAM_IBM_LSF', GFOUND ) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_IBM_LSF ) -! -CALL INI_FIELD_LIST() -! -CALL INI_FIELD_SCALARS() -! Sea salt -CALL INIT_SALT -! -IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN - ! open the PGD_FILE - CALL IO_File_add2list(TPGDFILE,TRIM(CPGD_FILE),'PGD','READ',KLFINPRAR=NNPRAR,KLFITYPE=2,KLFIVERB=NVERB) - CALL IO_File_open(TPGDFILE) - - ! read the grid in the PGD file - CALL IO_Field_read(TPGDFILE,'IMAX', NIMAX) - CALL IO_Field_read(TPGDFILE,'JMAX', NJMAX) - CALL IO_Field_read(TPGDFILE,'JPHEXT',IJPHEXT) - - IF ( CPGD_FILE /= CINIFILEPGD) THEN - WRITE(NLUOUT,FMT=*) ' WARNING : in PRE_IDEA1.nam, in NAM_LUNITn you& - & have CINIFILEPGD= ',CINIFILEPGD - WRITE(NLUOUT,FMT=*) ' whereas in NAM_REAL_PGD you have CPGD_FILE = '& - ,CPGD_FILE - WRITE(NLUOUT,FMT=*) ' ' - WRITE(NLUOUT,FMT=*) ' CINIFILEPGD HAS BEEN SET TO ',CPGD_FILE - CINIFILEPGD=CPGD_FILE - END IF - IF ( IJPHEXT .NE. JPHEXT ) THEN - WRITE(NLUOUT,FMT=*) ' PREP_IDEAL_CASE : JPHEXT in PRE_IDEA1.nam/NAM_CONF_PRE ( or default value )& - & JPHEXT=',JPHEXT - WRITE(NLUOUT,FMT=*) ' different from PGD files=', CINIFILEPGD,' value JPHEXT=',IJPHEXT - WRITE(NLUOUT,FMT=*) '-> JOB ABORTED' - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','') - !WRITE(NLUOUT,FMT=*) ' JPHEXT HAS BEEN SET TO ', IJPHEXT - !IJPHEXT = JPHEXT - END IF -END IF -! -NIMAX_ll=NIMAX !! _ll variables are global variables -NJMAX_ll=NJMAX !! but the old names are kept in PRE_IDEA1.nam file -! -!* 3.3 check some parameters: -! -L1D=.FALSE. ; L2D=.FALSE. -! -IF ((NIMAX == 1).OR.(NJMAX == 1)) THEN - L2D=.TRUE. - NJMAX_ll=1 - NIMAX_ll=MAX(NIMAX,NJMAX) - WRITE(NLUOUT,FMT=*) ' NJMAX HAS BEEN SET TO 1 SINCE 2D INITIAL FILE IS REQUIRED & - & (L2D=TRUE) )' -END IF -! -IF ((NIMAX == 1).AND.(NJMAX == 1)) THEN - L1D=.TRUE. - NIMAX_ll = 1 - NJMAX_ll = 1 - WRITE(NLUOUT,FMT=*) ' 1D INITIAL FILE IS REQUIRED (L1D=TRUE) ' -END IF -! -IF(.NOT. L1D) THEN - LHORELAX_UVWTH=.TRUE. - LHORELAX_RV=.TRUE. -ENDIF -! -NRIMX= MIN(JPRIMMAX,NIMAX_ll/2) -! -IF (L2D) THEN - NRIMY=0 -ELSE - NRIMY= MIN(JPRIMMAX,NJMAX_ll/2) -END IF -! -IF (L1D) THEN - NRIMX=0 - NRIMY=0 -END IF -! -IF (L1D .AND. ( LPERTURB .OR. LGEOSBAL .OR. & - (.NOT. LCARTESIAN ) .OR. (.NOT. LTHINSHELL) ))THEN - LGEOSBAL = .FALSE. - LPERTURB = .FALSE. - LCARTESIAN = .TRUE. - LTHINSHELL = .TRUE. - WRITE(NLUOUT,FMT=*) ' LGEOSBAL AND LPERTURB HAVE BEEN SET TO FALSE & - & AND LCARTESIAN AND LTHINSHELL TO TRUE & - & SINCE 1D INITIAL FILE IS REQUIRED (L1D=TRUE)' -END IF -! -IF (LGEOSBAL .AND. LSHIFT ) THEN - LSHIFT=.FALSE. - WRITE(NLUOUT,FMT=*) ' LSHIFT HAS BEEN SET TO FALSE SINCE & - & LGEOSBAL=.TRUE. IS REQUIRED ' -END IF -! -!* 3.4 compute the number of moist variables : -! -IF (.NOT.LUSERV) THEN - LUSERV = .TRUE. - WRITE(NLUOUT,FMT=*) ' LUSERV HAS BEEN RESET TO TRUE, SINCE A MOIST VARIABLE & - & IS PRESENT IN EXPRE FILE (CIDEAL = RSOU OR CSTN)' -END IF -! -IF((LUSERI .OR. LUSERC).AND. (CIDEAL /= 'RSOU')) THEN - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','use of hydrometeors is only allowed in RSOU case') -ENDIF -IF (LUSERI) THEN - LUSERC =.TRUE. - LUSERR =.TRUE. - LUSERI =.TRUE. - LUSERS =.TRUE. - LUSERG =.TRUE. - LUSERH =.FALSE. - CCLOUD='ICE3' -ELSEIF(LUSERC) THEN - LUSERR =.FALSE. - LUSERI =.FALSE. - LUSERS =.FALSE. - LUSERG =.FALSE. - LUSERH =.FALSE. - CCLOUD='REVE' -ELSE - LUSERC =.FALSE. - LUSERR =.FALSE. - LUSERI =.FALSE. - LUSERS =.FALSE. - LUSERG =.FALSE. - LUSERH =.FALSE. - LHORELAX_RC=.FALSE. - LHORELAX_RR=.FALSE. - LHORELAX_RI=.FALSE. - LHORELAX_RS=.FALSE. - LHORELAX_RG=.FALSE. - LHORELAX_RH=.FALSE. - CCLOUD='NONE' -! -END IF -! -NRR=0 -IF (LUSERV) THEN - NRR=NRR+1 - IDX_RVT = NRR -END IF -IF (LUSERC) THEN - NRR=NRR+1 - IDX_RCT = NRR -END IF -IF (LUSERR) THEN - NRR=NRR+1 - IDX_RRT = NRR -END IF -IF (LUSERI) THEN - NRR=NRR+1 - IDX_RIT = NRR -END IF -IF (LUSERS) THEN - NRR=NRR+1 - IDX_RST = NRR -END IF -IF (LUSERG) THEN - NRR=NRR+1 - IDX_RGT = NRR -END IF -IF (LUSERH) THEN - NRR=NRR+1 - IDX_RHT = NRR -END IF -! -! NRR=4 for RSOU case because RI and Rc always computed -IF (CIDEAL == 'RSOU' .AND. NRR < 4 ) NRR=4 -! -! -!* 3.5 Chemistry -! -IF (LORILAM .OR. LCH_INIT_FIELD) THEN - LUSECHEM = .TRUE. - IF (LORILAM) THEN - CORGANIC = "MPMPO" - LVARSIGI = .TRUE. - LVARSIGJ = .TRUE. - END IF -END IF -! initialise NSV_* variables -CALL INI_NSV(1) -LHORELAX_SV(:)=.FALSE. -IF(.NOT. L1D) LHORELAX_SV(1:NSV)=.TRUE. -! -!------------------------------------------------------------------------------- -! -!* 4. ALLOCATE MEMORY FOR ARRAYS : -! ---------------------------- -! -!* 4.1 Vertical Spatial grid -! -CALL READ_VER_GRID(TZEXPREFILE) -! -!* 4.2 Initialize parallel variables and compute array's dimensions -! -! -IF(LGEOSBAL) THEN - CALL SET_SPLITTING_ll('XSPLITTING') ! required for integration of thermal wind balance -ELSE - CALL SET_SPLITTING_ll('BSPLITTING') -ENDIF -CALL SET_JP_ll(1,JPHEXT,JPVEXT,JPHEXT) -CALL SET_DAD0_ll() -CALL SET_DIM_ll(NIMAX_ll, NJMAX_ll, NKMAX) -CALL IO_Pack_set(L1D,L2D,LPACK) -CALL SET_LBX_ll(CLBCX(1), 1) -CALL SET_LBY_ll(CLBCY(1), 1) -CALL SET_XRATIO_ll(1, 1) -CALL SET_YRATIO_ll(1, 1) -CALL SET_XOR_ll(1, 1) -CALL SET_XEND_ll(NIMAX_ll+2*JPHEXT, 1) -CALL SET_YOR_ll(1, 1) -CALL SET_YEND_ll(NJMAX_ll+2*JPHEXT, 1) -CALL SET_DAD_ll(0, 1) -CALL INI_PARAZ_ll(IINFO_ll) -! -! sizes of arrays of the extended sub-domain -! -CALL GET_DIM_EXT_ll('B',NIU,NJU) -CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX) -CALL GET_INDICE_ll(NIB,NJB,NIE,NJE) -CALL GET_OR_ll('B',IXOR,IYOR) -NKB=1+JPVEXT -NKU=NKMAX+2*JPVEXT -! -!* 4.3 Global variables absent from the modules : -! -ALLOCATE(XJ(NIU,NJU,NKU)) -SELECT CASE(CIDEAL) - CASE('RSOU','CSTN') - IF (LGEOSBAL) ALLOCATE(XCORIOZ(NIU,NJU,NKU)) ! exceptionally a 3D array - CASE DEFAULT ! undefined preinitialization - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CIDEAL is not correctly defined') -END SELECT -! -!* 4.4 Prognostic variables at M instant (module MODD_FIELD1): -! -ALLOCATE(XUT(NIU,NJU,NKU)) -ALLOCATE(XVT(NIU,NJU,NKU)) -ALLOCATE(XWT(NIU,NJU,NKU)) -ALLOCATE(XTHT(NIU,NJU,NKU)) -ALLOCATE(XPABST(NIU,NJU,NKU)) -ALLOCATE(XRT(NIU,NJU,NKU,NRR)) -ALLOCATE(XSVT(NIU,NJU,NKU,NSV)) -! -!* 4.5 Grid variables (module MODD_GRID1 and MODD_METRICS1): -! -ALLOCATE(XMAP(NIU,NJU)) -ALLOCATE(XLAT(NIU,NJU)) -ALLOCATE(XLON(NIU,NJU)) -ALLOCATE(XDXHAT(NIU),XDYHAT(NJU)) -IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(XZS(NIU,NJU)) -IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(ZZS_ll(NIMAX_ll)) -IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(XZSMT(NIU,NJU)) -ALLOCATE(XZZ(NIU,NJU,NKU)) -! -ALLOCATE(XDXX(NIU,NJU,NKU)) -ALLOCATE(XDYY(NIU,NJU,NKU)) -ALLOCATE(XDZX(NIU,NJU,NKU)) -ALLOCATE(XDZY(NIU,NJU,NKU)) -ALLOCATE(XDZZ(NIU,NJU,NKU)) -! -!* 4.6 Reference state variables (modules MODD_REF and MODD_REF1): -! -ALLOCATE(XRHODREFZ(NKU),XTHVREFZ(NKU)) -XTHVREFZ(:)=0.0 -IF (LCOUPLES) THEN - ! Arrays for reference state different in ocean and atmosphere - ALLOCATE(XRHODREFZO(NKU),XTHVREFZO(NKU)) - XTHVREFZO(:)=0.0 -END IF -IF(CEQNSYS == 'DUR') THEN - ALLOCATE(XRVREF(NIU,NJU,NKU)) -ELSE - ALLOCATE(XRVREF(0,0,0)) -END IF -ALLOCATE(XRHODREF(NIU,NJU,NKU),XTHVREF(NIU,NJU,NKU),XEXNREF(NIU,NJU,NKU)) -ALLOCATE(XRHODJ(NIU,NJU,NKU)) -! -!* 4.7 Larger Scale fields (modules MODD_LSFIELD1): -! -ALLOCATE(XLSUM(NIU,NJU,NKU)) -ALLOCATE(XLSVM(NIU,NJU,NKU)) -ALLOCATE(XLSWM(NIU,NJU,NKU)) -ALLOCATE(XLSTHM(NIU,NJU,NKU)) -IF ( NRR >= 1) THEN - ALLOCATE(XLSRVM(NIU,NJU,NKU)) -ELSE - ALLOCATE(XLSRVM(0,0,0)) -ENDIF -! -! allocate lateral boundary field used for coupling -! -IF ( L1D) THEN ! 1D case -! - NSIZELBX_ll=0 - NSIZELBXU_ll=0 - NSIZELBY_ll=0 - NSIZELBYV_ll=0 - NSIZELBXTKE_ll=0 - NSIZELBXR_ll=0 - NSIZELBXSV_ll=0 - NSIZELBYTKE_ll=0 - NSIZELBYR_ll=0 - NSIZELBYSV_ll=0 - ALLOCATE(XLBXUM(0,0,0)) - ALLOCATE(XLBYUM(0,0,0)) - ALLOCATE(XLBXVM(0,0,0)) - ALLOCATE(XLBYVM(0,0,0)) - ALLOCATE(XLBXWM(0,0,0)) - ALLOCATE(XLBYWM(0,0,0)) - ALLOCATE(XLBXTHM(0,0,0)) - ALLOCATE(XLBYTHM(0,0,0)) - ALLOCATE(XLBXTKEM(0,0,0)) - ALLOCATE(XLBYTKEM(0,0,0)) - ALLOCATE(XLBXRM(0,0,0,0)) - ALLOCATE(XLBYRM(0,0,0,0)) - ALLOCATE(XLBXSVM(0,0,0,0)) - ALLOCATE(XLBYSVM(0,0,0,0)) -! -ELSEIF( L2D ) THEN ! 2D case (not yet parallelized) -! - CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX, & - IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, & - IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2) - NSIZELBY_ll=0 - NSIZELBYV_ll=0 - NSIZELBYTKE_ll=0 - NSIZELBYR_ll=0 - NSIZELBYSV_ll=0 - ALLOCATE(XLBYUM(0,0,0)) - ALLOCATE(XLBYVM(0,0,0)) - ALLOCATE(XLBYWM(0,0,0)) - ALLOCATE(XLBYTHM(0,0,0)) - ALLOCATE(XLBYTKEM(0,0,0)) - ALLOCATE(XLBYRM(0,0,0,0)) - ALLOCATE(XLBYSVM(0,0,0,0)) - ! - IF ( LHORELAX_UVWTH ) THEN -!JUAN A REVOIR TODO_JPHEXT -! <<<<<<< prep_ideal_case.f90 - ! NSIZELBX_ll=2*NRIMX+2 - ! NSIZELBXU_ll=2*NRIMX+2 - ALLOCATE(XLBXUM(IISIZEXFU,NJU,NKU)) - ALLOCATE(XLBXVM(IISIZEXF,NJU,NKU)) - ALLOCATE(XLBXWM(IISIZEXF,NJU,NKU)) - ALLOCATE(XLBXTHM(IISIZEXF,NJU,NKU)) -! ======= - NSIZELBX_ll=2*NRIMX+2*JPHEXT - NSIZELBXU_ll=2*NRIMX+2*JPHEXT - ! ALLOCATE(XLBXUM(2*NRIMX+2*JPHEXT,NJU,NKU)) - ! ALLOCATE(XLBXVM(2*NRIMX+2*JPHEXT,NJU,NKU)) - ! ALLOCATE(XLBXWM(2*NRIMX+2*JPHEXT,NJU,NKU)) - ! ALLOCATE(XLBXTHM(2*NRIMX+2*JPHEXT,NJU,NKU)) -! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2 - ELSE - NSIZELBX_ll= 2*JPHEXT ! 2 - NSIZELBXU_ll=2*(JPHEXT+1) ! 4 - ALLOCATE(XLBXUM(NSIZELBXU_ll,NJU,NKU)) - ALLOCATE(XLBXVM(NSIZELBX_ll,NJU,NKU)) - ALLOCATE(XLBXWM(NSIZELBX_ll,NJU,NKU)) - ALLOCATE(XLBXTHM(NSIZELBX_ll,NJU,NKU)) - END IF - ! - IF ( NRR > 0 ) THEN - IF ( LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI & - .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH & - ) THEN -!JUAN A REVOIR TODO_JPHEXT -! <<<<<<< prep_ideal_case.f90 - ! NSIZELBXR_ll=2* NRIMX+2 - ALLOCATE(XLBXRM(IISIZEXF,NJU,NKU,NRR)) -! ======= - NSIZELBXR_ll=2*NRIMX+2*JPHEXT - ! ALLOCATE(XLBXRM(2*NRIMX+2*JPHEXT,NJU,NKU,NRR)) -! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2 - ELSE - NSIZELBXR_ll=2*JPHEXT ! 2 - ALLOCATE(XLBXRM(NSIZELBXR_ll,NJU,NKU,NRR)) - ENDIF - ELSE - NSIZELBXR_ll=0 - ALLOCATE(XLBXRM(0,0,0,0)) - END IF - ! - IF ( NSV > 0 ) THEN - IF ( ANY( LHORELAX_SV(:)) ) THEN -!JUAN A REVOIR TODO_JPHEXT -! <<<<<<< prep_ideal_case.f90 - ! NSIZELBXSV_ll=2* NRIMX+2 - ALLOCATE(XLBXSVM(IISIZEXF,NJU,NKU,NSV)) -! ======= - NSIZELBXSV_ll=2*NRIMX+2*JPHEXT - ! ALLOCATE(XLBXSVM(2*NRIMX+2*JPHEXT,NJU,NKU,NSV)) -! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2 - ELSE - NSIZELBXSV_ll=2*JPHEXT ! 2 - ALLOCATE(XLBXSVM(NSIZELBXSV_ll,NJU,NKU,NSV)) - END IF - ELSE - NSIZELBXSV_ll=0 - ALLOCATE(XLBXSVM(0,0,0,0)) - END IF -! -ELSE ! 3D case -! - CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX, & - IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, & - IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2) - CALL GET_SIZEY_LB(NIMAX_ll,NJMAX_ll,NRIMY, & - IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV, & - IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2) -! - IF ( LHORELAX_UVWTH ) THEN - NSIZELBX_ll=2*NRIMX+2*JPHEXT - NSIZELBXU_ll=2*NRIMX+2*JPHEXT - NSIZELBY_ll=2*NRIMY+2*JPHEXT - NSIZELBYV_ll=2*NRIMY+2*JPHEXT - ALLOCATE(XLBXUM(IISIZEXFU,IJSIZEXFU,NKU)) - ALLOCATE(XLBYUM(IISIZEYF,IJSIZEYF,NKU)) - ALLOCATE(XLBXVM(IISIZEXF,IJSIZEXF,NKU)) - ALLOCATE(XLBYVM(IISIZEYFV,IJSIZEYFV,NKU)) - ALLOCATE(XLBXWM(IISIZEXF,IJSIZEXF,NKU)) - ALLOCATE(XLBYWM(IISIZEYF,IJSIZEYF,NKU)) - ALLOCATE(XLBXTHM(IISIZEXF,IJSIZEXF,NKU)) - ALLOCATE(XLBYTHM(IISIZEYF,IJSIZEYF,NKU)) - ELSE - NSIZELBX_ll=2*JPHEXT ! 2 - NSIZELBXU_ll=2*(JPHEXT+1) ! 4 - NSIZELBY_ll=2*JPHEXT ! 2 - NSIZELBYV_ll=2*(JPHEXT+1) ! 4 - ALLOCATE(XLBXUM(IISIZEX4,IJSIZEX4,NKU)) - ALLOCATE(XLBYUM(IISIZEY2,IJSIZEY2,NKU)) - ALLOCATE(XLBXVM(IISIZEX2,IJSIZEX2,NKU)) - ALLOCATE(XLBYVM(IISIZEY4,IJSIZEY4,NKU)) - ALLOCATE(XLBXWM(IISIZEX2,IJSIZEX2,NKU)) - ALLOCATE(XLBYWM(IISIZEY2,IJSIZEY2,NKU)) - ALLOCATE(XLBXTHM(IISIZEX2,IJSIZEX2,NKU)) - ALLOCATE(XLBYTHM(IISIZEY2,IJSIZEY2,NKU)) - END IF - ! - IF ( NRR > 0 ) THEN - IF ( LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI & - .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH & - ) THEN - NSIZELBXR_ll=2*NRIMX+2*JPHEXT - NSIZELBYR_ll=2*NRIMY+2*JPHEXT - ALLOCATE(XLBXRM(IISIZEXF,IJSIZEXF,NKU,NRR)) - ALLOCATE(XLBYRM(IISIZEYF,IJSIZEYF,NKU,NRR)) - ELSE - NSIZELBXR_ll=2*JPHEXT ! 2 - NSIZELBYR_ll=2*JPHEXT ! 2 - ALLOCATE(XLBXRM(IISIZEX2,IJSIZEX2,NKU,NRR)) - ALLOCATE(XLBYRM(IISIZEY2,IJSIZEY2,NKU,NRR)) - ENDIF - ELSE - NSIZELBXR_ll=0 - NSIZELBYR_ll=0 - ALLOCATE(XLBXRM(0,0,0,0)) - ALLOCATE(XLBYRM(0,0,0,0)) - END IF - ! - IF ( NSV > 0 ) THEN - IF ( ANY( LHORELAX_SV(:)) ) THEN - NSIZELBXSV_ll=2*NRIMX+2*JPHEXT - NSIZELBYSV_ll=2*NRIMY+2*JPHEXT - ALLOCATE(XLBXSVM(IISIZEXF,IJSIZEXF,NKU,NSV)) - ALLOCATE(XLBYSVM(IISIZEYF,IJSIZEYF,NKU,NSV)) - ELSE - NSIZELBXSV_ll=2*JPHEXT ! 2 - NSIZELBYSV_ll=2*JPHEXT ! 2 - ALLOCATE(XLBXSVM(IISIZEX2,IJSIZEX2,NKU,NSV)) - ALLOCATE(XLBYSVM(IISIZEY2,IJSIZEY2,NKU,NSV)) - END IF - ELSE - NSIZELBXSV_ll=0 - NSIZELBYSV_ll=0 - ALLOCATE(XLBXSVM(0,0,0,0)) - ALLOCATE(XLBYSVM(0,0,0,0)) - END IF -END IF -! -! -!------------------------------------------------------------------------------- -! -!* 5. INITIALIZE ALL THE MODEL VARIABLES -! ---------------------------------- -! -! -!* 5.1 Grid variables and RS localization: -! -!* 5.1.1 Horizontal Spatial grid : -! -IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN -!-------------------------------------------------------- -! the MESONH horizontal grid will be read in the PGD_FILE -!-------------------------------------------------------- - CALL READ_HGRID(1,TPGDFILE,YPGD_NAME,YPGD_DAD_NAME,YPGD_TYPE) -! control the cartesian option - IF( LCARTESIAN ) THEN - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE : IN GENERAL, THE USE OF A PGD_FILE & - & IMPLIES THAT YOU MUST TAKE INTO ACCOUNT THE EARTH SPHERICITY' - WRITE(NLUOUT,FMT=*) 'NEVERTHELESS, LCARTESIAN HAS BEEN KEPT TO TRUE' - END IF -! -!* use of the externalized surface -! - CSURF = "EXTE" -! -! determine whether the model is flat or no -! - ZZS_MAX = ABS( MAXVAL(XZS(NIB:NIU-JPHEXT,NJB:NJU-JPHEXT))) - CALL MPI_ALLREDUCE(ZZS_MAX, ZZS_MAX_ll, 1, MNHREAL_MPI, MPI_MAX, & - NMNH_COMM_WORLD,IINFO_ll) - IF( ABS(ZZS_MAX_ll) < 1.E-10 ) THEN - LFLAT=.TRUE. - ELSE - LFLAT=.FALSE. - END IF -! - -ELSE -!------------------------------------------------------------------------ -! the MESONH horizontal grid is built from the PRE_IDEA1.nam informations -!------------------------------------------------------------------------ -! - ALLOCATE( XXHAT(NIU), XYHAT(NJU) ) - ALLOCATE( XXHATM(NIU), XYHATM(NJU) ) -! -! define the grid localization at the earth surface by the central point -! coordinates -! - IF (XLONCEN/=XUNDEF .OR. XLATCEN/=XUNDEF) THEN - IF (XLONCEN/=XUNDEF .AND. XLATCEN/=XUNDEF) THEN -! -! it should be noted that XLATCEN and XLONCEN refer to a vertical -! vorticity point and (XLATORI, XLONORI) refer to the mass point of -! conformal coordinates (0,0). This is to allow the centering of the model in -! a non-cyclic configuration regarding to XLATCEN or XLONCEN. -! - CALL SM_LATLON(XLATCEN,XLONCEN, & - -XDELTAX*(NIMAX_ll/2-0.5+JPHEXT), & - -XDELTAY*(NJMAX_ll/2-0.5+JPHEXT), & - XLATORI,XLONORI) -! - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE : XLATORI=' , XLATORI, & - ' XLONORI= ', XLONORI - ELSE - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE',& - 'latitude and longitude of the center point must be initialized alltogether or not') - END IF - END IF -! - IF (NPROC > 1) THEN - CALL GET_DIM_EXT_ll('B',IXDIM,IYDIM) - IBEG = IXOR-JPHEXT-1 - IEND = IBEG+IXDIM-1 - XXHAT(:) = (/ (REAL(JLOOP)*XDELTAX, JLOOP=IBEG,IEND) /) - IBEG = IYOR-JPHEXT-1 - IEND = IBEG+IYDIM-1 - XYHAT(:) = (/ (REAL(JLOOP)*XDELTAY, JLOOP=IBEG,IEND) /) -! - ELSE - XXHAT(:) = (/ (REAL(JLOOP-NIB)*XDELTAX, JLOOP=1,NIU) /) - XYHAT(:) = (/ (REAL(JLOOP-NJB)*XDELTAY, JLOOP=1,NJU) /) - END IF - - ! Interpolations of positions to mass points - CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM ) - - ! Collect global domain boundaries - CALL STORE_GLOB_HORGRID( XXHAT, XYHAT, XXHATM, XYHATM, XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, XHAT_BOUND, XHATM_BOUND ) - -END IF -! -!* 5.1.2 Orography and Gal-Chen Sommerville transformation : -! -IF ( LEN_TRIM(CPGD_FILE) == 0 .OR. .NOT. LREAD_ZS) THEN - SELECT CASE(CZS) ! 'FLAT' or 'SINE' or 'BELL' - CASE('FLAT') - LFLAT = .TRUE. - IF (XHMAX==XUNDEF) THEN - XZS(:,:) = 0. - ELSE - XZS(:,:) = XHMAX - END IF - CASE('SINE') ! sinus-shaped orography - IF (XHMAX==XUNDEF) XHMAX=300. - LFLAT =.FALSE. - XZS(:,:) = XHMAX & ! three-dimensional case - *SPREAD((/((SIN((XPI/(NIMAX_ll+2*JPHEXT-1))*JLOOP)**2)**NEXPX,JLOOP=IXOR-1,IXOR+NIU-2)/),2,NJU) & - *SPREAD((/((SIN((XPI/(NJMAX_ll+2*JPHEXT-1))*JLOOP)**2)**NEXPY,JLOOP=IYOR-1,IYOR+NJU-2)/),1,NIU) - IF(L1D) THEN ! one-dimensional case - XZS(:,:) = XHMAX - END IF - CASE('BELL') ! bell-shaped orography - IF (XHMAX==XUNDEF) XHMAX=300. - LFLAT = .FALSE. - IF(.NOT.L2D) THEN ! three-dimensional case - XZS(:,:) = XHMAX / ( 1. & - + ( (SPREAD(XXHAT(1:NIU),2,NJU) - REAL(NIZS) * XDELTAX) /XAX ) **2 & - + ( (SPREAD(XYHAT(1:NJU),1,NIU) - REAL(NJZS) * XDELTAY) /XAY ) **2 ) **1.5 - ELSE ! two-dimensional case - XZS(:,:) = XHMAX / ( 1. & - + ( (SPREAD(XXHAT(1:NIU),2,NJU) - REAL(NIZS) * XDELTAX) /XAX ) **2 ) - ENDIF - IF(L1D) THEN ! one-dimensional case - XZS(:,:) = XHMAX - END IF - CASE('COSI') ! (1+cosine)**4 shape - IF (XHMAX==XUNDEF) XHMAX=800. - LFLAT = .FALSE. - IF(L2D) THEN ! two-dimensional case - DO JILOOP = 1, NIU - ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX - IF( ABS(ZDIST)<(4.0*XAX) ) THEN - XZS(JILOOP,:) = (XHMAX/16.0)*( 1.0 + COS((XPI*ZDIST)/(4.0*XAX)) )**4 - ELSE - XZS(JILOOP,:) = 0.0 - ENDIF - END DO - ENDIF - CASE('SCHA') ! exp(-(x/a)**2)*cosine(pi*x/lambda)**2 shape - IF (XHMAX==XUNDEF) XHMAX=800. - LFLAT = .FALSE. - IF(L2D) THEN ! two-dimensional case - DO JILOOP = 1, NIU - ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX - IF( ABS(ZDIST)<(4.0*XAX) ) THEN - XZS(JILOOP,:) = XHMAX*EXP(-(ZDIST/XAY)**2)*COS((XPI*ZDIST)/XAX)**2 - ELSE - XZS(JILOOP,:) = 0.0 - ENDIF - END DO - ENDIF - CASE('AGNE') ! h*a**2/(x**2+a**2) shape - LFLAT = .FALSE. - IF(L2D) THEN ! two-dimensional case - DO JILOOP = 1, NIU - ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX - XZS(JILOOP,:) = XHMAX*(XAX**2)/(XAX**2+ZDIST**2) - END DO - ELSE ! three dimensionnal case - infinite profile in y direction - DO JILOOP = 1, NIU - ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX - XZS(JILOOP,:) = XHMAX*(XAX**2)/(XAX**2+ZDIST**2) - END DO - ENDIF - - CASE('DATA') ! discretized orography - LFLAT =.FALSE. - WRITE(NLUOUT,FMT=*) 'CZS="DATA", ATTEMPT TO READ ARRAY & - &XZS(NIB:NIU-JPHEXT:1,NJU-JPHEXT:NJB:-1) & - &starting from the first index' - CALL POSKEY(NLUPRE,NLUOUT,'ZSDATA') - DO JJLOOP = NJMAX_ll+2*JPHEXT-1,JPHEXT+1,-1 ! input like a map prior the sounding - READ(NLUPRE,FMT=*) ZZS_ll - IF ( ( JJLOOP <= ( NJU-JPHEXT + IYOR-1 ) ) .AND. ( JJLOOP >= ( NJB + IYOR-1 ) ) ) THEN - IJ = JJLOOP - ( IYOR-1 ) - XZS(NIB:NIU-JPHEXT,IJ) = ZZS_ll(IXOR:IXOR + NIU-JPHEXT - NIB ) - END IF - END DO -! - CASE DEFAULT ! undefined shape of orography - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','erroneous ground type') - END SELECT -! - CALL ADD2DFIELD_ll( TZ_FIELDS_ll, XZS, 'PREP_IDEAL_CASE::XZS' ) - CALL UPDATE_HALO_ll(TZ_FIELDS_ll,IINFO_ll) - CALL CLEANLIST_ll(TZ_FIELDS_ll) -! -END IF -! -!IF( ( LEN_TRIM(CPGD_FILE) /= 0 ) .AND. .NOT.LFLAT .AND. & -! ((CLBCX(1) /= "OPEN" ) .OR. & -! (CLBCX(2) /= "OPEN" ) .OR. (CLBCY(1) /= "OPEN" ) .OR. & -! (CLBCY(2) /= "OPEN" )) ) THEN -! !callabortstop -! CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','with a PGD file, you cannot be in a cyclic LBC') -!END IF -! -IF (LWEST_ll()) THEN - DO JILOOP = 1,JPHEXT - XZS(JILOOP,:) = XZS(NIB,:) - END DO -END IF -IF (LEAST_ll()) THEN - DO JILOOP = NIU-JPHEXT+1,NIU - XZS(JILOOP,:)=XZS(NIU-JPHEXT,:) - END DO -END IF -IF (LSOUTH_ll()) THEN - DO JJLOOP = 1,JPHEXT - XZS(:,JJLOOP)=XZS(:,NJB) - END DO -END IF -IF (LNORTH_ll()) THEN - DO JJLOOP =NJU-JPHEXT+1,NJU - XZS(:,JJLOOP)=XZS(:,NJU-JPHEXT) - END DO -END IF -! -IF ( LEN_TRIM(CPGD_FILE) == 0 .OR. .NOT. LREAD_ZS) THEN - IF (LSLEVE) THEN - CALL ZSMT_PIC(NSLEVE,XSMOOTH_ZS) - ELSE - XZSMT(:,:) = 0. - END IF -END IF -! -IF (LCARTESIAN) THEN - CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,XJ) - XMAP=1. -ELSE - CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS, & - LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, & - XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, XJ ) -END IF -!* 5.4.1 metrics coefficients and update halos: -! -CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -!* 5.1.3 Compute the localization in index space of the vertical profile -! in CSTN and RSOU cases : -! -IF (CTYPELOC =='LATLON' ) THEN - IF (.NOT.LCARTESIAN) THEN ! compute (x,y) if - CALL SM_XYHAT(XLATORI,XLONORI, & ! the localization - XLATLOC,XLONLOC,XXHATLOC,XYHATLOC) ! is given in latitude - ELSE ! and longitude - WRITE(NLUOUT,FMT=*) 'CTYPELOC CANNOT BE LATLON IN CARTESIAN GEOMETRY' - WRITE(NLUOUT,FMT=*) '-> JOB ABORTED' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CTYPELOC cannot be LATLON in cartesian geometry') - END IF -END IF -! -IF (CTYPELOC /= 'IJGRID') THEN - NILOC = MINLOC(ABS(XXHATLOC-XXHAT_ll(:))) - NJLOC = MINLOC(ABS(XYHATLOC-XYHAT_ll(:))) -END IF -! -IF ( L1D .AND. ( NILOC(1) /= 1 .OR. NJLOC(1) /= 1 ) ) THEN - NILOC = 1 - NJLOC = 1 - WRITE(NLUOUT,FMT=*) 'FOR 1D CONFIGURATION, THE RS INFORMATIONS ARE TAKEN AT & - & I=1 AND J=1 (CENTRAL VERTICAL WITHOUT HALO)' -END IF -! -IF ( L2D .AND. ( NJLOC(1) /= 1 ) ) THEN - NJLOC = 1 - WRITE(NLUOUT,FMT=*) 'FOR 2D CONFIGURATION, THE RS INFORMATIONS ARE TAKEN AT & - & J=1 (CENTRAL PLANE WITHOUT HALO)' -END IF -! -!* 5.2 Prognostic variables (not multiplied by rhoJ) : u,v,w,theta,r -! and 1D anelastic reference state -! -! -!* 5.2.1 Use a Radiosounding : CIDEAL='RSOU'' -! -IF (CIDEAL == 'RSOU') THEN - WRITE(NLUOUT,FMT=*) 'CIDEAL="RSOU", attempt to read DATE' - CALL POSKEY(NLUPRE,NLUOUT,'RSOU') - READ(NLUPRE,FMT=*) NYEAR,NMONTH,NDAY,XTIME - TDTCUR = DATE_TIME(NYEAR,NMONTH,NDAY,XTIME) - TDTEXP = TDTCUR - TDTSEG = TDTCUR - TDTMOD = TDTCUR - WRITE(NLUOUT,FMT=*) 'CIDEAL="RSOU", ATTEMPT TO PROCESS THE SOUNDING DATA' - IF (LGEOSBAL) THEN - CALL SET_RSOU(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, & - XJ,LSHIFT,XCORIOZ) - ELSE - CALL SET_RSOU(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, & - XJ,LSHIFT) - END IF -! -!* 5.2.2 N=cste and U(z) : CIDEAL='CSTN' -! -ELSE IF (CIDEAL == 'CSTN') THEN - WRITE(NLUOUT,FMT=*) 'CIDEAL="CSTN", attempt to read DATE' - CALL POSKEY(NLUPRE,NLUOUT,'CSTN') - READ(NLUPRE,FMT=*) NYEAR,NMONTH,NDAY,XTIME - TDTCUR = DATE_TIME(NYEAR,NMONTH,NDAY,XTIME) - TDTEXP = TDTCUR - TDTSEG = TDTCUR - TDTMOD = TDTCUR - WRITE(NLUOUT,FMT=*) 'CIDEAL="CSTN", ATTEMPT TO PROCESS THE SOUNDING DATA' - IF (LGEOSBAL) THEN - CALL SET_CSTN(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, & - XJ,LSHIFT,XCORIOZ) - ELSE - CALL SET_CSTN(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, & - XJ,LSHIFT) - END IF -! -END IF -! -!* 5.3 Forcing variables -! -IF (LFORCING) THEN - WRITE(NLUOUT,FMT=*) 'FORCING IS ENABLED, ATTEMPT TO SET FORCING FIELDS' - CALL POSKEY(NLUPRE,NLUOUT,'ZFRC ','PFRC') - CALL SET_FRC(TZEXPREFILE) -END IF -! -!! --------------------------------------------------------------------- -! Modif PP ADV FRC -! 5.4.2 initialize profiles for adv forcings -IF (L2D_ADV_FRC) THEN - WRITE(NLUOUT,FMT=*) 'L2D_ADV_FRC IS SET TO TRUE' - WRITE(NLUOUT,FMT=*) 'ADVECTING FORCING USED IS USER MADE, NOT STANDARD ONE ' - WRITE(NLUOUT,FMT=*) 'IT IS FOR 2D IDEALIZED WAM STUDY ONLY ' - CALL POSKEY(NLUPRE,NLUOUT,'ZFRC_ADV') - CALL SET_ADVFRC(TZEXPREFILE) -ENDIF -IF (L2D_REL_FRC) THEN - WRITE(NLUOUT,FMT=*) 'L2D_REL_FRC IS SET TO TRUE' - WRITE(NLUOUT,FMT=*) 'RELAXATION FORCING USED IS USER MADE, NOT STANDARD ONE ' - WRITE(NLUOUT,FMT=*) 'IT IS FOR 2D IDEALIZED WAM STUDY ONLY ' - CALL POSKEY(NLUPRE,NLUOUT,'ZFRC_REL') - CALL SET_RELFRC(TZEXPREFILE) -ENDIF -!* 5.4 3D Reference state variables : -! -! -!* 5.4.1 metrics coefficients and update halos: -! -CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -!* 5.4.2 3D reference state : -! -CALL SET_REF( 0, TFILE_DUMMY, & - XZZ, XZHATM, XJ, XDXX, XDYY, CLBCX, CLBCY, & - XREFMASS, XMASS_O_PHI0, XLINMASS, & - XRHODREF, XTHVREF, XRVREF, XEXNREF, XRHODJ ) -! -! -!* 5.5.1 Absolute pressure : -! -! -!* 5.5.2 Total mass of dry air Md computation : -! -CALL TOTAL_DMASS(XJ,XRHODREF,XDRYMASST) -! -! -!* 5.6 Complete prognostic variables (multipliy by rhoJ) at time t : -! -! U grid : gridpoint 2 -IF (LWEST_ll()) XUT(1,:,:) = 2.*XUT(2,:,:) - XUT(3,:,:) -! V grid : gridpoint 3 -IF (LSOUTH_ll()) XVT(:,1,:) = 2.*XVT(:,2,:) - XVT(:,3,:) -! SV : gridpoint 1 -XSVT(:,:,:,:) = 0. -! -! -!* 5.7 Larger scale fields initialization : -! -XLSUM(:,:,:) = XUT(:,:,:) ! these fields do not satisfy the -XLSVM(:,:,:) = XVT(:,:,:) ! lower boundary condition but are -XLSWM(:,:,:) = XWT(:,:,:) ! in equilibrium -XLSTHM(:,:,:)= XTHT(:,:,:) -XLSRVM(:,:,:)= XRT(:,:,:,1) -! -! enforce the vertical homogeneity under the ground and above the top of -! the model for the LS fields -! -XLSUM(:,:,NKB-1)=XLSUM(:,:,NKB) -XLSUM(:,:,NKU)=XLSUM(:,:,NKU-1) -XLSVM(:,:,NKB-1)=XLSVM(:,:,NKB) -XLSVM(:,:,NKU)=XLSVM(:,:,NKU-1) -XLSWM(:,:,NKB-1)=XLSWM(:,:,NKB) -XLSWM(:,:,NKU)=XLSWM(:,:,NKU-1) -XLSTHM(:,:,NKB-1)=XLSTHM(:,:,NKB) -XLSTHM(:,:,NKU)=XLSTHM(:,:,NKU-1) -IF ( NRR > 0 ) THEN - XLSRVM(:,:,NKB-1)=XLSRVM(:,:,NKB) - XLSRVM(:,:,NKU)=XLSRVM(:,:,NKU-1) -END IF -! -ILBX=SIZE(XLBXUM,1) -ILBY=SIZE(XLBYUM,2) -IF(LWEST_ll() .AND. .NOT. L1D) THEN - XLBXUM(1:NRIMX+JPHEXT, :,:) = XUT(2:NRIMX+JPHEXT+1, :,:) - XLBXVM(1:NRIMX+JPHEXT, :,:) = XVT(1:NRIMX+JPHEXT, :,:) - XLBXWM(1:NRIMX+JPHEXT, :,:) = XWT(1:NRIMX+JPHEXT, :,:) - XLBXTHM(1:NRIMX+JPHEXT, :,:) = XTHT(1:NRIMX+JPHEXT, :,:) - XLBXRM(1:NRIMX+JPHEXT, :,:,:) = XRT(1:NRIMX+JPHEXT, :,:,:) -ENDIF -IF(LEAST_ll() .AND. .NOT. L1D) THEN - XLBXUM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:) = XUT(NIU-NRIMX-JPHEXT+1:NIU, :,:) - XLBXVM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:) = XVT(NIU-NRIMX-JPHEXT+1:NIU, :,:) - XLBXWM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:) = XWT(NIU-NRIMX-JPHEXT+1:NIU, :,:) - XLBXTHM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:) = XTHT(NIU-NRIMX-JPHEXT+1:NIU, :,:) - XLBXRM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:,:) = XRT(NIU-NRIMX-JPHEXT+1:NIU, :,:,:) -ENDIF -IF(LSOUTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) THEN - XLBYUM(:,1:NRIMY+JPHEXT, :) = XUT(:,1:NRIMY+JPHEXT, :) - XLBYVM(:,1:NRIMY+JPHEXT, :) = XVT(:,2:NRIMY+JPHEXT+1, :) - XLBYWM(:,1:NRIMY+JPHEXT, :) = XWT(:,1:NRIMY+JPHEXT, :) - XLBYTHM(:,1:NRIMY+JPHEXT, :) = XTHT(:,1:NRIMY+JPHEXT, :) - XLBYRM(:,1:NRIMY+JPHEXT, :,:) = XRT(:,1:NRIMY+JPHEXT, :,:) -ENDIF -IF(LNORTH_ll().AND. .NOT. L1D .AND. .NOT. L2D) THEN - XLBYUM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:) = XUT(:,NJU-NRIMY-JPHEXT+1:NJU, :) - XLBYVM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:) = XVT(:,NJU-NRIMY-JPHEXT+1:NJU, :) - XLBYWM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:) = XWT(:,NJU-NRIMY-JPHEXT+1:NJU, :) - XLBYTHM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:) = XTHT(:,NJU-NRIMY-JPHEXT+1:NJU, :) - XLBYRM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:,:) = XRT(:,NJU-NRIMY-JPHEXT+1:NJU, :,:) -ENDIF -DO JSV = 1, NSV - IF(LWEST_ll() .AND. .NOT. L1D) & - XLBXSVM(1:NRIMX+JPHEXT, :,:,JSV) = XSVT(1:NRIMX+JPHEXT, :,:,JSV) - IF(LEAST_ll() .AND. .NOT. L1D) & - XLBXSVM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:,JSV) = XSVT(NIU-NRIMX-JPHEXT+1:NIU, :,:,JSV) - IF(LSOUTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) & - XLBYSVM(:,1:NRIMY+JPHEXT, :,JSV) = XSVT(:,1:NRIMY+JPHEXT, :,JSV) - IF(LNORTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) & - XLBYSVM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:,JSV) = XSVT(:,NJU-NRIMY-JPHEXT+1:NJU, :,JSV) -END DO -! -! -!* 5.8 Add a perturbation to a basic state : -! -IF(LPERTURB) CALL SET_PERTURB(TZEXPREFILE) -! -! -!* 5.9 Anelastic correction and pressure: -! -IF (.NOT.LOCEAN) THEN - CALL ICE_ADJUST_BIS(XPABST,XTHT,XRT) - IF ( .NOT. L1D ) CALL PRESSURE_IN_PREP(XDXX,XDYY,XDZX,XDZY,XDZZ) - CALL ICE_ADJUST_BIS(XPABST,XTHT,XRT) -END IF -! -! -!* 5.10 Compute THETA, vapor and cloud mixing ratio -! -IF (CIDEAL == 'RSOU') THEN - ALLOCATE(ZEXN(NIU,NJU,NKU)) - ALLOCATE(ZT(NIU,NJU,NKU)) - ALLOCATE(ZTHL(NIU,NJU,NKU)) - ALLOCATE(ZRT(NIU,NJU,NKU)) - ALLOCATE(ZCPH(NIU,NJU,NKU)) - ALLOCATE(ZLVOCPEXN(NIU,NJU,NKU)) - ALLOCATE(ZLSOCPEXN(NIU,NJU,NKU)) - ALLOCATE(ZFRAC_ICE(NIU,NJU,NKU)) - ALLOCATE(ZRSATW(NIU,NJU,NKU)) - ALLOCATE(ZRSATI(NIU,NJU,NKU)) - ALLOCATE(ZBUF(NIU,NJU,NKU,16)) - ZRT=XRT(:,:,:,1)+XRT(:,:,:,2)+XRT(:,:,:,4) -IF (LOCEAN) THEN - ZEXN(:,:,:)= 1. - ZT=XTHT - ZTHL=XTHT - ZCPH=XCPD+ XCPV * XRT(:,:,:,1) - ZLVOCPEXN = XLVTT - ZLSOCPEXN = XLSTT -ELSE - ZEXN=(XPABST/XP00) ** (XRD/XCPD) - ZT=XTHT*(XPABST/XP00)**(XRD/XCPD) - ZCPH=XCPD+ XCPV * XRT(:,:,:,1)+ XCL *XRT(:,:,:,2) + XCI * XRT(:,:,:,4) - ZLVOCPEXN = (XLVTT + (XCPV-XCL) * (ZT-XTT))/(ZCPH*ZEXN) - ZLSOCPEXN = (XLSTT + (XCPV-XCI) * (ZT-XTT))/(ZCPH*ZEXN) - ZTHL=XTHT-ZLVOCPEXN*XRT(:,:,:,2)-ZLSOCPEXN*XRT(:,:,:,4) - CALL TH_R_FROM_THL_RT(CST, NEBN, SIZE(ZFRAC_ICE), 'T',ZFRAC_ICE,XPABST,ZTHL,ZRT,XTHT,XRT(:,:,:,1), & - XRT(:,:,:,2),XRT(:,:,:,4),ZRSATW, ZRSATI,OOCEAN=.FALSE.,& - PBUF=ZBUF) -END IF - DEALLOCATE(ZEXN) - DEALLOCATE(ZT) - DEALLOCATE(ZCPH) - DEALLOCATE(ZLVOCPEXN) - DEALLOCATE(ZLSOCPEXN) - DEALLOCATE(ZTHL) - DEALLOCATE(ZRT) - DEALLOCATE(ZBUF) -! Coherence test - IF ((.NOT. LUSERI) ) THEN - IF (MAXVAL(XRT(:,:,:,4))/= 0) THEN - WRITE(NLUOUT,FMT=*) "*********************************" - WRITE(NLUOUT,FMT=*) 'WARNING' - WRITE(NLUOUT,FMT=*) 'YOU HAVE LUSERI=FALSE ' - WRITE(NLUOUT,FMT=*) ' BUT WITH YOUR RADIOSOUNDING Ri/=0' - WRITE(NLUOUT,FMT=*) MINVAL(XRT(:,:,:,4)),MAXVAL(XRT(:,:,:,4)) - WRITE(NLUOUT,FMT=*) "*********************************" - ENDIF - ENDIF - IF ((.NOT. LUSERC)) THEN - IF (MAXVAL(XRT(:,:,:,2))/= 0) THEN - WRITE(NLUOUT,FMT=*) "*********************************" - WRITE(NLUOUT,FMT=*) 'WARNING' - WRITE(NLUOUT,FMT=*) 'YOU HAVE LUSERC=FALSE ' - WRITE(NLUOUT,FMT=*) 'BUT WITH YOUR RADIOSOUNDING RC/=0' - WRITE(NLUOUT,FMT=*) MINVAL(XRT(:,:,:,2)),MAXVAL(XRT(:,:,:,2)) - WRITE(NLUOUT,FMT=*) "*********************************" - ENDIF - ENDIF - ! on remet les bonnes valeurs pour NRR - IF(CCLOUD=='NONE') NRR=1 - IF(CCLOUD=='REVE') NRR=2 -END IF -! -!------------------------------------------------------------------------------- -! -!* 6. INITIALIZE SCALAR VARIABLES FOR CHEMISTRY -! ----------------------------------------- -! -! before calling chemistry -CCONF = 'START' -CSTORAGE_TYPE='TT' -CALL IO_File_close(TZEXPREFILE) ! Close the EXPRE file -! -IF ( LCH_INIT_FIELD ) CALL CH_INIT_FIELD_n(1, NLUOUT, NVERB) -! -! Initialization LIMA variables by ORILAM -IF (CCLOUD == 'LIMA' .AND. ((LORILAM).OR.(LDUST).OR.(LSALT))) & - CALL AER2LIMA(XSVT, XRHODREF, XRT(:,:,:,1), XPABST, XTHT, XZZ) -!------------------------------------------------------------------------------- -! -!* 7. INITIALIZE LEVELSET FOR IBM -! --------------------------- -! -IF (LIBM_LSF) THEN - ! - ! In their current state, the IBM can only be used in - ! combination with cartesian coordinates and flat orography. - ! - IF ((CZS.NE."FLAT").OR.(.NOT.LCARTESIAN)) THEN - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','IBM can only be used with flat ground') - ENDIF - ! - ALLOCATE(XIBM_LS(NIU,NJU,NKU,4)) - ! - CALL IBM_INIT_LS(XIBM_LS) - ! -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 8. WRITE THE FMFILE -! ---------------- -! -CALL SECOND_MNH2(ZTIME1) -! -NNPRAR = 22 + 2*(NRR+NSV) & ! 22 = number of grid variables + reference - + 8 + 17 ! state variables + dimension variables - ! 2*(8+NRR+NSV) + 1 = number of prognostic - ! variables at time t and t-dt -NTYPE=1 -! -CALL IO_File_add2list(TINIFILE,TRIM(CINIFILE),'MNH','WRITE',KLFINPRAR=NNPRAR,KLFITYPE=NTYPE,KLFIVERB=NVERB) -! -CALL IO_File_open(TINIFILE) -! -CALL IO_Header_write(TINIFILE) -! -CALL WRITE_DESFM_n(1,TINIFILE) -! -CALL WRITE_LFIFM_n(TINIFILE,'') ! There is no DAD model for PREP_IDEAL_CASE -! -CALL SECOND_MNH2(ZTIME2) -! -XT_STORE = XT_STORE + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 9. EXTERNALIZED SURFACE -! -------------------- -! -! -IF (CSURF =='EXTE') THEN - IF (LEN_TRIM(CINIFILEPGD)==0) THEN - IF (LEN_TRIM(CPGD_FILE)/=0) THEN - CINIFILEPGD=CPGD_FILE - ELSE - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CINIFILEPGD needed in NAM_LUNITn') - ENDIF - ENDIF - CALL SURFEX_ALLOC_LIST(1) - YSURF_CUR => YSURF_LIST(1) - CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.) - ! Switch to model 1 surface variables - CALL GOTO_SURFEX(1) - !* definition of physiographic fields - ! computed ... - IF (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM) THEN - TPGDFILE => TINIFILE - CALL PGD_GRID_SURF_ATM(YSURF_CUR%UG, YSURF_CUR%U,YSURF_CUR%GCP,'MESONH',TINIFILE%CNAME,'MESONH',.TRUE.,HDIR='-') - CALL PGD_SURF_ATM (YSURF_CUR,'MESONH',TINIFILE%CNAME,'MESONH',.TRUE.) - CALL IO_File_add2list(TINIFILEPGD,TRIM(CINIFILEPGD),'PGD','WRITE',KLFINPRAR=NNPRAR,KLFITYPE=NTYPE,KLFIVERB=NVERB) - CALL IO_File_open (TINIFILEPGD) - TPGDFILE => TINIFILEPGD - ELSE - ! ... or read from file. - CALL INIT_PGD_SURF_ATM( YSURF_CUR, 'MESONH', 'PGD', & - ' ', ' ', & - TDTCUR%nyear, TDTCUR%nmonth, & - TDTCUR%nday, TDTCUR%xtime ) -! - END IF - ! - !* forces orography from atmospheric file - IF (.NOT. LREAD_ZS) CALL MNHPUT_ZS_n - ! - ! on ecrit un nouveau fichier PGD que s'il n'existe pas - IF (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM) THEN - !* writing of physiographic fields in the file - CSTORAGE_TYPE='PG' - ! - CALL IO_Header_write(TINIFILEPGD) - CALL IO_Field_write(TINIFILEPGD,'JPHEXT', JPHEXT) - CALL IO_Field_write(TINIFILEPGD,'SURF','EXTE') - CALL IO_Field_write(TINIFILEPGD,'L1D', L1D) - CALL IO_Field_write(TINIFILEPGD,'L2D', L2D) - CALL IO_Field_write(TINIFILEPGD,'PACK',LPACK) - CALL WRITE_HGRID(1,TINIFILEPGD) - ! - TOUTDATAFILE => TINIFILEPGD - ! - TFILE_SURFEX => TINIFILEPGD - ALLOCATE(YSURF_CUR%DUO%CSELECT(0)) - CALL WRITE_PGD_SURF_ATM_n(YSURF_CUR,'MESONH') - NULLIFY(TFILE_SURFEX) - CSTORAGE_TYPE='TT' - ENDIF - ! - ! - !* rereading of physiographic fields and definition of prognostic fields - !* writing of all surface fields - TOUTDATAFILE => TINIFILE - TFILE_SURFEX => TINIFILE - CALL PREP_SURF_MNH(' ',' ') - NULLIFY(TFILE_SURFEX) -ELSE - CSURF = "NONE" -END IF -! -!------------------------------------------------------------------------------- -! -!* 10. CLOSES THE FILE -! --------------- -! -IF (CSURF =='EXTE' .AND. (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM)) THEN - CALL IO_File_close(TINIFILEPGD) -ENDIF -CALL IO_File_close(TINIFILE) -IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN - CALL IO_File_close(TPGDFILE) -ENDIF -! -! -!------------------------------------------------------------------------------- -! -!* 11. PRINTS ON OUTPUT-LISTING -! ------------------------ -! -IF (NVERB >= 5) THEN - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: LCARTESIAN,CIDEAL,CZS=', & - LCARTESIAN,CIDEAL,CZS - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: LUSERV=',LUSERV - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: XLON0,XLAT0,XBETA,XRPK,XLONORI,XLATORI=', & - XLON0,XLAT0,XBETA,XRPK,XLONORI,XLATORI - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: XDELTAX,XDELTAY=',XDELTAX,XDELTAY - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: NVERB=',NVERB - IF(LCARTESIAN) THEN - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: No map projection used.' - ELSE - IF (XRPK == 1.) THEN - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Polar stereo used.' - ELSE IF (XRPK == 0.) THEN - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Mercator used.' - ELSE - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Lambert used, cone factor=',XRPK - END IF - END IF -END IF -! -IF (NVERB >= 5) THEN - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: IIB, IJB, IKB=',NIB,NJB,NKB - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: IIU, IJU, IKU=',NIU,NJU,NKU -END IF -! -! -!* 28.1 print statistics! -! - ! - CALL SECOND_MNH2(ZTIME2) - XT_START=XT_START+ZTIME2-ZEND - ! - ! Set File Timing OUTPUT - ! - CALL SET_ILUOUT_TIMING(TLUOUT0) - ! - ! Compute global time - ! - CALL TIME_STAT_ll(XT_START,ZTOT) - ! - ! - IMI = 1 - CALL TIME_HEADER_ll(IMI) - ! - CALL TIME_STAT_ll(XT_STORE,ZTOT, ' STORE-FIELDS','=') - CALL TIMING_SEPARATOR('+') - CALL TIMING_SEPARATOR('+') - WRITE(YMI,FMT="(I0)") IMI - CALL TIME_STAT_ll(XT_START,ZTOT, ' MODEL'//YMI,'+') - CALL TIMING_SEPARATOR('+') - CALL TIMING_SEPARATOR('+') - CALL TIMING_SEPARATOR('+') -WRITE(NLUOUT,FMT=*) ' ' -WRITE(NLUOUT,FMT=*) '****************************************************' -WRITE(NLUOUT,FMT=*) '* PREP_IDEAL_CASE: PREP_IDEAL_CASE ENDS CORRECTLY. *' -WRITE(NLUOUT,FMT=*) '****************************************************' -! -CALL FINALIZE_MNH() -! -! -CONTAINS -INCLUDE "th_r_from_thl_rt.func.h" -INCLUDE "compute_frac_ice.func.h" -END PROGRAM PREP_IDEAL_CASE diff --git a/src/PHYEX/ext/prep_nest_pgd.f90 b/src/PHYEX/ext/prep_nest_pgd.f90 deleted file mode 100644 index 4a2352d77..000000000 --- a/src/PHYEX/ext/prep_nest_pgd.f90 +++ /dev/null @@ -1,408 +0,0 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ##################### - PROGRAM PREP_NEST_PGD -! ##################### -! -!!**** *PREP_NEST_PGD* - to make coherent pgd files for nesting -!! -!! PURPOSE -!! ------- -!! -!! The purpose of this program is to prepare pgd files with which -!! nesting can be performed. A pgd file must be coherent with its -!! father: -!! The average of orography of fine model on each of its father grid -!! mesh must be the same as its father orography. -!! -!! All the pgd files are read at the begining of the program, -!! then they are checked, and recursively, the orography of a father -!! is replaced by the averaged orography from ist son. -!! -!! The control data are given in the namelist file PRE_NEST.nam -!! -!! &NAM_NEST_PGD1 CPGD='coarser model' / -!! &NAM_NEST_PGD2 CPGD='medium model' , IDAD=1 / -!! &NAM_NEST_PGD3 CPGD='medium model' , IDAD=1 / -!! &NAM_NEST_PGD4 CPGD='fine model' , IDAD=2 / -!! &NAM_NEST_PGD5 CPGD='fine model' , IDAD=2 / -!! &NAM_NEST_PGD6 CPGD='fine model' , IDAD=3 / -!! &NAM_NEST_PGD7 CPGD='very fine model' , IDAD=6 / -!! &NAM_NEST_PGD8 CPGD='very very fine model' , IDAD=7 / -!! -!! In each namelist is given the name of the pgd file, and the number -!! of its father. This one MUST be smaller. -!! There is one output file for each input file, with the suffix -!! '.nest' added at the end of the file name (even if the file has not -!! been changed). -!! -!! In the case of the namelist above, one obtain something like: -!! -!! +----------------------------------------------------------+ -!! | 1 | -!! | +-----------------------+ | -!! | | 2 | | -!! | | | | -!! | | +-+ | | -!! | | +-------+ |5| | +-----------------------+ | -!! | | | 4 | +-+ | | +----------+ 3 | | -!! | | +-------+ | | |+------+ 6| | | -!! | +-----------------------+ | || +-+ 7| | | | -!! | | || |8| | | | | -!! | | || +-+ | | | | -!! | | |+------+ | | | -!! | | +----------+ | | -!! | +-----------------------+ | -!! +----------------------------------------------------------+ -!! -!! -!!** METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! Book 2 -!! -!! AUTHOR -!! ------ -!! -!! V.Masson Meteo-France -!! -!! MODIFICATIONS -!! ------------- -!! Original 26/09/95 -!! 30/07/97 (Masson) split of mode_lfifm_pgd -!! 2014 (M.Faivre) -!! 06/2015 (M.Moge) parallelization -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! J.Escobar : 19/04/2016 : Pb IOZ/NETCDF , missing OPARALLELIO=.FALSE. for PGD files -!! 06/2016 (G.Delautier) phasage surfex 8 -!! P.Wautelet : 08/07/2016 : removed MNH_NCWRIT define -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -! P. Wautelet 06/07/2021: use FINALIZE_MNH -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CONF -USE MODD_CONF_n -USE MODD_CST -USE MODD_DIM_n -USE MODD_IO, ONLY: TFILE_SURFEX, TPTR2FILE -USE MODD_GRID_n, ONLY: XZSMT -USE MODD_LUNIT, ONLY: TPGDFILE,TLUOUT0,TOUTDATAFILE -USE MODD_MNH_SURFEX_n -USE MODD_NESTING -USE MODD_PARAMETERS -USE MODD_VAR_ll, ONLY: NPROC, IP, NMNH_COMM_WORLD -! -use mode_field, only: Ini_field_list -USE MODE_FINALIZE_MNH, only: FINALIZE_MNH -USE MODE_IO, only: IO_Init, IO_Pack_set -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Header_write -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -USE MODE_ll -USE MODE_MNH_WORLD, ONLY: INIT_NMNH_COMM_WORLD -USE MODE_MODELN_HANDLER -USE MODE_MPPDB -USE MODE_SPLITTINGZ_ll, ONLY: INI_PARAZ_ll -! -USE MODI_DEFINE_MASK_n -USE MODI_INIT_HORGRID_ll_n -USE MODI_INIT_PGD_SURF_ATM -USE MODI_NEST_FIELD_n -USE MODI_NEST_ZSMT_n -USE MODI_OPEN_NESTPGD_FILES -USE MODI_READ_ALL_NAMELISTS -USE MODI_READ_HGRID -USE MODI_RETRIEVE1_NEST_INFO_n -USE MODI_VERSION -USE MODI_WRITE_PGD_SURF_ATM_N -USE MODE_INI_CST, ONLY: INI_CST -! -IMPLICIT NONE -! -!* 0.1 Declaration of local variables -! ------------------------------ -! -INTEGER, DIMENSION(JPMODELMAX) :: NXSIZE ! number of grid points for each model -INTEGER, DIMENSION(JPMODELMAX) :: NYSIZE ! in x and y-directions - ! relatively to its father grid -! -INTEGER :: ILUOUT0 -INTEGER :: IINFO_ll ! return code of // routines -INTEGER :: JPGD ! loop control -CHARACTER(LEN=28) :: YMY_NAME,YDAD_NAME -CHARACTER(LEN=2) :: YSTORAGE_TYPE -LOGICAL, DIMENSION(JPMODELMAX) :: L1D_ALL ! Flag for 1D conf. for each PGD -LOGICAL, DIMENSION(JPMODELMAX) :: L2D_ALL ! Flag for 2D conf. for each PGD -LOGICAL, DIMENSION(JPMODELMAX) :: LPACK_ALL! Flag for packing conf. for each PGD -! -INTEGER :: JTIME,ITIME -INTEGER :: IIMAX,IJMAX,IKMAX -INTEGER :: IDXRATIO,IDYRATIO -INTEGER :: IDAD -INTEGER :: II -LOGICAL :: GISINIT -! -TYPE(TPTR2FILE),DIMENSION(:),ALLOCATABLE :: TZFILEPGD ! Input PGD files -TYPE(TPTR2FILE),DIMENSION(:),ALLOCATABLE,TARGET :: TZFILENESTPGD ! Output PGD files -! -!------------------------------------------------------------------------------- -! -CALL MPPDB_INIT() -! -CALL VERSION -CPROGRAM='NESPGD' -! -CALL IO_Init() -!!$CALL SET_JP_ll(JPMODELMAX,JPHEXT,JPVEXT,JPHEXT) -! -!* 1. INITIALIZATION OF PHYSICAL CONSTANTS -! ------------------------------------ -! -CALL INI_CST -! -!------------------------------------------------------------------------------- -! -!* 2. OPENING OF THE FILES -! --------------------- -! -NVERB=1 -! -CALL OPEN_NESTPGD_FILES(TZFILEPGD,TZFILENESTPGD) -CALL SET_JP_ll(JPMODELMAX,JPHEXT,JPVEXT,JPHEXT) -! -ILUOUT0 = TLUOUT0%NLU -! -CALL SURFEX_ALLOC_LIST(NMODEL) -YSURF_CUR => YSURF_LIST(1) -CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.) -! -!------------------------------------------------------------------------------- -! -!* 3. READING OF THE GRIDS -! -------------------- -! -CALL INI_FIELD_LIST() -! -CALL SET_DAD0_ll() -DO JPGD=1,NMODEL - ! read and set dimensions and ratios of model JPGD - CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'IMAX', IIMAX) - CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'JMAX', IJMAX) - CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'DXRATIO',NDXRATIO_ALL(JPGD)) - CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'DYRATIO',NDYRATIO_ALL(JPGD)) - CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'XSIZE', NXSIZE(JPGD)) - CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'YSIZE', NYSIZE(JPGD)) - CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'XOR', NXOR_ALL(JPGD)) - CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'YOR', NYOR_ALL(JPGD)) - CALL SET_DIM_ll(IIMAX, IJMAX, 1) - ! compute origin and end of local subdomain of model JPGD - ! initialize variables from MODD_NESTING, origin and end of global model JPGD in coordinates of its father - IF ( NDAD(JPGD) > 0 ) THEN - NXEND_ALL(JPGD) = NXOR_ALL(JPGD) + NXSIZE(JPGD) - 1 + 2*JPHEXT - NYEND_ALL(JPGD) = NYOR_ALL(JPGD) + NYSIZE(JPGD) - 1 + 2*JPHEXT - ELSE ! this is not a son model - NXOR_ALL(JPGD) = 1 - NXEND_ALL(JPGD) = IIMAX+2*JPHEXT - NYOR_ALL(JPGD) = 1 - NYEND_ALL(JPGD) = IJMAX+2*JPHEXT - NDXRATIO_ALL(JPGD) = 1 - NDYRATIO_ALL(JPGD) = 1 - ENDIF - ! initialize variables from MODD_DIM_ll, origin and end of global model JPGD in coordinates of its father - CALL SET_XOR_ll(NXOR_ALL(JPGD), JPGD) - CALL SET_XEND_ll(NXEND_ALL(JPGD), JPGD) - CALL SET_YOR_ll(NYOR_ALL(JPGD), JPGD) - CALL SET_YEND_ll(NYEND_ALL(JPGD), JPGD) - ! set the father model of model JPGD -! set MODD_NESTING::NDAD using MODD_DIM_ll::NDAD -! MODD_DIM_ll::NDAD was filled in OPEN_NESTPGD_FILES - CALL SET_DAD_ll(NDAD(JPGD), JPGD) - ! set the ratio of model JPGD in MODD_DIM_ll - CALL SET_XRATIO_ll(NDXRATIO_ALL(JPGD), JPGD) - CALL SET_YRATIO_ll(NDYRATIO_ALL(JPGD), JPGD) -END DO -! -! reading of the grids -! - CALL SET_DIM_ll(NXEND_ALL(1)-NXOR_ALL(1)+1-2*JPHEXT, NYEND_ALL(1)-NYOR_ALL(1)+1-2*JPHEXT, 1) - CALL INI_PARAZ_ll(IINFO_ll) -DO JPGD=1,NMODEL - CALL GOTO_MODEL(JPGD) - CALL GO_TOMODEL_ll(JPGD,IINFO_ll) - CALL GOTO_SURFEX(JPGD) - CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'L1D', L1D_ALL(JPGD)) - CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'L2D', L2D_ALL(JPGD)) - CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'PACK',LPACK_ALL(JPGD)) - CALL IO_Pack_set(L1D_ALL(JPGD),L2D_ALL(JPGD),LPACK_ALL(JPGD)) - CALL READ_HGRID(JPGD,TZFILEPGD(JPGD)%TZFILE,YMY_NAME,YDAD_NAME,YSTORAGE_TYPE) - CSTORAGE_TYPE='PG' -END DO - CALL INI_PARAZ_ll(IINFO_ll) -! -!------------------------------------------------------------------------------- -! -!* 5. MASKS DEFINITIONS -! ----------------- -! - -DO JPGD=1,NMODEL - CALL GOTO_SURFEX(JPGD) - CALL GOTO_MODEL(JPGD) - CALL GO_TOMODEL_ll(JPGD,IINFO_ll) -!!$ CALL INIT_HORGRID_ll_n() - CALL DEFINE_MASK_n() -END DO -! -!------------------------------------------------------------------------------- -! -!* 6. MODIFICATION OF OROGRAPHY -! ------------------------- -! -WRITE(ILUOUT0,FMT=*) -WRITE(ILUOUT0,FMT=*) 'field ZS of all models' -DO JPGD=NMODEL,1,-1 - CALL GOTO_MODEL(JPGD) - CALL GO_TOMODEL_ll(JPGD,IINFO_ll) - CALL GOTO_SURFEX(JPGD) - CALL NEST_FIELD_n('ZS ') -END DO -! -! *** Adaptation of smooth topography for SLEVE coordinate -! -WRITE(ILUOUT0,FMT=*) -WRITE(ILUOUT0,FMT=*) 'field ZSMT of all models' -DO JPGD=1,NMODEL - CALL GOTO_MODEL(JPGD) - CALL GO_TOMODEL_ll(JPGD,IINFO_ll) - CALL GOTO_SURFEX(JPGD) - CALL NEST_ZSMT_n('ZSMT ') -END DO - -! -!------------------------------------------------------------------------------- -! -!* 7. SURFACE FIELDS READING -! ---------------------- -! -DO JPGD=1,NMODEL - IF (LEN_TRIM(TZFILEPGD(JPGD)%TZFILE%CNAME)>0) THEN - CALL GO_TOMODEL_ll(JPGD,IINFO_ll) - TPGDFILE => TZFILEPGD(JPGD)%TZFILE - CALL GOTO_MODEL(JPGD) - CALL GOTO_SURFEX(JPGD) - CALL INIT_PGD_SURF_ATM(YSURF_CUR,'MESONH','PGD', & - ' ',' ',& - NUNDEF,NUNDEF,NUNDEF,XUNDEF ) - END IF -END DO -! -!------------------------------------------------------------------------------- -! -!* 8. MODIFICATION OF OROGRAPHY -! ------------------------- -! -DO JPGD=1,NMODEL - CALL GOTO_MODEL(JPGD) - CALL GO_TOMODEL_ll(JPGD,IINFO_ll) - CALL GOTO_SURFEX(JPGD) - CALL MNHPUT_ZS_n -END DO -! -!------------------------------------------------------------------------------- -! -!* 10. SURFACE FIELDS WRITING -! ---------------------- -! -DO JPGD=1,NMODEL - CALL GO_TOMODEL_ll(JPGD,IINFO_ll) - TPGDFILE => TZFILEPGD(JPGD)%TZFILE - TOUTDATAFILE => TZFILENESTPGD(JPGD)%TZFILE - CALL GOTO_MODEL(JPGD) - !Open done here because grid dimensions have to be known - CALL IO_File_open(TZFILENESTPGD(JPGD)%TZFILE) - CALL GOTO_SURFEX(JPGD) - TFILE_SURFEX => TZFILENESTPGD(JPGD)%TZFILE - CALL WRITE_PGD_SURF_ATM_n(YSURF_CUR,'MESONH') - NULLIFY(TFILE_SURFEX) - CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'ZSMT',XZSMT) -END DO -! -!------------------------------------------------------------------------------- -! -!* 12. Write configuration variables in the output file -! ------------------------------------------------ -! -! -DO JPGD=1,NMODEL - CALL IO_Header_write(TZFILENESTPGD(JPGD)%TZFILE) - IF ( ASSOCIATED(TZFILENESTPGD(JPGD)%TZFILE%TDADFILE) ) THEN - CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'DXRATIO',NDXRATIO_ALL(JPGD)) - CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'DYRATIO',NDYRATIO_ALL(JPGD)) - CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'XOR', NXOR_ALL(JPGD)) - CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'YOR', NYOR_ALL(JPGD)) - END IF - CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'SURF', 'EXTE') - CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'L1D', L1D_ALL(JPGD)) - CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'L2D', L2D_ALL(JPGD)) - CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'PACK', LPACK_ALL(JPGD)) - CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'JPHEXT',JPHEXT) -END DO -! -!------------------------------------------------------------------------------- -! -!* 13. CLOSING OF THE FILES -! -------------------- -! -DO JPGD=1,NMODEL - CALL IO_File_close(TZFILEPGD(JPGD)%TZFILE) - CALL IO_File_close(TZFILENESTPGD(JPGD)%TZFILE) -END DO -! -!* loop to spare enough time to transfer commands before end of program -ITIME=0 -DO JTIME=1,1000000 - ITIME=ITIME+1 -END DO -!------------------------------------------------------------------------------- -! -!* 12. EPILOGUE -! -------- -! -WRITE(ILUOUT0,FMT=*) -WRITE(ILUOUT0,FMT=*) '************************************************' -WRITE(ILUOUT0,FMT=*) '* PREP_NEST_PGD: PREP_NEST_PGD ends correctly. *' -WRITE(ILUOUT0,FMT=*) '************************************************' -! -!------------------------------------------------------------------------------- -! -!* 10. FINALIZE THE PARALLEL SESSION -! ----------------------------- -! -CALL FINALIZE_MNH() - -! CALL END_PARA_ll(IINFO_ll) -! -! CALL SURFEX_DEALLO_LIST -! -!------------------------------------------------------------------------------- - -END PROGRAM PREP_NEST_PGD diff --git a/src/PHYEX/ext/prep_pgd.f90 b/src/PHYEX/ext/prep_pgd.f90 deleted file mode 100644 index 617389344..000000000 --- a/src/PHYEX/ext/prep_pgd.f90 +++ /dev/null @@ -1,340 +0,0 @@ -!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ################ - PROGRAM PREP_PGD -! ################ -!! -!! PURPOSE -!! ------- -!! This program prepares the physiographic data fields. -!! -!! METHOD -!! ------ -!! -!! -!! EXTERNAL -!! -------- -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! -!! F. Mereyde Meteo-France -!! -!! MODIFICATION -!! ------------ -!! -!! Original 21/07/95 -!! Modification 26/07/95 Treatment of orography and subgrid-scale -!! orography roughness length (V. Masson) -!! Modification 22/05/96 Variable CSTORAGE_TYPE (V. Masson) -!! Modification 25/05/96 Modification of splines, correction on z0rel -!! and set limits for some surface varaibles -!! Modification 12/06/96 Treatment of a rare case for ZPGDZ0EFF (Masson) -!! Modification 22/11/96 removes the filtering. It will have to be -!! performed in ADVANCED_PREP_PGD (Masson) -!! Modification 15/03/99 **** MAJOR MODIFICATION **** (Masson) -!! PGD fields are now defined from the cover -!! type fractions in the grid meshes -!! User can still include its own data, and -!! even additional (dummy) fields -!! Modificatio 06/00 patch approach, for vegetation related variable (Solmon/Masson) -! averaging is performed on subclass(=patch) of nature -!! 08/03/01 add chemical emission treatment (D.Gazen) -!! Modification 15/10/01 allow namelists in different orders (I.Mallet) -!! -!! ################################ -!! MODIFICATION 13/10/03 EXTERNALIZED VERSION (V. Masson) -!! ################################ -!! J.Escobar 4/04/2008 Improve checking --> add STATUS=OLD in open_ll(PRE_PGD1.nam,... -!! -!! Modification 30/03/2012 Add NAM_NCOUT for netcdf output (S.Bielli) -!! S.Bielli 23/04/2014 supress writing of LAt and LON in NETCDF case -!! S.Bielli 20/11/2014 add writing of LAt and LON in NETCDF case -!! M.Moge 01/03/2015 use MPPDB + SPLIT_GRID is now called in PGD_GRID. Here we extend -!! the new grid on the halo with EXTEND_GRID_ON_HALO (M.Moge) -!! M.Moge 06/2015 write NDXRATIO,NDYRATIO,NXSIZE,NYSIZE,NXOR,NYOR in .lfi output file -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! J.Escobar : 05/10/2015 : missing JPHEXT for LAT/LON/ZS/ZSMT writing -!! M.Moge 11/2015 disable the creation of files on multiple -!! Z-levels when using parallel IO for PREP_PGD -!! 06/2016 (G.Delautier) phasage surfex 8 -!! P.Wautelet : 08/07/2016 : removed MNH_NCWRIT define -!! 10/2016 (S.Faroux S.Bielli) correction for NHALO=0 -!! 01/2018 (G.Delautier) SURFEX 8.1 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! Q. Rodier 01/2019 : add a new filtering for very high slopes in NAM_ZSFILTER -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -! P. Wautelet 07/02/2019: remove OPARALLELIO argument from open and close files subroutines -! (nsubfiles_ioz is now determined in IO_File_add2list) -! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! P. Wautelet 06/07/2021: use FINALIZE_MNH -!---------------------------------------------------------------------------- -! -!* 0. DECLARATION -! ----------- -! -USE MODD_CONF, ONLY : CPROGRAM, L1D, L2D, LPACK, LCARTESIAN -USE MODD_CONF_n,ONLY : CSTORAGE_TYPE -USE MODD_LUNIT, ONLY : TLUOUT0 -USE MODD_LUNIT_n,ONLY : LUNIT_MODEL -USE MODD_PARAMETERS, ONLY : XUNDEF -USE MODD_IO, only: TFILEDATA, TFILE_OUTPUTLISTING, TFILE_SURFEX -use modd_precision, only: LFIINT -USE MODD_IO_SURF_MNH, ONLY : NHALO -USE MODD_SPAWN, ONLY : NDXRATIO,NDYRATIO,NXSIZE,NYSIZE,NXOR,NYOR -! -use mode_field, only: Ini_field_list -USE MODE_FINALIZE_MNH, only: FINALIZE_MNH -USE MODE_IO, only: IO_Config_set, IO_Init -USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Header_write -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -use mode_ll -USE MODE_MODELN_HANDLER -USE MODE_MSG -USE MODE_POS -! -USE MODI_ZSMT_PGD -! -!JUAN -USE MODN_CONFZ -USE MODD_PARAMETERS, ONLY : JPHEXT -USE MODD_CONF, ONLY : NHALO_CONF_MNH => NHALO -!JUAN -! -USE MODI_READ_ALL_NAMELISTS -USE MODI_VERSION -USE MODI_PGD_GRID_SURF_ATM -USE MODI_SPLIT_GRID -USE MODI_PGD_SURF_ATM -USE MODI_WRITE_PGD_SURF_ATM_N -USE MODD_MNH_SURFEX_n -! -USE MODE_MPPDB -USE MODI_EXTEND_GRID_ON_HALO -! -USE MODN_CONFIO, ONLY : NAM_CONFIO -USE MODE_INI_CST, ONLY: INI_CST -! -IMPLICIT NONE -! -! -!* 0.2 Declaration of local variables -! ------------------------------ -! -INTEGER :: IRESP ! return code for I/O -INTEGER :: ILUOUT0 -INTEGER :: ILUNAM -LOGICAL :: GFOUND -CHARACTER(LEN=28) :: YDAD =' ' ! name of dad of input FM file -CHARACTER(LEN=28) :: CPGDFILE ='PGDFILE' ! name of the output file -CHARACTER(LEN=100) :: YMSG -INTEGER :: NZSFILTER=1 ! number of iteration for filter for fine orography -INTEGER :: NLOCZSFILTER=3 ! number of iteration for filter of local fine orography -LOGICAL :: LHSLOP=.FALSE. ! filtering of local slopes higher than XHSLOP -REAL :: XHSLOP=1.0 ! slopes where the local fine filtering is applied -INTEGER :: NSLEVE =12 ! number of iteration for filter for smooth orography -REAL :: XSMOOTH_ZS = XUNDEF ! optional uniform smooth orography for SLEVE coordinate -REAL, DIMENSION(:,:),ALLOCATABLE :: ZWORK ! work array for lat and lon reshape -REAL, DIMENSION(:,:),ALLOCATABLE :: ZWORK_LAT ! work array for lat and lon reshape -REAL, DIMENSION(:,:),ALLOCATABLE :: ZWORK_LON ! work array for lat and lon reshape -INTEGER :: IIMAX, IJMAX -INTEGER :: NHALO_MNH -TYPE(TFILEDATA),POINTER :: TZFILE => NULL() -TYPE(TFILEDATA),POINTER :: TZNMLFILE => NULL() ! Namelist file -! -NAMELIST/NAM_PGDFILE/CPGDFILE, NHALO -NAMELIST/NAM_ZSFILTER/NZSFILTER,NLOCZSFILTER,LHSLOP,XHSLOP -NAMELIST/NAM_SLEVE/NSLEVE, XSMOOTH_ZS -NAMELIST/NAM_CONF_PGD/JPHEXT, NHALO_MNH -!------------------------------------------------------------------------------ -! -CALL MPPDB_INIT() -! -CPROGRAM='PGD ' -! -!* 1. Set default names and parallelized I/O -! -------------------------------------- -! -CALL IO_Init() -! -NHALO=15 -! -CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING0','OUTPUTLISTING','WRITE') -CALL IO_File_open(TLUOUT0) -! -!Set output file for PRINT_MSG -TFILE_OUTPUTLISTING => TLUOUT0 -! -LUNIT_MODEL(1)%TLUOUT => TLUOUT0 -ILUOUT0=TLUOUT0%NLU -! -!JUAN -CALL IO_File_add2list(TZNMLFILE,'PRE_PGD1.nam','NML','READ') -CALL IO_File_open(TZNMLFILE,KRESP=IRESP) -ILUNAM = TZNMLFILE%NLU -IF (IRESP.NE.0 ) THEN - WRITE(YMSG,*) 'file PRE_PGD1.nam not found, IRESP=', IRESP - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_PGD',YMSG) -ENDIF -!JUAN - -CALL POSNAM( TZNMLFILE, 'NAM_PGDFILE', GFOUND ) -IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_PGDFILE) -CALL POSNAM( TZNMLFILE, 'NAM_ZSFILTER', GFOUND ) -IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_ZSFILTER) -CALL POSNAM( TZNMLFILE, 'NAM_SLEVE', GFOUND ) -IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_SLEVE) -!JUANZ -CALL POSNAM( TZNMLFILE, 'NAM_CONFZ', GFOUND ) -IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFZ) -CALL POSNAM( TZNMLFILE, 'NAM_CONF_PGD', GFOUND ) -IF (GFOUND) THEN - NHALO_MNH = NHALO_CONF_MNH - READ(UNIT=ILUNAM,NML=NAM_CONF_PGD) - NHALO_CONF_MNH = NHALO_MNH -ENDIF -!JUANZ -CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND ) -IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFIO) -CALL IO_Config_set() -! -CALL IO_File_close(TZNMLFILE) -! -! -CALL SURFEX_ALLOC_LIST(1) -YSURF_CUR => YSURF_LIST(1) -CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.) -! -CALL INI_FIELD_LIST() -! -CALL GOTO_MODEL(1) -CALL GOTO_SURFEX(1) -! -CALL VERSION -CSTORAGE_TYPE = 'PG' -! -CALL INI_CST -! -! -!* 2. Preparation of surface physiographic fields -! ------------------------------------------- -! -!* Initializes the grid -! -------------------- -! -CALL PGD_GRID_SURF_ATM(YSURF_CUR%UG, YSURF_CUR%U,YSURF_CUR%GCP,'MESONH',& - ' ',' ',.FALSE.,HDIR='-') -! -CALL EXTEND_GRID_ON_HALO('MESONH',YSURF_CUR%UG, YSURF_CUR%U,& - YSURF_CUR%UG%G%NGRID_PAR, YSURF_CUR%UG%G%XGRID_PAR) -! -! -!* Initializes all physiographic fields -! ------------------------------------ -! -CALL PGD_SURF_ATM(YSURF_CUR,'MESONH',' ',' ',.FALSE.) -! -! -!* 3. Writes the physiographic fields -! ------------------------------- -! -CALL IO_File_add2list(TZFILE,CPGDFILE,'PGD','WRITE',KLFINPRAR=INT(1,KIND=LFIINT),KLFITYPE=1,KLFIVERB=5) -! -CALL IO_File_open(TZFILE) -! -CALL IO_Header_write(TZFILE) -! -CALL IO_Field_write(TZFILE,'SURF','EXTE') -CALL IO_Field_write(TZFILE,'L1D', L1D) -CALL IO_Field_write(TZFILE,'L2D', L2D) -CALL IO_Field_write(TZFILE,'PACK',LPACK) -IF ( NDXRATIO <= 0 .AND. NDYRATIO <= 0 ) THEN - NDXRATIO = 1 - NDYRATIO = 1 -ENDIF -IF ( NXSIZE < 0 .AND. NYSIZE < 0 ) THEN - NXSIZE = 0 - NYSIZE = 0 -ENDIF -IF ( NXOR <= 0 .AND. NYOR <= 0 ) THEN - NXOR = 1 - NYOR = 1 -ENDIF -CALL IO_Field_write(TZFILE,'DXRATIO',NDXRATIO) -CALL IO_Field_write(TZFILE,'DYRATIO',NDYRATIO) -CALL IO_Field_write(TZFILE,'XSIZE', NXSIZE) -CALL IO_Field_write(TZFILE,'YSIZE', NYSIZE) -CALL IO_Field_write(TZFILE,'XOR', NXOR) -CALL IO_Field_write(TZFILE,'YOR', NYOR) -CALL IO_Field_write(TZFILE,'JPHEXT', JPHEXT) -! -TFILE_SURFEX => TZFILE -ALLOCATE(YSURF_CUR%DUO%CSELECT(0)) -CALL WRITE_PGD_SURF_ATM_n(YSURF_CUR,'MESONH') -NULLIFY(TFILE_SURFEX) !Probably not necessary -! -!* 4. Computes and writes smooth orography for SLEVE coordinate -! --------------------------------------------------------- -CALL ZSMT_PGD(TZFILE,NZSFILTER,NSLEVE,NLOCZSFILTER,LHSLOP,XHSLOP,XSMOOTH_ZS) -! -IF (.NOT.LCARTESIAN) THEN -!!!! WRITE LAT and LON - CALL GET_DIM_PHYS_ll('B',IIMAX,IJMAX) - ALLOCATE(ZWORK(IIMAX+NHALO*2,IJMAX+NHALO*2)) - ALLOCATE(ZWORK_LAT(IIMAX+2*JPHEXT,IJMAX+2*JPHEXT)) - ALLOCATE(ZWORK_LON(IIMAX+2*JPHEXT,IJMAX+2*JPHEXT)) - ZWORK=RESHAPE(YSURF_CUR%UG%G%XLAT, (/ (IIMAX+NHALO*2),(IJMAX+NHALO*2) /) ) - IF (NHALO/=0) THEN - ZWORK_LAT=ZWORK(NHALO:(IIMAX+NHALO+1),NHALO:(IJMAX+NHALO+1)) - ELSE - ZWORK_LAT(2:IIMAX+1,2:IJMAX+1)=ZWORK - ZWORK_LAT(1,:) = ZWORK_LAT(2,:) - ZWORK_LAT(IIMAX+2,:) = ZWORK_LAT(IIMAX+1,:) - ZWORK_LAT(:,1) = ZWORK_LAT(:,2) - ZWORK_LAT(:,IJMAX+2) = ZWORK_LAT(:,IJMAX+1) - ENDIF - ZWORK=RESHAPE(YSURF_CUR%UG%G%XLON, (/ IIMAX+NHALO*2,IJMAX+NHALO*2 /) ) - IF (NHALO/=0) THEN - ZWORK_LON=ZWORK(NHALO:(IIMAX+NHALO+1),NHALO:(IJMAX+NHALO+1)) - ELSE - ZWORK_LON(2:IIMAX+1,2:IJMAX+1)=ZWORK - ZWORK_LON(1,:) = ZWORK_LON(2,:) - ZWORK_LON(IIMAX+2,:) = ZWORK_LON(IIMAX+1,:) - ZWORK_LON(:,1) = ZWORK_LON(:,2) - ZWORK_LON(:,IJMAX+2) = ZWORK_LON(:,IJMAX+1) - ENDIF - CALL IO_Field_write(TZFILE,'LAT',ZWORK_LAT) - CALL IO_Field_write(TZFILE,'LON',ZWORK_LON) - ! - DEALLOCATE(ZWORK,ZWORK_LAT,ZWORK_LON) -END IF -! -! -WRITE(ILUOUT0,*) -WRITE(ILUOUT0,*) '***************************' -WRITE(ILUOUT0,*) '* PREP_PGD ends correctly *' -WRITE(ILUOUT0,*) '***************************' -! -!* 6. Close parallelized I/O -! ---------------------- -! -CALL IO_File_close(TZFILE) -! -CALL FINALIZE_MNH() -! -!------------------------------------------------------------------------------- -! -END PROGRAM PREP_PGD diff --git a/src/PHYEX/ext/prep_real_case.f90 b/src/PHYEX/ext/prep_real_case.f90 deleted file mode 100644 index 8cedd2db6..000000000 --- a/src/PHYEX/ext/prep_real_case.f90 +++ /dev/null @@ -1,1451 +0,0 @@ -!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ###################### - PROGRAM PREP_REAL_CASE -! ###################### -! -!!**** *PREP_REAL_CASE* - program to write an initial FM file from real case -!! situation. -!! -!! PURPOSE -!! ------- -!! -!! The purpose of this program is to prepare an initial meso-NH file -!! (LFIFM and DESFM files) filled by some fields of a real situation. -!! General data are given by the MESO-NH user in the namelist file -!! 'PRE_REAL1.nam'. The fields are obtained from three sources: -!! - an atmospheric input file, which can be: -!! * an Aladin file, itself obtained from an Arpege file with -!! the Aladin routine "FULLPOS". -!! * a grib file (ECMWF, Grib Arpege or Grib Aladin) -!! * a MESONH file -!! - an physiographic data file. -!! -!! 1) Fields obtained from the Atmospheric file: -!! ----------------------------------------- -!! -!! - the projection parameters (checked with PGD file): -!! reference latitude and longitude -!! parameter of projection -!! angle of rotation of the domain -!! -!! - the horizontal grid definition (checked with PGD file): -!! grid mesh -!! latitude and longitude of the reference point -!! (with data from PRE_REAL1.nam) -!! -!! - thermodynamical 3D and 2D fields: -!! potential temperature -!! vapor mixing ratio -!! -!! - dynamical fields: -!! three components of the wind -!! -!! - reference anelastic state variables: -!! profile of virtual potential temperature -!! profile of dry density -!! Exner function at model top -!! -!! - total dry air mass -!! -!! -!! 2) Fields obtained from the physiographic data file: -!! ------------------------------------------------ -!! -!! - the projection parameters: -!! reference latitude and longitude -!! parameter of projection -!! angle of rotation of the domain -!! -!! - the horizontal grid definition: -!! grid mesh -!! latitude and longitude of the reference point -!! (with data from PRE_REAL1.nam) -!! - physiografic fields: (orographic, vegetation, soil and radiation fields) -!! -!! -!! 3) Data obtained from the namelist file PRE_REAL1.nam: -!! -------------------------------------------------- -!! -!! - type of equations system -!! - vertical grid definition -!! - number of points in x and y directions -!! - level of verbosity -!! - name of the different files -!! -!! -!!** METHOD -!! ------ -!! In this program, once the MESO-NH domain is calculated, all the -!! 2D or 3D fields are computed on the MESO-NH horizontal domain WITH -!! the external points. This is particularly important for the large -!! scale fields during the MESO-NH run. -!! -!! 1) The following PREP_REAL_CASE program: -!! -!! - set default values for global variables which will be written in -!! DESFM file (by calling DEFAULT_DESFM1); lateral boundary conditions -!! are open. -!! -!! - opens the different files (by calling OPEN_PRC_FILES). -!! -!! - initializes physical constants (by calling INI_CST). -!! -!! - initializes the horizontal domain from the data read in the -!! descriptive part of the Aladin file and the directives read in the -!! namelist file (routines READ_GENERAL and SET_SUBDOMAIN in -!! READ_ALL_DATA). This MESO-NH domain is a part of the Aladin domain. -!! -!! - initializes global variables from namelists and the MESO-NH -!! vertical grid definition variables in the namelist file -!! (routine READ_VER_GRID). -!! -!! - initializes the physiographic 2D fields from the physiographic data -!! file, in particular the MESO-NH orography. -!! -!! - reads the 3D and 2D variable fields in the Grib file -!! (routine READ_ALL_DATA_GRIB_CASE), -!! if HATMFILETYPE='GRIBEX': -!! absolute temperature -!! specific humidity -!! horizontal contravariant wind -!! surface pressure -!! large scale orography -!! -!! - reads the 3D and 2D variable fields in the input MESONH file -!! (routine READ_ALL_DATA_MESONH_CASE), if HATMFILETYPE='MESONH': -!! potential temperature -!! vapor mixing ratio -!! horizontal wind -!! other mixing ratios -!! turbulence prognostic and semi-prognostic variables -!! large scale orography -!! -!! - computes some geometric variables (routines SM_GRIDPROJ and METRICS), -!! in particular: -!! * altitude 3D array -!! * metric coefficients -!! * jacobian -!! -!! - initializes MESO-NH thermodynamical fields: -!! * changes of variables (routine VER_PREP_mmmmmm_CASE): -!! absolute temperature --> virtual potential temperature -!! specific humidity --> vapor mixing ratio -!! * interpolates/extrapolates the fields from the large scale -!! orography to the MESO-NH one (routine VER_INT_THERMO in -!! VER_THERMO, by using a shifting function method). -!! in water vapor case, the interpolations are always performed -!! on relative humidity. -!! * the pressure is computed on each grid by integration of the -!! hydrostatic equation from bottom or top. When input atmospheric -!! file is a MESO-NH one, information about the difference between -!! hydrostatic pressure and total pressure is kept and interpolated -!! during the entire PREP_REAL_CASE process. -!! * interpolates the fields to the MESO-NH vertical grid -!! (also by routine VER_INT_THERMO in VER_THERMO). -!! * computes the potential temperature (routine VER_THERMO). -!! * sets to zero the mixing ratios, except the vapor mixing ratio -!! (VER_THERMO). -!! -!! - initializes the reference anelastic state variables (routine SET_REFZ -!! in VER_THERMO). -!! -!! - computes the total dry air mass (routine DRY_MASS in VER_THERMO). -!! -!! - initializes MESO-NH dynamical variables: -!! * changes Aladin contravariant wind into true horizontal wind -!! (in subroutine VER_PREP). -!! * interpolates/extrapolates the momentum from the large scale -!! orography to the MESO-NH one (routine VER_INT_DYN in -!! VER_DYN, by using a shifting function method). -!! * interpolates the fields to the MESO-NH vertical grid -!! (also by routine VER_INT_DYN in VER_DYN). The fields -!! are located on a horizontal Arakawa A-grid, as the Aladin fields. -!! * The momentum is interpolated to the Arakawa C-grid -!! (routine VER_DYN). -!! * A first guess of the vertical momentum, verifying the -!! uncompressible continuity equation and the material lower boundary -!! condition against the ground, is computed (routine WGUESS). -!! * computes the final non-divergent wind field (routine -!! ANEL_BALANCE). -!! -!! - copies the interpolated fields also at t-dt and in the large scale -!! fields (routine INI_PROG_VAR). -!! -!! - writes the DESFM and LFIFM files (routines WRITE_DESFM1 and -!! WRITE_LFIFM1). -!! -!! -!! 2) Some conventions are used in this program and its subroutines because -!! of the number of different grids and fields: -!! -!! - subscripts: -!! * the subscripts I and J are used for all the horizontal grid. -!! * the subcript K is used for the MESO-NH vertical grid (increasing -!! from bottom to top). -!! * the subscript L is used for the Aladin or input Mesonh grids -!! (increasing from bottom to top). -!! -!! - suffixes: -!! * _LS: -!! If used for a geographic or horizontal grid definition variable, -!! this variable is connected to the large horizontal domain. -!! If used for a surface variable, this variable corresponds to -!! the large scale orography, and therefore will be modified. -!! If used for another variable, this variable is discretized -!! on the Aladin or input MESONH file vertical grid -!! (large-scale orography with input vertical discretization, -!! either coming from eta levels or input Gal-Chen grid). -!! * _MX: -!! Such a variable is discretized on the mixed grid. -!! (large-scale orography with output Gal-Chen vertical grid -!! discretization) -!! * _SH: -!! Such a variable is discretized on the shifted grid. -!! (fine orography with a shifted vertical grid, NOT Gal-Chen) -!! * no suffix: -!! The variable is discretized on the MESO-NH grid. -!! (fine orography with output Gal-Chen vertical grid discretization) -!! -!! - additional pre-suffixes: (for pressure, Exner and altitude fields) -!! * MASS: -!! The variable is discretized on a mass point -!! * FLUX: -!! The variable is discretized on a flux point -!! -!! -!! - names of variables: for a physical variable VAR: -!! * pVARs is the variable itself. -!! * pRHODVARs is the variable multiplied by the dry density rhod. -!! * pRHODJVARs is the variable multiplied by the dry density rhod -!! and the Jacobian. -!! * pRVARs is the variable multiplied by rhod_ref, the anelastic -!! reference state dry density and the Jacobian. -!! where p and s are the appropriate prefix and suffix. -!! -!! - allocation of arrays: the arrays are allocated -!! * just before their initialization for the general arrays stored in -!! modules. -!! * in the subroutine in which they are declared for the local arrays -!! in a subroutine. -!! * in the routine in which they are initialized for the arrays -!! defined in the monitor PREP_REAL_CASE. In this case they are in -!! fact passed as pointer to the subroutines to allow their -!! dynamical allocation (exception which confirms the rule: ZJ). -!! -!! -!! EXTERNAL -!! -------- -!! -!! Routine DEFAULT_DESFM1 : to set default values for variables which can be -!! contained in DESFM file. -!! Routine OPEN_PRC_FILES: to open all files. -!! Routine INI_CST : to initialize physical constants. -!! Routine READ_ALL_DATA_GRIB_CASE : to read all input data. -!! Routine READ_ALL_DATA_MESONH_CASE : to read all input data. -!! Routine SM_GRIDPROJ : to compute some grid variables, in case of -!! conformal projection. -!! Routine METRICS : to compute metric coefficients. -!! Routine VER_PREP_GRIBEX_CASE : to prepare the interpolations. -!! Routine VER_PREP_MESONH_CASE : to prepare the interpolations. -!! Routine VER_THERMO : to perform the interpolation of thermodynamical -!! variables. -!! Routine VER_DYN : to perform the interpolation of dynamical -!! variables. -!! Routine INI_PROG_VAR : to initialize the prognostic varaibles not yet -!! initialized -!! Routine WRITE_DESFM1 : to write a DESFM file. -!! Routine WRITE_LFIFM1 : to write a LFIFM file. -!! Routine IO_File_close : to close a FM-file (DESFM + LFIFM). -!! -!! Module MODE_GRIDPROJ : contains conformal projection routines -!! -!! Module MODI_DEFAULT_DESFM1 : interface module for routine DEFAULT_DESFM1 -!! Module MODI_OPEN_PRC_FILES : interface module for routine OPEN_PRC_FILES -!! Module MODI_READ_ALL_DATA_MESONH_CASE : interface module for routine -!! READ_ALL_DATA_MESONH_CASE -!! Module MODI_METRICS : interface module for routine METRICS -!! Module MODI_VER_PREP_GRIBEX_CASE : interface module for routine -!! VER_PREP_GRIBEX_CASE -!! Module MODI_VER_PREP_MESONH_CASE : interface module for routine -!! VER_PREP_MESONH_CASE -!! Module MODI_VER_THERMO : interface module for routine VER_THERMO -!! Module MODI_VER_DYN : interface module for routine VER_DYN -!! Module MODI_INI_PROG_VAR : interface module for routine INI_PROG_VAR -!! Module MODI_WRITE_DESFM1 : interface module for routine WRITE_DESFM1 -!! Module MODI_WRITE_LFIFM1 : interface module for routine WRITE_LFIFM1 -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! Module MODD_CONF : contains configuration variables for all models. -!! NVERB : verbosity level for output-listing -!! Module MODD_CONF1 : contains configuration variables for model 1. -!! NRR : number of moist variables -!! Module MODD_LUNIT : contains logical unit and names of files. -!! Module MODD_LUNIT : contains logical unit and names of files (model1). -!! CINIFILE: name of the FM file which will be used for the MESO-NH run. -!! Module MODD_GRID1 : contains grid variables. -!! XLAT : latitude of the grid points -!! XLON : longitudeof the grid points -!! XXHAT : position xhat in the conformal plane -!! XYHAT : position yhat in the conformal plane -!! XDXHAT : horizontal local meshlength on the conformal plane -!! XDYHAT : horizontal local meshlength on the conformal plane -!! XZS : MESO-NH orography -!! XZZ : altitude -!! XZHAT : height zhat -!! XMAP : map factor -!! Module MODD_LBC1 : contains declaration of lateral boundary conditions -!! CLBCX : X-direction LBC type at left(1) and right(2) boundaries -!! CLBCY : Y-direction LBC type at left(1) and right(2) boundaries -!! Module MODD_PARAM1 : contains declaration of the parameterizations' names -!! -!! REFERENCE -!! --------- -!! -!! Book 2 -!! -!! AUTHOR -!! ------ -!! -!! V.Masson Meteo-France -!! -!! MODIFICATIONS -!! ------------- -!! Original 01/01/95 -!! Sept. 21, 1995 (J.Stein and V.Masson) surface pressure -!! Jan. 09, 1996 (V. Masson) pressure function deduced from -!! hydrostatic pressure -!! Jan. 31, 1996 (V. Masson) possibility to initialize -!! atmospheric fields from MESONH file -!! Mar. 18, 1996 (V. Masson) new vertical extrapolation of Ts -!! in case of initialization with MESONH file -!! Apr 17, 1996 (J. Stein ) change the DEFAULT_DESFM CALL -!! May 25, 1996 (V. Masson) Variable CSTORAGE_TYPE -!! Aug 26, 1996 (V. Masson) Only thinshell approximation is -!! currently available. -!! Sept 24, 1996 (V. Masson) add writing of varaibles for -!! nesting ('DAD_NAME', 'DXRATIO', 'DYRATIO') -!! Oct 11, 1996 (V. Masson) L1D and L2D configurations -!! Oct 28, 1996 (V. Masson) add deallocations and NVERB -!! default set to 1 -!! Dec 02, 1996 (V. Masson) vertical interpolation of -!! surface fields in aladin case -!! Dec 12, 1996 (V. Masson) add LS vertical velocity -!! Jan 16, 1997 (J. Stein) Durran's anelastic system -!! May 07, 1997 (V. Masson) add LS tke -!! Jun 27, 1997 (V. Masson) add absolute pressure -!! Jul 09, 1997 (V. Masson) add namelist NAM_REAL_CONF -!! Jul 10, 1997 (V. Masson) add LS epsilon -!! Aug 25, 1997 (V. Masson) add computing time analysis -!! Jan 20, 1998 (J. Stein) add LB and LS fields -!! Apr, 30, 1998 (V. Masson) Large scale VEG and LAI -!! Jun, 04, 1998 (V. Masson) Large scale D2 and Aladin ISBA -!! files -!! Jun, 04, 1998 (V. Masson) Add new soil interface var. -!! Jan 20, 1999 (J. Stein) add a Boundaries call -!! March 15 1999 (J. Pettre, V. Bousquet and V. Masson) -!! initialization from GRIB files -!! Jul 2000 (F.solmon/V.Masson) Adaptation for patch -!! according to GRIB or MESONH case -!! Nov 22, 2000 (P.Tulet, I. Mallet) initialization -!! from GRIB MOCAGE file -!! Fev 01, 2001 (D.Gazen) add module MODD_NSV for NSV variable -!! Jul 02, 2001 (J.Stein) add LCARTESIAN case -!! Oct 15, 2001 (I.Mallet) allow namelists in different orders -!! Dec 2003 (V.Masson) removes surface calls -!! Jun 01, 2002 (O.Nuissier) filtering of tropical cyclone -!! Aou 09, 2005 (D.Barbary) add CDADATMFILE CDADBOGFILE -!! May 2006 Remove KEPS -!! Feb 02, 2012 (C. Mari) interpolation from MOZART -!! add call to READ_CHEM_NETCDF_CASE & -!! VER_PREP_NETCDF_CASE -!! Mar 2012 Add NAM_NCOUT for netcdf output -!! July 2013 (Bosseur & Filippi) Adds Forefire -!! Mars 2014 (J.Escobar) Missing 'full' UPDATE_METRICS for arp2lfi // run -!! April 2014 (G.TANGUY) Add LCOUPLING -!! 2014 (M.Faivre) -!! Fevr 2015 (M.Moge) Cleaning up -!! Aug 2015 (M.Moge) removing EXTRAPOL on XDXX and XDYY in part 8 -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! M.Leriche 2015 : add LUSECHEM dans NAM_CH_CONF -!! Feb 02, 2012 (C. Mari & BV) interpolation from CAMS -!! add call to READ_CAMS_NETCDF_CASE & -!! VER_PREP_NETCDF_CASE -!! Modification 01/2016 (JP Pinty) Add LIMA -!! Modification 02/2016 (JP Pinty) Convert CAMS mix ratio to nbr conc -! -!! 06/2016 (G.Delautier) phasage surfex 8 -!! P.Wautelet : 08/07/2016 : removed MNH_NCWRIT define -!! B.VIE 2016 : LIMA -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! S. Bielli 02/2019: sea salt: significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 20/03/2019: missing use MODI_INIT_SALT -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! T.Nagel 02/2021: add IBM -! P. Wautelet 06/07/2021: use FINALIZE_MNH -!! M. Leriche 26/01/2022: add reading of CAMS reanalysis for chemistry -!! and/or for LIMA -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_BUDGET, ONLY: TBUCONF_ASSOCIATE -USE MODD_CH_M9_n -USE MODD_CH_MNHC_n, ONLY: LUSECHAQ_n=>LUSECHAQ,LUSECHIC_n=>LUSECHIC, LUSECHEM_n=>LUSECHEM -USE MODD_CONF -USE MODD_CONF_n -USE MODD_CST -USE MODD_DIM_n -!UPG*PT -USE MODD_CH_AEROSOL -USE MODD_DUST, ONLY: LDUST, NMODE_DST, CRGUNITD, XINISIG, XINIRADIUS, XN0MIN,& - LDSTCAMS -!UPG*PT - -USE MODD_DYN_n, CPRESOPT_n=>CPRESOPT, LRES_n=>LRES, XRES_n=>XRES , NITR_n=>NITR -USE MODD_FIELD_n -USE MODD_GR_FIELD_n -USE MODD_GRID -USE MODD_GRID_n -USE MODD_HURR_CONF -USE MODD_IBM_LSF, ONLY: CIBM_TYPE, LIBM_LSF, NIBM_SMOOTH, XIBM_SMOOTH -USE MODD_IBM_PARAM_n, ONLY: XIBM_LS -USE MODD_IO, ONLY: TFILEDATA, TFILE_SURFEX -USE MODD_LBC_n -USE MODD_LES, ONLY: LES_ASSOCIATE -USE MODD_LSFIELD_n -USE MODD_LUNIT, ONLY: TPGDFILE,TLUOUT0,TOUTDATAFILE -USE MODD_LUNIT_n, ONLY: CINIFILE,TINIFILE,TLUOUT -USE MODD_METRICS_n -USE MODD_MNH_SURFEX_n -USE MODD_NESTING -USE MODD_NSV -USE MODD_PARAMETERS -USE MODD_PARAM_n -USE MODD_PREP_REAL -USE MODD_REF_n -!UPG*PT -USE MODD_SALT, ONLY: LSALT, NMODE_SLT, CRGUNITS, XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT,& - LSLTCAMS -USE MODD_CH_AERO_n, ONLY: XM3D, XRHOP3D, XSIG3D, XRG3D, XN3D, XCTOTA3D -!UPG*PT -USE MODD_TURB_n -! -USE MODE_EXTRAPOL -use mode_field, only: Alloc_field_scalars, Ini_field_list, Ini_field_scalars -USE MODE_FINALIZE_MNH, only: FINALIZE_MNH -USE MODE_GRIDCART -USE MODE_GRIDPROJ -USE MODE_IO, only: IO_Init -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_IO_FIELD_WRITE, only: IO_Header_write -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list, IO_File_find_byname -USE MODE_ll -USE MODE_MODELN_HANDLER -USE MODE_MPPDB -USE MODE_MSG -USE MODE_POS -USE MODE_SPLITTINGZ_ll -! -USE MODI_BOUNDARIES -USE MODI_COMPARE_DAD -USE MODI_DEALLOCATE_MODEL1 -USE MODI_DEALLOC_PARA_LL -USE MODI_DEFAULT_DESFM_n -USE MODI_ERROR_ON_TEMPERATURE -USE MODI_IBM_INIT_LS -USE MODI_INI_PROG_VAR -USE MODI_INIT_SALT -USE MODI_LIMA_MIXRAT_TO_NCONC -USE MODI_METRICS -USE MODI_MNHREAD_ZS_DUMMY_n -USE MODI_MNHWRITE_ZS_DUMMY_n -USE MODI_OPEN_PRC_FILES -USE MODI_PREP_SURF_MNH -USE MODI_PRESSURE_IN_PREP -USE MODI_READ_ALL_DATA_GRIB_CASE -USE MODI_READ_ALL_DATA_MESONH_CASE -USE MODI_READ_ALL_NAMELISTS -!UPG*PT -!USE MODI_READ_CAMS_DATA_NETCDF_CASE -!USE MODI_READ_CHEM_DATA_NETCDF_CASE -USE MODI_READ_CHEM_DATA_MOZART_CASE -USE MODI_READ_CHEM_DATA_CAMS_CASE -USE MODI_READ_LIMA_DATA_NETCDF_CASE -USE MODI_AER2LIMA -USE MODI_CH_AER_EQM_INIT_n -!UPG*PT -USE MODI_READ_VER_GRID -USE MODI_SECOND_MNH -USE MODI_SET_REF -USE MODI_UPDATE_METRICS -USE MODI_VER_DYN -USE MODI_VER_PREP_GRIBEX_CASE -USE MODI_VER_PREP_MESONH_CASE -USE MODI_VER_PREP_NETCDF_CASE -USE MODI_VERSION -USE MODI_VER_THERMO -USE MODI_WRITE_DESFM_n -USE MODI_WRITE_LFIFM_n -! -USE MODN_CONF, ONLY: JPHEXT , NHALO -USE MODN_CONFZ -USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_INIT, NMOD_CCN, NMOD_IFN -USE MODE_INI_CST, ONLY: INI_CST -! -IMPLICIT NONE -! -!* 0.1 Declaration of local variables -! ------------------------------ -! -CHARACTER(LEN=28) :: YATMFILE ! name of the Atmospheric file -CHARACTER(LEN=6) :: YATMFILETYPE! type of the Atmospheric file -CHARACTER(LEN=28) :: YCHEMFILE ! name of the Chemical file -CHARACTER(LEN=6) :: YCHEMFILETYPE! type of the Chemical file -!UP*PT -!CHARACTER(LEN=28) :: YCAMSFILE ! name of the input CAMS file -!CHARACTER(LEN=6) :: YCAMSFILETYPE! type of the input CAMS file -CHARACTER(LEN=28) :: YLIMAFILE ! name of the input MACC file -CHARACTER(LEN=6) :: YLIMAFILETYPE! type of the input MACC file -!UP*PT -CHARACTER(LEN=28) :: YSURFFILE ! name of the Surface file -CHARACTER(LEN=6) :: YSURFFILETYPE! type of the Surface file -CHARACTER(LEN=28) :: YPGDFILE ! name of the physiographic data -! ! file -! -CHARACTER(LEN=28) :: YDAD_NAME ! true name of the atmospheric file -! -!* other variables -! -REAL,DIMENSION(:,:,:), ALLOCATABLE:: ZJ ! Jacobian -! -!* file management variables and counters -! -INTEGER :: ILUOUT0 ! logical unit for listing file -INTEGER :: IPRE_REAL1 ! logical unit for namelist file -INTEGER :: IRESP ! return code in FM routines -LOGICAL :: GFOUND ! Return code when searching namelist -INTEGER :: NIU,NJU,NKU ! Upper bounds in x,y,z directions -! -REAL :: ZSTART, ZEND, ZTIME1, ZTIME2, ZTOT, ZALL ! for computing time analysis -REAL :: ZMISC, ZREAD, ZHORI, ZPREP, ZSURF, ZTHERMO, ZDYN, ZDIAG, ZWRITE -REAL :: ZDG ! diagnostics time in routines -INTEGER :: IINFO_ll ! return code of // routines -! Namelist model variables -CHARACTER(LEN=5) :: CPRESOPT -INTEGER :: NITR -LOGICAL :: LRES -REAL :: XRES -LOGICAL :: LSHIFT ! flag to perform vertical shift or not. -LOGICAL :: LDUMMY_REAL ! flag to read and interpolate - !dummy fields from GRIBex file -INTEGER :: JRR ! loop counter for moist var. -LOGICAL :: LUSECHAQ -LOGICAL :: LUSECHIC -LOGICAL :: LUSECHEM -INTEGER :: JN -! -TYPE(TFILEDATA),POINTER :: TZATMFILE => NULL() -TYPE(TFILEDATA),POINTER :: TZPRE_REAL1FILE => NULL() -! -! -!* 0.3 Declaration of namelists -! ------------------------ -! -NAMELIST/NAM_REAL_CONF/ NVERB, CEQNSYS, CPRESOPT, LSHIFT, LDUMMY_REAL, & - LRES, XRES, NITR,LCOUPLING, NHALO , JPHEXT -! Filtering and balancing of the large-scale and radar tropical cyclone -NAMELIST/NAM_HURR_CONF/ LFILTERING, CFILTERING, & -XLAMBDA, NK, XLATGUESS, XLONGUESS, XBOXWIND, XRADGUESS, NPHIL, NDIAG_FILT, & -NLEVELR0,LBOGUSSING, & -XLATBOG, XLONBOG, XVTMAXSURF, XRADWINDSURF, & -XMAX, XC, XRHO_Z, XRHO_ZZ, XB_0, XBETA_Z, XBETA_ZZ,& -XANGCONV0, XANGCONV1000, XANGCONV2000, & - CDADATMFILE, CDADBOGFILE - NAMELIST/NAM_AERO_CONF/ LORILAM, LINITPM, LDUST, XINIRADIUSI, XINIRADIUSJ,& - XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT, CRGUNITD,& - LSALT, CRGUNITS, NMODE_DST, XINISIG, XINIRADIUS, XN0MIN,& - XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT, NMODE_SLT, & - LDSTCAMS, LSLTCAMS,CACTCCN,CCLOUD, NMOD_IFN, NMOD_CCN, LAERINIT - -NAMELIST/NAM_CH_CONF/ LUSECHAQ,LUSECHIC,LUSECHEM -! -NAMELIST/NAM_IBM_LSF/ LIBM_LSF, CIBM_TYPE, NIBM_SMOOTH, XIBM_SMOOTH -! -! name of dad of input FM file -INTEGER :: II, IJ, IGRID, ILENGTH -CHARACTER (LEN=100) :: HCOMMENT -TYPE(LIST_ll), POINTER :: TZFIELDS_ll=>NULL() ! list of fields to exchange -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBXRHO, ZLBYRHO -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBXZZ, ZLBYZZ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBXPABST, ZLBYPABST -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBXRM, ZLBYRM -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBXTHM, ZLBYTHM -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZLBXSVM, ZLBYSVM -! -INTEGER :: ILBX,ILBY,IIB,IJB,IIE,IJE -LOGICAL :: GAERINIT -!------------------------------------------------------------------------------- -! -CALL MPPDB_INIT() -! -CALL GOTO_MODEL(1,ONOFIELDLIST=.TRUE.) -! -ZDIAG = 0. -CALL SECOND_MNH (ZSTART) -! -ZHORI = 0. -ZSURF = 0. -ZTIME1 = ZSTART -! -!* 1. SET DEFAULT VALUES -! ------------------ -! -CALL VERSION -CPROGRAM='REAL ' -! -CALL ALLOC_FIELD_SCALARS() -CALL TBUCONF_ASSOCIATE() -CALL LES_ASSOCIATE() -CALL DEFAULT_DESFM_n(1) -NRR=1 -IDX_RVT = 1 -! -!------------------------------------------------------------------------------- -! -!* 2. OPENNING OF THE FILES -! --------------------- -CALL IO_Init() -! -CALL OPEN_PRC_FILES(TZPRE_REAL1FILE,YATMFILE, YATMFILETYPE,TZATMFILE & - ,YCHEMFILE,YCHEMFILETYPE & - ,YSURFFILE,YSURFFILETYPE & - ,YPGDFILE,TPGDFILE & -!UPG*PT -! ,YCAMSFILE,YCAMSFILETYPE) - ,YLIMAFILE,YLIMAFILETYPE) -!UPG*PT -ILUOUT0 = TLUOUT0%NLU -TLUOUT => TLUOUT0 -! -IF (YATMFILETYPE=='MESONH') THEN - LSHIFT = .FALSE. -ELSE IF (YATMFILETYPE=='GRIBEX') THEN - LSHIFT = .TRUE. -ELSE - LSHIFT = .TRUE. - WRITE(ILUOUT0,FMT=*) 'HATMFILETYPE WAS SET TO: '//TRIM(YATMFILETYPE) - WRITE(ILUOUT0,FMT=*) 'ONLY TWO VALUES POSSIBLE FOR HATMFILETYPE:' - WRITE(ILUOUT0,FMT=*) 'EITHER MESONH OR GRIBEX' - WRITE(ILUOUT0,FMT=*) '-> JOB ABORTED' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_REAL_CASE','') -END IF -! -LCPL_AROME=.FALSE. -LCOUPLING=.FALSE. -! -!------------------------------------------------------------------------------- -! -!* 3. INITIALIZATION OF PHYSICAL CONSTANTS -! ------------------------------------ -! -CALL INI_CST -! -!------------------------------------------------------------------------------- -! -!* 4. READING OF NAMELIST -! ------------------- -! -!* 4.1 reading of configuration variables -! -IPRE_REAL1 = TZPRE_REAL1FILE%NLU -! -CALL INIT_NMLVAR -CALL POSNAM( TZPRE_REAL1FILE, 'NAM_REAL_CONF', GFOUND ) -IF (GFOUND) READ(IPRE_REAL1,NAM_REAL_CONF) -CALL PARAM_LIMA_INIT(CPROGRAM, TZPRE_REAL1FILE, .FALSE., ILUOUT0, .FALSE., .TRUE., .FALSE., 0) -! -CALL INI_FIELD_LIST() -! -CALL INI_FIELD_SCALARS() -! -!* 4.2 reading of values of some configuration variables in namelist -! -! -!JUAN REALZ from prep_surfex -! -IF (YATMFILETYPE == 'GRIBEX') THEN -! -!* 4.1 Vertical Spatial grid -! -CALL INIT_NMLVAR() -CALL READ_VER_GRID(TZPRE_REAL1FILE) -! -CALL IO_Field_read(TPGDFILE,'IMAX',NIMAX) -CALL IO_Field_read(TPGDFILE,'JMAX',NJMAX) -! -NIMAX_ll=NIMAX !! _ll variables are global variables -NJMAX_ll=NJMAX !! but the old names are kept in PRE_IDEA1.nam file -! -CALL SET_JP_ll(JPMODELMAX,JPHEXT,JPVEXT,JPHEXT) -CALL SET_DAD0_ll() -!JUAN 4/04/2014 correction for PREP_REAL_CASE on Gribex files -!CALL SET_DIM_ll(NIMAX_ll, NJMAX_ll, 128) -CALL SET_DIM_ll(NIMAX_ll, NJMAX_ll, NKMAX) -CALL SET_LBX_ll('OPEN',1) -CALL SET_LBY_ll('OPEN', 1) -CALL SET_XRATIO_ll(1, 1) -CALL SET_YRATIO_ll(1, 1) -CALL SET_XOR_ll(1, 1) -CALL SET_XEND_ll(NIMAX_ll+2*JPHEXT, 1) -CALL SET_YOR_ll(1, 1) -CALL SET_YEND_ll(NJMAX_ll+2*JPHEXT, 1) -CALL SET_DAD_ll(0, 1) -!JUANZ -!CALL INI_PARA_ll(IINFO_ll) -CALL INI_PARAZ_ll(IINFO_ll) -!JUANZ - -! -! sizes of arrays of the extended sub-domain -! -CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX) -!!$CALL GET_DIM_EXT_ll('B',NIU,NJU) -!!$CALL GET_INDICE_ll(NIB,NJB,NIE,NJE) -!!$CALL GET_OR_ll('B',IXOR,IYOR) -ENDIF -!JUAN REALZ -! -LDUMMY_REAL= .FALSE. -LFILTERING= .FALSE. -CFILTERING= 'UVT ' -XLATGUESS= XUNDEF ; XLONGUESS= XUNDEF ; XBOXWIND=XUNDEF; XRADGUESS= XUNDEF -NK=50 ; XLAMBDA=0.2 ; NPHIL=24 -NLEVELR0=15 -NDIAG_FILT=-1 -LBOGUSSING= .FALSE. -XLATBOG= XUNDEF ; XLONBOG= XUNDEF -XVTMAXSURF= XUNDEF ; XRADWINDSURF= XUNDEF -XMAX=16000. ; XC=0.7 ; XRHO_Z=-0.3 ; XRHO_ZZ=0.9 -XB_0=1.65 ; XBETA_Z=-0.5 ; XBETA_ZZ=0.35 -XANGCONV0=0. ; XANGCONV1000=0. ; XANGCONV2000=0. -CDADATMFILE=' ' ; CDADBOGFILE=' ' -! -CALL INIT_NMLVAR -CALL POSNAM( TZPRE_REAL1FILE, 'NAM_REAL_CONF', GFOUND ) -IF (GFOUND) READ(IPRE_REAL1,NAM_REAL_CONF) -CALL POSNAM( TZPRE_REAL1FILE, 'NAM_HURR_CONF', GFOUND ) -IF (GFOUND) READ(IPRE_REAL1,NAM_HURR_CONF) -CALL POSNAM( TZPRE_REAL1FILE, 'NAM_CH_CONF', GFOUND ) -IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CH_CONF) -CALL UPDATE_MODD_FROM_NMLVAR -CALL POSNAM( TZPRE_REAL1FILE, 'NAM_AERO_CONF', GFOUND ) -IF (GFOUND) READ(IPRE_REAL1,NAM_AERO_CONF) -CALL POSNAM( TZPRE_REAL1FILE, 'NAM_CONFZ', GFOUND ) -IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CONFZ) -CALL POSNAM( TZPRE_REAL1FILE, 'NAM_IBM_LSF' , GFOUND ) -IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_IBM_LSF) -! -GAERINIT = LAERINIT - -! Sea salt -CALL INIT_SALT -! -!* 4.3 set soil scheme to ISBA for initialization from GRIB -! -IF (YATMFILETYPE=='GRIBEX') THEN - CLBCX(:) ='OPEN' - CLBCY(:) ='OPEN' -END IF -! -CALL SECOND_MNH(ZTIME2) -ZMISC = ZTIME2 - ZTIME1 -!------------------------------------------------------------------------------- -! -!* 5. READING OF THE INPUT DATA -! ------------------------- -! -ZTIME1 = ZTIME2 -! -IF (YATMFILETYPE=='MESONH') THEN - CALL READ_ALL_DATA_MESONH_CASE(TZPRE_REAL1FILE,YATMFILE,TPGDFILE,YDAD_NAME) -ELSE IF (YATMFILETYPE=='GRIBEX') THEN - IF(LEN_TRIM(YCHEMFILE)>0 .AND. YCHEMFILETYPE=='GRIBEX')THEN - CALL READ_ALL_DATA_GRIB_CASE('ATM1',TZPRE_REAL1FILE,YATMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) - ELSE - CALL READ_ALL_DATA_GRIB_CASE('ATM0',TZPRE_REAL1FILE,YATMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) - END IF -! - YDAD_NAME=' ' -END IF -LAERINIT = GAERINIT -! -IF (NIMAX==1 .AND. NJMAX==1) THEN - L1D=.TRUE. - L2D=.FALSE. -ELSE IF (NJMAX==1) THEN - L1D=.FALSE. - L2D=.TRUE. -ELSE - L1D=.FALSE. - L2D=.FALSE. -END IF -! -! UPG*PT -!* 5.1 reading of the input chemical data -! -!IF(LEN_TRIM(YCHEMFILE)>0)THEN -! ! read again Nam_aero_conf -! CALL POSNAM( TZPRE_REAL1FILE, 'NAM_AERO_CONF', GFOUND ) -! IF (GFOUND) READ(IPRE_REAL1,NAM_AERO_CONF) -! IF(YCHEMFILETYPE=='GRIBEX') & -! CALL READ_ALL_DATA_GRIB_CASE('CHEM',TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) -! IF (YCHEMFILETYPE=='NETCDF') & -! CALL READ_CHEM_DATA_NETCDF_CASE(TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) -!END IF -! -!* 5.2 reading the input CAMS data -! -!IF(LEN_TRIM(YCAMSFILE)>0)THEN -! IF(YCAMSFILETYPE=='NETCDF') THEN -! CALL READ_CAMS_DATA_NETCDF_CASE(TZPRE_REAL1FILE,YCAMSFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) -! ELSE -! CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_REAL_CASE','CANNOT READ CAMS GRIB FILES YET') -! END IF -!END IF -!* 5.1 reading CAMS or MACC files for init LIMA -! -IF(LEN_TRIM(YLIMAFILE)>0)THEN - IF(YLIMAFILETYPE=='NETCDF') THEN - CALL READ_LIMA_DATA_NETCDF_CASE(TZPRE_REAL1FILE,YLIMAFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) - ELSE - WRITE(ILUOUT0,FMT=*) - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_REAL_CASE','Pb in MACC/CAMS file') - STOP - END IF -END IF -! -!* 5.2 reading of the input chemical data + dusts + salts if needed -! -IF(LEN_TRIM(YCHEMFILE)>0)THEN - ! read again Nam_aero_conf - CALL POSNAM( TZPRE_REAL1FILE, 'NAM_AERO_CONF', GFOUND ) - IF (GFOUND) READ(IPRE_REAL1,NAM_AERO_CONF) - IF(YCHEMFILETYPE=='GRIBEX') & - CALL READ_ALL_DATA_GRIB_CASE('CHEM',TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) - IF (YCHEMFILETYPE=='MOZART') & - CALL READ_CHEM_DATA_MOZART_CASE(TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) - IF (YCHEMFILETYPE=='CAMSEU') & - CALL READ_CHEM_DATA_CAMS_CASE(TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB, & - LDUMMY_REAL,LUSECHEM) -END IF - -!UPG*PT -! -CALL IO_File_close(TZPRE_REAL1FILE) -! -CALL SECOND_MNH(ZTIME2) -ZREAD = ZTIME2 - ZTIME1 - ZHORI -!------------------------------------------------------------------------------- -! -CALL IO_File_add2list(TINIFILE,CINIFILE,'MNH','WRITE',KLFITYPE=1,KLFIVERB=NVERB) -CALL IO_File_open(TINIFILE) -! -ZTIME1=ZTIME2 -! -!* 6. CONFIGURATION VARIABLES -! ----------------------- -! -!* 6.1 imposed values of some other configuration variables -! -CDCONV='NONE' -CSCONV='NONE' -CRAD='NONE' -CCONF='START' -NRIMX=6 -NRIMY=6 -LHORELAX_UVWTH=.TRUE. -LHORELAX_RV=LUSERV -LHORELAX_RC=LUSERC -LHORELAX_RR=LUSERR -LHORELAX_RI=LUSERI -LHORELAX_RS=LUSERS -LHORELAX_RG=LUSERG -LHORELAX_RH=LUSERH -LHORELAX_SV(:)=.FALSE. -LHORELAX_SVC2R2 = (NSV_C2R2 > 0) -LHORELAX_SVC1R3 = (NSV_C1R3 > 0) -LHORELAX_SVLIMA = (NSV_LIMA > 0) -LHORELAX_SVELEC = (NSV_ELEC > 0) -LHORELAX_SVCHEM = (NSV_CHEM > 0) -LHORELAX_SVCHIC = (NSV_CHIC > 0) -LHORELAX_SVDST = (NSV_DST > 0) -LHORELAX_SVSLT = (NSV_SLT > 0) -LHORELAX_SVAER = (NSV_AER > 0) -LHORELAX_SVPP = (NSV_PP > 0) -#ifdef MNH_FOREFIRE -LHORELAX_SVFF = (NSV_FF > 0) -#endif -LHORELAX_SVCS = (NSV_CS > 0) - -LHORELAX_SVLG = .FALSE. -LHORELAX_SV(1:NSV)=.TRUE. -IF ( CTURB /= 'NONE') THEN - LHORELAX_TKE = .TRUE. -ELSE - LHORELAX_TKE = .FALSE. -END IF -! -! -CSTORAGE_TYPE='TT' -!------------------------------------------------------------------------------- -! -!* 8. COMPUTATION OF GEOMETRIC VARIABLES -! ---------------------------------- -! -ZTIME1 = ZTIME2 -! -ALLOCATE(XMAP(SIZE(XXHAT),SIZE(XYHAT))) -ALLOCATE(XLAT(SIZE(XXHAT),SIZE(XYHAT))) -ALLOCATE(XLON(SIZE(XXHAT),SIZE(XYHAT))) -ALLOCATE(XDXHAT(SIZE(XXHAT))) -ALLOCATE(XDYHAT(SIZE(XYHAT))) -ALLOCATE(XZZ(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT))) -ALLOCATE(ZJ(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT))) -! -IF (LCARTESIAN) THEN - CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,ZJ) - XMAP=1. -ELSE - CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS, & - LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, & - XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, ZJ ) -END IF -! -CALL MPPDB_CHECK2D(XZS,"prep_real_case8:XZS",PRECISION) -CALL MPPDB_CHECK2D(XMAP,"prep_real_case8:XMAP",PRECISION) -CALL MPPDB_CHECK2D(XLAT,"prep_real_case8:XLAT",PRECISION) -CALL MPPDB_CHECK2D(XLON,"prep_real_case8:XLON",PRECISION) -CALL MPPDB_CHECK3D(XZZ,"prep_real_case8:XZZ",PRECISION) -CALL MPPDB_CHECK3D(ZJ,"prep_real_case8:ZJ",PRECISION) -! -ALLOCATE(XDXX(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT))) -ALLOCATE(XDYY(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT))) -ALLOCATE(XDZX(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT))) -ALLOCATE(XDZY(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT))) -ALLOCATE(XDZZ(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT))) -! -!20131024 add update halo -!=> corrects on PDXX calculation in metrics and XDXX !! -CALL ADD3DFIELD_ll( TZFIELDS_ll, XZZ, 'PREP_REAL_CASE::XZZ' ) -CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) -CALL CLEANLIST_ll(TZFIELDS_ll) -! -CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -CALL MPPDB_CHECK3D(XDXX,"prc8-beforeupdate_metrics:PDXX",PRECISION) -CALL MPPDB_CHECK3D(XDYY,"prc8-beforeupdate_metrics:PDYY",PRECISION) -CALL MPPDB_CHECK3D(XDZX,"prc8-beforeupdate_metrics:PDZX",PRECISION) -CALL MPPDB_CHECK3D(XDZY,"prc8-beforeupdate_metrics:PDZY",PRECISION) -! -CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -!20131112 add update_halo for XDYY and XDZY!! -CALL ADD3DFIELD_ll( TZFIELDS_ll, XDXX, 'PREP_REAL_CASE::XDXX' ) -CALL ADD3DFIELD_ll( TZFIELDS_ll, XDZX, 'PREP_REAL_CASE::XDZX' ) -CALL ADD3DFIELD_ll( TZFIELDS_ll, XDYY, 'PREP_REAL_CASE::XDYY' ) -CALL ADD3DFIELD_ll( TZFIELDS_ll, XDZY, 'PREP_REAL_CASE::XDZY' ) -CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) -CALL CLEANLIST_ll(TZFIELDS_ll) - -!CALL EXTRAPOL('W',XDXX,XDZX) -!CALL EXTRAPOL('S',XDYY,XDZY) - -CALL SECOND_MNH(ZTIME2) - -ZMISC = ZMISC + ZTIME2 - ZTIME1 -!------------------------------------------------------------------------------- -! -!* 9. PREPARATION OF THE VERTICAL SHIFT AND INTERPOLATION -! --------------------------------------------------- -! -ZTIME1 = ZTIME2 -! -IF (YATMFILETYPE=='GRIBEX') THEN - CALL VER_PREP_GRIBEX_CASE('ATM ',ZDG) -ELSE IF (YATMFILETYPE=='MESONH') THEN - CALL VER_PREP_MESONH_CASE(ZDG) -END IF -! -IF (LEN_TRIM(YCHEMFILE)>0 .AND. YCHEMFILETYPE=='GRIBEX') THEN - CALL VER_PREP_GRIBEX_CASE('CHEM',ZDG) -END IF -!UPG*PT -!IF ((LEN_TRIM(YCHEMFILE)>0 .AND. YCHEMFILETYPE=='NETCDF') .OR. & -! (LEN_TRIM(YCAMSFILE)>0 .AND. YCAMSFILETYPE=='NETCDF')) THEN -! CALL VER_PREP_NETCDF_CASE(ZDG) -!END IF -IF (LEN_TRIM(YCHEMFILE)>0 .AND. ((YCHEMFILETYPE=='MOZART').OR. & - (YCHEMFILETYPE=='CAMSEU'))) THEN - CALL VER_PREP_NETCDF_CASE(ZDG,XSV_LS) - - DEALLOCATE(XSV_LS) -END IF -! -IF (LEN_TRIM(YLIMAFILE)>0 .AND. YLIMAFILETYPE=='NETCDF') THEN - CALL VER_PREP_NETCDF_CASE(ZDG,XSV_LS_LIMA) - DEALLOCATE(XSV_LS_LIMA) -END IF -!UPG*PT -! -CALL SECOND_MNH(ZTIME2) -ZPREP = ZTIME2 - ZTIME1 - ZDG -ZDIAG = ZDIAG + ZDG -!------------------------------------------------------------------------------- -! -!* 10. VERTICAL INTERPOLATION OF ALL THERMODYNAMICAL VARIABLES -! ------------------------------------------------------- -! -ZTIME1 = ZTIME2 -! -ALLOCATE(XPSURF(SIZE(XXHAT),SIZE(XYHAT))) -! -CALL EXTRAPOL('E',XEXNTOP2D) -IF (YATMFILETYPE=='GRIBEX') THEN - CALL VER_THERMO(TINIFILE,LSHIFT,XTHV_MX,XR_MX,XZS_LS,XZSMT_LS,XZMASS_MX,XZFLUX_MX,XPMHP_MX,ZJ, & - XDXX,XDYY,XEXNTOP2D,XPSURF,ZDG ) -ELSE IF (YATMFILETYPE=='MESONH') THEN - CALL VER_THERMO(TINIFILE,LSHIFT,XTHV_MX,XR_MX,XZS_LS,XZSMT_LS,XZMASS_MX,XZFLUX_MX,XPMHP_MX,ZJ, & - XDXX,XDYY,XEXNTOP2D,XPSURF,ZDG, & - XLSTH_MX,XLSRV_MX ) -END IF -! -CALL SECOND_MNH(ZTIME2) -ZTHERMO = ZTIME2 - ZTIME1 - ZDG -ZDIAG = ZDIAG + ZDG -!------------------------------------------------------------------------------- -! -!* 12. VERTICAL INTERPOLATION OF DYNAMICAL VARIABLES -! --------------------------------------------- -! -ZTIME1 = ZTIME2 -IF (YATMFILETYPE=='GRIBEX') THEN - CALL VER_DYN(LSHIFT,XU_MX,XV_MX,XW_MX,XRHOD_MX,XZFLUX_MX,XZMASS_MX,XZS_LS, & - XDXX,XDYY,XDZZ,XDZX,XDZY,ZJ,YATMFILETYPE ) -ELSE IF (YATMFILETYPE=='MESONH') THEN - CALL VER_DYN(LSHIFT,XU_MX,XV_MX,XW_MX,XRHOD_MX,XZFLUX_MX,XZMASS_MX,XZS_LS, & - XDXX,XDYY,XDZZ,XDZX,XDZY,ZJ,YATMFILETYPE, & - XLSU_MX,XLSV_MX,XLSW_MX ) -END IF -! -! -IF (ALLOCATED(XTHV_MX)) DEALLOCATE(XTHV_MX) -IF (ALLOCATED(XR_MX)) DEALLOCATE(XR_MX) -IF (ALLOCATED(XPMHP_MX)) DEALLOCATE(XPMHP_MX) -IF (ALLOCATED(XU_MX)) DEALLOCATE(XU_MX) -IF (ALLOCATED(XV_MX)) DEALLOCATE(XV_MX) -IF (ALLOCATED(XW_MX)) DEALLOCATE(XW_MX) -IF (ALLOCATED(XLSTH_MX)) DEALLOCATE(XLSTH_MX) -IF (ALLOCATED(XLSRV_MX)) DEALLOCATE(XLSRV_MX) -IF (ALLOCATED(XLSU_MX)) DEALLOCATE(XLSU_MX) -IF (ALLOCATED(XLSV_MX)) DEALLOCATE(XLSV_MX) -IF (ALLOCATED(XLSW_MX)) DEALLOCATE(XLSW_MX) -IF (ALLOCATED(XZFLUX_MX)) DEALLOCATE(XZFLUX_MX) -IF (ALLOCATED(XZMASS_MX)) DEALLOCATE(XZMASS_MX) -IF (ALLOCATED(XRHOD_MX)) DEALLOCATE(XRHOD_MX) -IF (ALLOCATED(XEXNTOP2D)) DEALLOCATE(XEXNTOP2D) -IF (ALLOCATED(XZS_LS)) DEALLOCATE(XZS_LS) -IF (ALLOCATED(XZSMT_LS)) DEALLOCATE(XZSMT_LS) -! -!------------------------------------------------------------------------------- -! -!* 13. ANELASTIC CORRECTION -! -------------------- -! -CALL PRESSURE_IN_PREP(XDXX,XDYY,XDZX,XDZY,XDZZ) -! -CALL SECOND_MNH(ZTIME2) -ZDYN = ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 14. INITIALIZATION OF THE REMAINING PROGNOSTIC VARIABLES (COPIES) -! ------------------------------------------------------------- -! -ZTIME1 = ZTIME2 -! -IF(LEN_TRIM(YCHEMFILE)>0 .AND. YCHEMFILETYPE=='MESONH')THEN - CALL INI_PROG_VAR(XTKE_MX,XSV_MX,YCHEMFILE) - LHORELAX_SVCHEM = (NSV_CHEM > 0) - LHORELAX_SVCHIC = (NSV_CHIC > 0) - LHORELAX_SVDST = (NSV_DST > 0) - LHORELAX_SVSLT = (NSV_SLT > 0) - LHORELAX_SVAER = (NSV_AER > 0) -ELSE -! -!UPG*PT -!IF (LEN_TRIM(YCAMSFILE)>0 .AND. YCAMSFILETYPE=='NETCDF') THEN -IF (LEN_TRIM(YLIMAFILE)>0 .AND. YLIMAFILETYPE=='NETCDF') THEN -!UPG*PT - CALL LIMA_MIXRAT_TO_NCONC(XPABST, XTHT, XRT(:,:,:,1), XSV_MX) -END IF -! - CALL INI_PROG_VAR(XTKE_MX,XSV_MX) -END IF -! - -! Initialization of ORILAM variables -IF (LORILAM) THEN - IF (.NOT.(ASSOCIATED(XN3D))) ALLOCATE(XN3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XRG3D))) ALLOCATE(XRG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XSIG3D))) ALLOCATE(XSIG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XRHOP3D))) ALLOCATE(XRHOP3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XM3D))) ALLOCATE(XM3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE*3)) - IF (.NOT.(ASSOCIATED(XCTOTA3D))) & - ALLOCATE(XCTOTA3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NSP+NCARB+NSOA,JPMODE)) - - CALL CH_AER_EQM_INIT_n(XSVT(:,:,:,NSV_CHEMBEG:NSV_CHEMEND),& - XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),& - XM3D,XRHOP3D,XSIG3D,& - XRG3D,XN3D, XRHODREF, XCTOTA3D) -END IF -! -! Initialization LIMA variables by ORILAM -IF (CCLOUD == 'LIMA' .AND. ((LORILAM).OR.(LDUST).OR.(LSALT))) THEN - - ! Init LIMA by ORILAM - CALL AER2LIMA(XSVT, XRHODREF, XRT(:,:,:,1), XPABST, XTHT,XZZ) - - ! Init LB LIMA by ORILAM - ALLOCATE(ZLBXRHO(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3))) - ALLOCATE(ZLBYRHO(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3))) - ALLOCATE(ZLBXPABST(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3))) - ALLOCATE(ZLBYPABST(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3))) - ALLOCATE(ZLBXTHM(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3))) - ALLOCATE(ZLBYTHM(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3))) - ALLOCATE(ZLBXZZ(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3))) - ALLOCATE(ZLBYZZ(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3))) - ALLOCATE(ZLBXRM(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3))) - ALLOCATE(ZLBYRM(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3))) - ALLOCATE(ZLBXSVM(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3), SIZE(XLBXSVM,4))) - ALLOCATE(ZLBYSVM(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3), SIZE(XLBXSVM,4))) - - ILBX=SIZE(XLBXSVM,1)/2-JPHEXT - ILBY=SIZE(XLBYSVM,2)/2-JPHEXT - - CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) - - ZLBXRHO(1:ILBX+1,:,:) = XRHODREF(IIB-1:IIB-1+ILBX,:,:) - ZLBXRHO(ILBX+2:2*ILBX+2,:,:) = XRHODREF(IIE+1-ILBX:IIE+1,:,:) - ZLBYRHO(:,1:ILBY+1,:) = XRHODREF(:,IJB-1:IJB-1+ILBY,:) - ZLBYRHO(:,ILBY+2:2*ILBY+2,:) = XRHODREF(:,IJE+1-ILBY:IJE+1,:) - ZLBXPABST(1:ILBX+1,:,:) = XPABST(IIB-1:IIB-1+ILBX,:,:) - ZLBXPABST(ILBX+2:2*ILBX+2,:,:) = XPABST(IIE+1-ILBX:IIE+1,:,:) - ZLBYPABST(:,1:ILBY+1,:) = XPABST(:,IJB-1:IJB-1+ILBY,:) - ZLBYPABST(:,ILBY+2:2*ILBY+2,:) = XPABST(:,IJE+1-ILBY:IJE+1,:) - ZLBXTHM(1:ILBX+1,:,:) = XTHT(IIB-1:IIB-1+ILBX,:,:) - ZLBXTHM(ILBX+2:2*ILBX+2,:,:) = XTHT(IIE+1-ILBX:IIE+1,:,:) - ZLBYTHM(:,1:ILBY+1,:) = XTHT(:,IJB-1:IJB-1+ILBY,:) - ZLBYTHM(:,ILBY+2:2*ILBY+2,:) = XTHT(:,IJE+1-ILBY:IJE+1,:) - ZLBXZZ(1:ILBX+1,:,:) = XZZ(IIB-1:IIB-1+ILBX,:,:) - ZLBXZZ(ILBX+2:2*ILBX+2,:,:) = XZZ(IIE+1-ILBX:IIE+1,:,:) - ZLBYZZ(:,1:ILBY+1,:) = XZZ(:,IJB-1:IJB-1+ILBY,:) - ZLBYZZ(:,ILBY+2:2*ILBY+2,:) = XZZ(:,IJE+1-ILBY:IJE+1,:) - ZLBXSVM(1:ILBX+1,:,:,:) = XSVT(IIB-1:IIB-1+ILBX,:,:,:) - ZLBXSVM(ILBX+2:2*ILBX+2,:,:,:) = XSVT(IIE+1-ILBX:IIE+1,:,:,:) - ZLBYSVM(:,1:ILBY+1,:,:) = XSVT(:,IJB-1:IJB-1+ILBY,:,:) - ZLBYSVM(:,ILBY+2:2*ILBY+2,:,:) = XSVT(:,IJE+1-ILBY:IJE+1,:,:) - ZLBXRM(1:ILBX+1,:,:) = XRT(IIB-1:IIB-1+ILBX,:,:,1) - ZLBXRM(ILBX+2:2*ILBX+2,:,:) = XRT(IIE+1-ILBX:IIE+1,:,:,1) - ZLBYRM(:,1:ILBY+1,:) = XRT(:,IJB-1:IJB-1+ILBY,:,1) - ZLBYRM(:,ILBY+2:2*ILBY+2,:) = XRT(:,IJE+1-ILBY:IJE+1,:,1) - - - CALL AER2LIMA(ZLBXSVM, ZLBXRHO, ZLBXRM(:,:,:), ZLBXPABST, ZLBXTHM, ZLBXZZ) - CALL AER2LIMA(ZLBYSVM, ZLBYRHO, ZLBYRM(:,:,:), ZLBYPABST, ZLBYTHM, ZLBYZZ) - - DEALLOCATE(ZLBXRHO) - DEALLOCATE(ZLBYRHO) - DEALLOCATE(ZLBXPABST) - DEALLOCATE(ZLBYPABST) - DEALLOCATE(ZLBXTHM) - DEALLOCATE(ZLBYTHM) - DEALLOCATE(ZLBXZZ) - DEALLOCATE(ZLBYZZ) - DEALLOCATE(ZLBXRM) - DEALLOCATE(ZLBYRM) - DEALLOCATE(ZLBXSVM) - DEALLOCATE(ZLBYSVM) -END IF -! -IF (ALLOCATED(XSV_MX)) DEALLOCATE(XSV_MX) -IF (ALLOCATED(XTKE_MX)) DEALLOCATE(XTKE_MX) -! -CALL BOUNDARIES ( & - 0.,CLBCX,CLBCY,NRR,NSV,1, & - XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & - XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & - XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XRHODJ,XRHODREF, & - XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT ) -! -CALL SECOND_MNH(ZTIME2) -ZMISC = ZMISC + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 15. Error on temperature during interpolations -! ------------------------------------------ -! -ZTIME1 = ZTIME2 -! -IF (YATMFILETYPE=='GRIBEX' .AND. NVERB>1) THEN - CALL ERROR_ON_TEMPERATURE(XT_LS,XPMASS_LS,XPABST,XPS_LS,XPSURF) -END IF -! -IF (YATMFILETYPE=='GRIBEX') THEN - DEALLOCATE(XT_LS) - DEALLOCATE(XPMASS_LS) - DEALLOCATE(XPS_LS) -END IF -! -IF (ALLOCATED(XPSURF)) DEALLOCATE(XPSURF) -! -CALL SECOND_MNH(ZTIME2) -ZDIAG = ZDIAG + ZTIME2 - ZTIME1 -!------------------------------------------------------------------------------- -! -!* 16. INITIALIZE LEVELSET FOR IBM -! --------------------------- -! -IF (LIBM_LSF) THEN - ! - IF (.NOT.LCARTESIAN) THEN - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','IBM can only be used with cartesian coordinates') - ENDIF - ! - CALL GET_DIM_EXT_ll('B',NIU,NJU) - NKU=NKMAX+2*JPVEXT - ! - ALLOCATE(XIBM_LS(NIU,NJU,NKU,4)) - ! - CALL IBM_INIT_LS(XIBM_LS) - ! -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 17. WRITING OF THE MESO-NH FM-FILE -! ------------------------------ -! -ZTIME1 = ZTIME2 -! -CSTORAGE_TYPE='TT' -IF (YATMFILETYPE=='GRIBEX') THEN - CSURF = "EXTE" - DO JRR=1,NRR - IF (JRR==1) THEN - LUSERV=.TRUE. - IDX_RVT = JRR - END IF - IF (JRR==2) THEN - LUSERC=.TRUE. - IDX_RCT = JRR - END IF - IF (JRR==3) THEN - LUSERR=.TRUE. - IDX_RRT = JRR - END IF - IF (JRR==4) THEN - LUSERI=.TRUE. - IDX_RIT = JRR - END IF - IF (JRR==5) THEN - LUSERS=.TRUE. - IDX_RST = JRR - END IF - IF (JRR==6) THEN - LUSERG=.TRUE. - IDX_RGT = JRR - END IF - IF (JRR==7) THEN - LUSERH=.TRUE. - IDX_RHT = JRR - END IF - END DO -END IF -! -CALL WRITE_DESFM_n(1,TINIFILE) -CALL IO_Header_write(TINIFILE,HDAD_NAME=YDAD_NAME) -CALL WRITE_LFIFM_n(TINIFILE,YDAD_NAME) -! -CALL SECOND_MNH(ZTIME2) -ZWRITE = ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 18. OROGRAPHIC and DUMMY PHYSIOGRAPHIC FIELDS -! ----------------------------------------- -! -!* reading in the PGD file -! -CALL MNHREAD_ZS_DUMMY_n(TPGDFILE) -! -!* writing in the output file -! -TOUTDATAFILE => TINIFILE -CALL MNHWRITE_ZS_DUMMY_n(TINIFILE) -! -CALL DEALLOCATE_MODEL1(3) -! -IF (YATMFILETYPE=='MESONH'.AND. YATMFILE/=YPGDFILE) THEN - CALL IO_File_find_byname(TRIM(YATMFILE),TZATMFILE,IRESP) - CALL IO_File_close(TZATMFILE) -END IF -!------------------------------------------------------------------------------- -! -!* 19. INTERPOLATION OF SURFACE VARIABLES -! ---------------------------------- -! -IF (.NOT. LCOUPLING ) THEN - ZTIME1 = ZTIME2 -! - IF (CSURF=="EXTE") THEN - IF (YATMFILETYPE/='MESONH') THEN - CALL SURFEX_ALLOC_LIST(1) - YSURF_CUR => YSURF_LIST(1) - CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.) - ENDIF - CALL GOTO_SURFEX(1) - TFILE_SURFEX => TINIFILE - CALL PREP_SURF_MNH(YSURFFILE,YSURFFILETYPE) - NULLIFY(TFILE_SURFEX) - ENDIF -! - CALL SECOND_MNH(ZTIME2) - ZSURF = ZSURF + ZTIME2 - ZTIME1 -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 20. EPILOGUE -! -------- -! -WRITE(ILUOUT0,*) -WRITE(ILUOUT0,*) -WRITE(ILUOUT0,*) -WRITE(ILUOUT0,*) '**************************************************' -WRITE(ILUOUT0,*) '* PREP_REAL_CASE: PREP_REAL_CASE ends correctly. *' -WRITE(ILUOUT0,*) '**************************************************' -WRITE(ILUOUT0,*) -! -!------------------------------------------------------------------------------- -! -CALL SECOND_MNH (ZEND) -! -ZTOT = ZEND - ZSTART ! for computing time analysis -! -ZALL = ZMISC + ZREAD + ZHORI + ZPREP + ZTHERMO + ZSURF + ZDYN + ZDIAG + ZWRITE -! -WRITE(ILUOUT0,*) -WRITE(ILUOUT0,*) ' ------------------------------------------------------------ ' -WRITE(ILUOUT0,*) '| |' -WRITE(ILUOUT0,*) '| COMPUTING TIME ANALYSIS in PREP_REAL_CASE |' -WRITE(ILUOUT0,*) '| |' -WRITE(ILUOUT0,*) '|------------------------------------------------------------|' -WRITE(ILUOUT0,*) '| | | |' -WRITE(ILUOUT0,*) '| ROUTINE NAME | CPU-TIME | PERCENTAGE % |' -WRITE(ILUOUT0,*) '| | | |' -WRITE(ILUOUT0,*) '|---------------------|-------------------|------------------|' -WRITE(ILUOUT0,*) '| | | |' -WRITE(UNIT=ILUOUT0,FMT=2) ZREAD, 100.*ZREAD/ZTOT -WRITE(UNIT=ILUOUT0,FMT=9) ZHORI, 100.*ZHORI/ZTOT -WRITE(UNIT=ILUOUT0,FMT=3) ZPREP, 100.*ZPREP/ZTOT -WRITE(UNIT=ILUOUT0,FMT=4) ZTHERMO, 100.*ZTHERMO/ZTOT -WRITE(UNIT=ILUOUT0,FMT=6) ZDYN, 100.*ZDYN/ZTOT -WRITE(UNIT=ILUOUT0,FMT=7) ZDIAG, 100.*ZDIAG/ZTOT -WRITE(UNIT=ILUOUT0,FMT=8) ZWRITE, 100.*ZWRITE/ZTOT -WRITE(UNIT=ILUOUT0,FMT=1) ZMISC, 100.*ZMISC/ZTOT -WRITE(UNIT=ILUOUT0,FMT=5) ZSURF, 100.*ZSURF/ZTOT -! -WRITE(UNIT=ILUOUT0,FMT=10) ZTOT , 100.*ZALL/ZTOT -WRITE(ILUOUT0,*) ' ------------------------------------------------------------ ' -! -! FORMATS -! ------- -! -2 FORMAT(' | READING OF DATA | ',F8.3,' | ',F8.3,' |') -9 FORMAT(' | HOR. INTERPOLATIONS | ',F8.3,' | ',F8.3,' |') -3 FORMAT(' | VER_PREP | ',F8.3,' | ',F8.3,' |') -4 FORMAT(' | VER_THERMO | ',F8.3,' | ',F8.3,' |') -6 FORMAT(' | VER_DYN | ',F8.3,' | ',F8.3,' |') -7 FORMAT(' | DIAGNOSTICS | ',F8.3,' | ',F8.3,' |') -8 FORMAT(' | WRITE | ',F8.3,' | ',F8.3,' |') -1 FORMAT(' | MISCELLANEOUS | ',F8.3,' | ',F8.3,' |') -5 FORMAT(' | SURFACE | ',F8.3,' | ',F8.3,' |') -10 FORMAT(' | PREP_REAL_CASE | ',F8.3,' | ',F8.3,' |') -! -!------------------------------------------------------------------------------- -! -IF (LEN_TRIM(YDAD_NAME)>0) THEN - WRITE(ILUOUT0,*) ' ' - WRITE(ILUOUT0,*) ' ------------------------------------------------------------' - WRITE(ILUOUT0,*) '| Nesting allowed |' - WRITE(ILUOUT0,*) '| DAD_NAME="',YDAD_NAME,'" |' - WRITE(ILUOUT0,*) ' ------------------------------------------------------------' - WRITE(ILUOUT0,*) ' ' -ELSE - WRITE(ILUOUT0,*) ' ' - WRITE(ILUOUT0,*) ' ------------------------------------------------------------' - WRITE(ILUOUT0,*) '| Nesting not allowed with a larger-scale model. |' - WRITE(ILUOUT0,*) '| The new file can only be used as model number 1 |' - WRITE(ILUOUT0,*) ' ------------------------------------------------------------' - WRITE(ILUOUT0,*) ' ' -END IF -! -!------------------------------------------------------------------------------- -! -CALL IO_File_close(TINIFILE) -CALL IO_File_close(TPGDFILE) -! -CALL FINALIZE_MNH() -! -!------------------------------------------------------------------------------- -! -CONTAINS - -SUBROUTINE INIT_NMLVAR -CPRESOPT=CPRESOPT_n -LRES=LRES_n -XRES=XRES_n -NITR=NITR_n -LUSECHAQ=LUSECHAQ_n -LUSECHIC=LUSECHIC_n -LUSECHEM=LUSECHEM_n -END SUBROUTINE INIT_NMLVAR - -SUBROUTINE UPDATE_MODD_FROM_NMLVAR -CPRESOPT_n=CPRESOPT -LRES_n=LRES -XRES_n=XRES -NITR_n=NITR -LUSECHAQ_n=LUSECHAQ -LUSECHIC_n=LUSECHIC -LUSECHEM_n=LUSECHEM -END SUBROUTINE UPDATE_MODD_FROM_NMLVAR - -END PROGRAM PREP_REAL_CASE diff --git a/src/PHYEX/ext/prep_surfex.f90 b/src/PHYEX/ext/prep_surfex.f90 deleted file mode 100644 index 6c3c81277..000000000 --- a/src/PHYEX/ext/prep_surfex.f90 +++ /dev/null @@ -1,208 +0,0 @@ -!MNH_LIC Copyright 2004-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ############################# - PROGRAM PREP_SURFEX -! ############################# -! -!!**** *PREP_SURFEX* - program to write an initial FM file from real case -!! situation containing only surface fields. -!! -!! REFERENCE -!! --------- -!! -!! Book 2 -!! -!! AUTHOR -!! ------ -!! -!! V.Masson Meteo-France -!! -!! MODIFICATIONS -!! ------------- -!! Original 12/2004 (P. Le Moigne) -!! 10/10/2011 J.Escobar call INI_PARAZ_ll -!! 06/2016 (G.Delautier) phasage surfex 8 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -!! 2021 B.Vie LIMA - CAMS coupling -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CONF, ONLY : CPROGRAM,& - L1D, L2D, LPACK -USE MODD_CONF_n, ONLY : CSTORAGE_TYPE -USE MODD_IO, ONLY : TFILEDATA, TFILE_SURFEX -USE MODD_LUNIT, ONLY : TPGDFILE, TLUOUT0 -USE MODD_LUNIT_n, ONLY : CINIFILE, TINIFILE -USE MODD_MNH_SURFEX_n -USE MODD_PARAMETERS, ONLY : JPMODELMAX,JPHEXT,JPVEXT, NUNDEF, XUNDEF -USE MODD_TIME_n, ONLY : TDTCUR -! -use mode_field, only: Ini_field_list, Ini_field_scalars -USE MODE_FINALIZE_MNH, only: FINALIZE_MNH -USE MODE_IO, only: IO_Init -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Header_write -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -USE MODE_ll -USE MODE_MSG -USE MODE_MODELN_HANDLER -USE MODE_SPLITTINGZ_ll -! -USE MODI_OPEN_PRC_FILES -USE MODI_PREP_SURF_MNH -USE MODI_READ_ALL_NAMELISTS -USE MODI_VERSION -USE MODE_INI_CST, ONLY: INI_CST -! -IMPLICIT NONE -! -!* 0.1 Declaration of local variables -! ------------------------------ -! -CHARACTER(LEN=28) :: YATMFILE ! name of the Atmospheric file -CHARACTER(LEN=6) :: YATMFILETYPE ! type of the Atmospheric file -CHARACTER(LEN=28) :: YCHEMFILE ! name of the Chemical file (not used) -CHARACTER(LEN=6) :: YCHEMFILETYPE ! type of the Chemical file (not used) -CHARACTER(LEN=28) :: YCAMSFILE ! name of the input CAMS file -CHARACTER(LEN=6) :: YCAMSFILETYPE ! type of the input CAMS file -CHARACTER(LEN=28) :: YSURFFILE ! name of the Surface file (not used) -CHARACTER(LEN=6) :: YSURFFILETYPE ! type of the Surface file (not used) -CHARACTER(LEN=28) :: YPGDFILE ! name of the physiographic data -! ! file -! -!* file management variables and counters -! -INTEGER :: ILUOUT0 ! logical unit for listing file -INTEGER :: IRESP ! return code in FM routines -! -INTEGER :: IINFO_ll ! return code of // routines -CHARACTER (LEN=100) :: HCOMMENT -INTEGER :: II, IJ, IGRID, ILENGTH -! -TYPE(TFILEDATA),POINTER :: TZATMFILE => NULL() -TYPE(TFILEDATA),POINTER :: TZPRE_REAL1FILE => NULL() -! -!------------------------------------------------------------------------------- -! -! -!* 1. SET DEFAULT VALUES -! ------------------ -! -CALL GOTO_MODEL(1) -! -CALL VERSION -CPROGRAM='REAL ' -CSTORAGE_TYPE='SU' -! -!------------------------------------------------------------------------------- -! -!* 2. OPENNING OF THE FILES -! --------------------- -CALL IO_Init() -! -CALL OPEN_PRC_FILES(TZPRE_REAL1FILE,YATMFILE, YATMFILETYPE,TZATMFILE & - ,YCHEMFILE,YCHEMFILETYPE & - ,YSURFFILE,YSURFFILETYPE & - ,YPGDFILE,TPGDFILE & - ,YCAMSFILE,YCAMSFILETYPE) -ILUOUT0 = TLUOUT0%NLU -! -!------------------------------------------------------------------------------- -! -!* 3. INITIALIZATION OF PHYSICAL CONSTANTS -! ------------------------------------ -! -CALL INI_CST -! -!------------------------------------------------------------------------------- -! -!* 4. READING OF NAMELIST -! ------------------- -! -!* 4.1 reading of configuration variables -! -CALL IO_File_close(TZPRE_REAL1FILE) -! -!* 4.2 reading of values of some configuration variables in namelist -! -CALL INI_FIELD_LIST() -! -CALL INI_FIELD_SCALARS() -! -CALL IO_Field_read(TPGDFILE,'IMAX',II) -CALL IO_Field_read(TPGDFILE,'JMAX',IJ) -CALL SET_JP_ll(JPMODELMAX,JPHEXT,JPVEXT,JPHEXT) -CALL SET_DAD0_ll() -CALL SET_DIM_ll(II, IJ, 1) -CALL SET_LBX_ll('OPEN',1) -CALL SET_LBY_ll('OPEN', 1) -CALL SET_XRATIO_ll(1, 1) -CALL SET_YRATIO_ll(1, 1) -CALL SET_XOR_ll(1, 1) -CALL SET_XEND_ll(II+2*JPHEXT, 1) -CALL SET_YOR_ll(1, 1) -CALL SET_YEND_ll(IJ+2*JPHEXT, 1) -CALL SET_DAD_ll(0, 1) -!JUANZ CALL INI_PARA_ll(IINFO_ll) -CALL INI_PARAZ_ll(IINFO_ll) -! -!------------------------------------------------------------------------------- -! -! -!* 5. PREPARATION OF SURFACE FIELDS -! ----------------------------- -! -!* reading of date -! -IF (YATMFILETYPE=='MESONH') THEN - CALL IO_File_add2list(TZATMFILE,TRIM(YATMFILE),'MNH','READ',KLFITYPE=1,KLFIVERB=1) - CALL IO_File_open(TZATMFILE) - CALL IO_Field_read(TZATMFILE,'DTCUR',TDTCUR) - CALL IO_File_close(TZATMFILE) -ELSE - TDTCUR%nyear = NUNDEF - TDTCUR%nmonth = NUNDEF - TDTCUR%nday = NUNDEF - TDTCUR%xtime = XUNDEF -END IF -! -CALL SURFEX_ALLOC_LIST(1) -YSURF_CUR => YSURF_LIST(1) -CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.) -CALL GOTO_SURFEX(1) -! -CALL IO_File_add2list(TINIFILE,TRIM(CINIFILE),'PGD','WRITE',KLFITYPE=1,KLFIVERB=1) -!The open is done later in PREP_SURF_MNH when domain dimensions are known -! -TFILE_SURFEX => TINIFILE -CALL PREP_SURF_MNH(YATMFILE,YATMFILETYPE,OINIFILEOPEN=.TRUE.) -NULLIFY(TFILE_SURFEX) -! -!------------------------------------------------------------------------------- -! -CALL IO_Header_write(TINIFILE) -CALL IO_Field_write(TINIFILE,'SURF','EXTE') -CALL IO_Field_write(TINIFILE,'L1D', L1D) -CALL IO_Field_write(TINIFILE,'L2D', L2D) -CALL IO_Field_write(TINIFILE,'PACK',LPACK) -! -!------------------------------------------------------------------------------- -WRITE(ILUOUT0,*) ' ' -WRITE(ILUOUT0,*) '----------------------------------' -WRITE(ILUOUT0,*) '| |' -WRITE(ILUOUT0,*) '| PREP_SURFEX ends correctly |' -WRITE(ILUOUT0,*) '| |' -WRITE(ILUOUT0,*) '----------------------------------' -CALL IO_File_close(TINIFILE) -! -CALL FINALIZE_MNH() -!------------------------------------------------------------------------------- -! -END PROGRAM PREP_SURFEX diff --git a/src/PHYEX/ext/profilern.f90 b/src/PHYEX/ext/profilern.f90 deleted file mode 100644 index 425ddf294..000000000 --- a/src/PHYEX/ext/profilern.f90 +++ /dev/null @@ -1,383 +0,0 @@ -!MNH_LIC Copyright 2002-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ########################## -MODULE MODI_PROFILER_n -! ########################## -! -INTERFACE -! - SUBROUTINE PROFILER_n( PZ, PRHODREF, & - PU, PV, PW, PTH, PR, PSV, PTKE, & - PTS, PP, PAER, PCIT, PSEA ) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array -REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! horizontal wind X component -REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component -REAL, DIMENSION(:,:,:), INTENT(IN) :: PW ! vertical wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTH ! potential temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PR ! water mixing ratios -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSV ! Scalar variables -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE ! turbulent kinetic energy -REAL, DIMENSION(:,:), INTENT(IN) :: PTS ! surface temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! pressure -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PAER ! aerosol extinction -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! ice concentration -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! for radar -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE PROFILER_n -! -END INTERFACE -! -END MODULE MODI_PROFILER_n -! -! ######################################################## - SUBROUTINE PROFILER_n( PZ, PRHODREF, & - PU, PV, PW, PTH, PR, PSV, PTKE, & - PTS, PP, PAER, PCIT, PSEA ) -! ######################################################## -! -! -! -!!**** *PROFILER_n* - (advects and) stores -!! stations/s in the model -!! -!! PURPOSE -!! ------- -! -! -!!** METHOD -!! ------ -!! -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! Pierre TULET / Valery Masson * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/02/2002 -!! March 2013 : C.Lac : Corrections for 1D + new fields (RARE,THV,DD,FF) -!! April 2014 : C.Lac : Call RADAR only if ICE3 -!! C.Lac 10/2016 Add visibility diagnostic -!! March,28, 2018 (P. Wautelet) replace TEMPORAL_DIST by DATETIME_DISTANCE -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! M. Taufour 05/07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE -! P. Wautelet 09/02/2022: add message when some variables not computed -! + bugfix: put values in variables in this case -! + move some operations outside a do loop -! P. Wautelet 04/2022: restructure profilers for better performance, reduce memory usage and correct some problems/bugs -! P. Wautelet 01/06/2023: deduplicate code => moved to modd/mode_sensors.f90 -! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_ALLPROFILER_n, ONLY: LDIAG_SURFRAD_PROF -USE MODD_CST, ONLY: XCPD, XG, XP00, XPI, XRD, XRV -USE MODD_DIAG_IN_RUN, ONLY: XCURRENT_TKE_DISS -USE MODD_GRID, ONLY: XBETA, XLON0, XRPK -USE MODD_NSV, ONLY: NSV_C2R2BEG, NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI -USE MODD_PARAMETERS, ONLY: JPVEXT, XUNDEF -USE MODD_PARAM_n, ONLY: CCLOUD, CRAD -USE MODD_PROFILER_n -! -USE MODE_FGAU, ONLY: GAULAG -USE MODE_MSG -USE MODE_SENSOR, ONLY: Sensor_rare_compute, Sensor_wc_compute -USE MODE_STATPROF_TOOLS, ONLY: STATPROF_DIAG_SURFRAD -! -USE MODI_GPS_ZENITH_GRID -USE MODI_WATER_SUM -! -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array -REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! horizontal wind X component -REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component -REAL, DIMENSION(:,:,:), INTENT(IN) :: PW ! vertical wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTH ! potential temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PR ! water mixing ratios -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSV ! Scalar variables -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE ! turbulent kinetic energy -REAL, DIMENSION(:,:), INTENT(IN) :: PTS ! surface temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! pressure -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PAER ! aerosol extinction -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! ice concentration -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! for radar -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -! -! -INTEGER :: IKB -INTEGER :: IKE -INTEGER :: IKU -! -! -REAL, DIMENSION(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4)) :: ZWORK -REAL, DIMENSION(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PAER,4)) :: ZWORK2 -! -INTEGER :: IN ! time index -INTEGER :: JSV ! loop counter -INTEGER :: JK ! loop -INTEGER :: JP ! loop for profilers -INTEGER :: IKRAD -! -REAL,DIMENSION(SIZE(PZ,3)) :: ZU_PROFILER ! horizontal wind speed profile at station location (along x) -REAL,DIMENSION(SIZE(PZ,3)) :: ZV_PROFILER ! horizontal wind speed profile at station location (along y) -REAL,DIMENSION(SIZE(PZ,3)) :: ZFF ! horizontal wind speed profile at station location -REAL,DIMENSION(SIZE(PZ,3)) :: ZDD ! horizontal wind speed profile at station location -REAL,DIMENSION(SIZE(PZ,3)) :: ZRHOD ! dry air density in moist mixing profile at station location -REAL,DIMENSION(SIZE(PZ,3)) :: ZRV ! water vapour mixing ratio profile at station location -REAL,DIMENSION(SIZE(PZ,3)) :: ZT ! temperature profile at station location -REAL,DIMENSION(SIZE(PZ,3)) :: ZTV ! virtual temperature profile at station location -REAL,DIMENSION(SIZE(PZ,3)) :: ZPRES ! pressure profile at station location -REAL,DIMENSION(SIZE(PZ,3)) :: ZE ! water vapour partial pressure profile at station location -REAL,DIMENSION(SIZE(PZ,3)) :: ZZ ! altitude of model levels at station location -REAL,DIMENSION(SIZE(PZ,3)-1) :: ZZHATM ! altitude of mass point levels at station location -REAL :: ZGAM ! rotation between meso-nh base and spherical lat-lon base. -! -REAL :: XZS_GPS ! GPS station altitude -REAL :: ZIWV ! integrated water vapour at station location -REAL :: ZZM_STAT ! altitude at station location -REAL :: ZTM_STAT ! temperature at station location -REAL :: ZTV_STAT ! virtual temperature at station location -REAL :: ZPM_STAT ! pressure at station location -REAL :: ZEM_STAT ! water vapour partial pressure at station location -REAL :: ZZTD_PROFILER ! ZTD at station location -REAL :: ZZHD_PROFILER ! ZHD at station location -REAL :: ZZWD_PROFILER ! ZWD at station location -REAL :: ZZHDR ! ZHD correction at station location -REAL :: ZZWDR ! ZWD correction at station location -! -REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2)) :: ZZTD,ZZHD,ZZWD -REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZTEMP,ZTHV,ZTEMPV -REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZVISIGUL, ZVISIKUN -REAL :: ZK1,ZK2,ZK3 ! k1, k2 and K3 atmospheric refractivity constants -REAL :: ZRDSRV ! XRD/XRV -! -!---------------------------------------------------------------------------- -! -!* 2. PRELIMINARIES -! ------------- -! -!* 2.0 Refractivity coeficients -! ------------------------ -! Bevis et al. (1994) -ZK1 = 0.776 ! K/Pa -ZK2 = 0.704 ! K/Pa -ZK3 = 3739. ! K2/Pa -ZRDSRV=XRD/XRV -! -!* 2.1 Indices -! ------- -! -IKU = SIZE(PZ,3) ! nombre de niveaux sur la verticale -IKB = JPVEXT+1 -IKE = IKU-JPVEXT -! -!---------------------------------------------------------------------------- -! -!* 3.4 instant of storage -! ------------------ -! -IF ( .NOT. TPROFILERS_TIME%STORESTEP_CHECK_AND_SET( IN ) ) RETURN !No profiler storage at this time step -! -!---------------------------------------------------------------------------- -! -!* 8. DATA RECORDING -! -------------- -! -ZTEMP(:,:,:)=PTH(:,:,:)*(PP(:,:,:)/ XP00) **(XRD/XCPD) -! Theta_v -ZTHV(:,:,:) = PTH(:,:,:) / (1.+WATER_SUM(PR(:,:,:,:)))*(1.+PR(:,:,:,1)/ZRDSRV) -! virtual temperature -ZTEMPV(:,:,:)=ZTHV(:,:,:)*(PP(:,:,:)/ XP00) **(XRD/XCPD) -CALL GPS_ZENITH_GRID(PR(:,:,:,1),ZTEMP,PP,ZZTD,ZZHD,ZZWD) - -IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) THEN - ! Gultepe formulation - ZVISIGUL(:,:,:) = 10E5 !default value - WHERE ( (PR(:,:,:,2) /=0. ) .AND. (PSV(:,:,:,NSV_C2R2BEG+1) /=0. ) ) - ZVISIGUL(:,:,:) =1.002/(PR(:,:,:,2)*PRHODREF(:,:,:)*PSV(:,:,:,NSV_C2R2BEG+1))**0.6473 - END WHERE -END IF - -IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) THEN - ! Kunkel formulation - ZVISIKUN(:,:,:) = 10E5 !default value - WHERE ( PR(:,:,:,2) /=0 ) - ZVISIKUN(:,:,:) =0.027/(10**(-8)+(PR(:,:,:,2)/(1+PR(:,:,:,2))*PRHODREF(:,:,:)*1000))**0.88 - END WHERE -END IF -! -PROFILER: DO JP = 1, NUMBPROFILER_LOC - TPROFILERS(JP)%NSTORE_CUR = IN - - ZZ(:) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PZ ) - ZRHOD(:) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PRHODREF ) - ZPRES(:) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PP ) - ZU_PROFILER(:) = TPROFILERS(JP)%INTERP_HOR_FROM_UPOINT( PU ) - ZV_PROFILER(:) = TPROFILERS(JP)%INTERP_HOR_FROM_VPOINT( PV ) - ZGAM = (XRPK * (TPROFILERS(JP)%XLON_CUR - XLON0) - XBETA)*(XPI/180.) - ZFF(:) = SQRT(ZU_PROFILER(:)**2 + ZV_PROFILER(:)**2) - DO JK=1,IKU - IF (ZU_PROFILER(JK) >=0. .AND. ZV_PROFILER(JK) > 0.) & - ZDD(JK) = ATAN(ABS(ZU_PROFILER(JK)/ZV_PROFILER(JK))) * 180./XPI + 180. - IF (ZU_PROFILER(JK) >0. .AND. ZV_PROFILER(JK) <= 0.) & - ZDD(JK) = ATAN(ABS(ZV_PROFILER(JK)/ZU_PROFILER(JK))) * 180./XPI + 270. - IF (ZU_PROFILER(JK) <=0. .AND. ZV_PROFILER(JK) < 0.) & - ZDD(JK) = ATAN(ABS(ZU_PROFILER(JK)/ZV_PROFILER(JK))) * 180./XPI - IF (ZU_PROFILER(JK) <0. .AND. ZV_PROFILER(JK) >= 0.) & - ZDD(JK) = ATAN(ABS(ZV_PROFILER(JK)/ZU_PROFILER(JK))) * 180./XPI + 90. - IF (ZU_PROFILER(JK) == 0. .AND. ZV_PROFILER(JK) == 0.) & - ZDD(JK) = XUNDEF - END DO - ! GPS IWV and ZTD - XZS_GPS=TPROFILERS(JP)%XZ_CUR - IF ( ABS( ZZ(IKB)-XZS_GPS ) < 150 ) THEN ! distance between real and model orography ok - ZRV(:) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PR(:,:,:,1) ) - ZT(:) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZTEMP ) - ZE(:) = ZPRES(:)*ZRV(:)/(ZRDSRV+ZRV(:)) - ZTV(:) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZTEMPV ) - ZZTD_PROFILER = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZZTD ) - ZZHD_PROFILER = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZZHD ) - ZZWD_PROFILER = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZZWD ) - ZIWV = 0. - DO JK=IKB,IKE - ZIWV=ZIWV+ZRHOD(JK)*ZRV(JK)*(ZZ(JK+1)-ZZ(JK)) - END DO - IF (ZZ(IKB) < XZS_GPS) THEN ! station above the model orography - DO JK=IKB+1,IKE - IF ( ZZ(JK) < XZS_GPS) THEN ! whole layer to remove - ZZHDR=( 1.E-6 * ZK1 * ZPRES(JK-1) * ( ZZ(JK) - ZZ(JK-1) ) / ZTV(JK-1)) - ZZWDR=( 1.E-6 * ( (ZK2-ZRDSRV*ZK1) + ( ZK3/ZT(JK-1) ) ) * & - ZE(JK-1)* ( ZZ(JK) - ZZ(JK-1) ) / ZT(JK-1) ) - ZZHD_PROFILER=ZZHD_PROFILER-ZZHDR - ZZWD_PROFILER=ZZWD_PROFILER-ZZWDR - ZZTD_PROFILER=ZZTD_PROFILER-ZZHDR-ZZWDR - ELSE ! partial layer to remove - ZZHDR=( 1.E-6 * ZK1 * ZPRES(JK-1) * ( XZS_GPS - ZZ(JK-1) ) / ZTV(JK-1)) - ZZWDR=( 1.E-6 * ( (ZK2-ZRDSRV*ZK1) + ( ZK3/ZT(JK-1) ) ) * & - ZE(JK-1)* ( XZS_GPS - ZZ(JK-1) ) / ZT(JK-1) ) - ZZHD_PROFILER=ZZHD_PROFILER-ZZHDR - ZZWD_PROFILER=ZZWD_PROFILER-ZZWDR - ZZTD_PROFILER=ZZTD_PROFILER-ZZHDR-ZZWDR - EXIT - END IF - END DO - ELSE ! station below the model orography -! Extrapolate variables below the model orography assuming constant T&Tv gradients, -! constant rv and hydrostatic law - ZZHATM(:)=0.5*(ZZ(1:IKU-1)+ZZ(2:IKU)) - ZZM_STAT=0.5*(XZS_GPS+ZZ(IKB)) - ZTM_STAT=ZT(IKB) + ( (ZZM_STAT-ZZHATM(IKB))*& - ( ZT(IKB)- ZT(IKB+1) )/(ZZHATM(IKB)-ZZHATM(IKB+1)) ) - ZTV_STAT=ZTV(IKB) + ( (ZZM_STAT-ZZHATM(IKB))*& - ( ZTV(IKB)- ZTV(IKB+1) )/(ZZHATM(IKB)-ZZHATM(IKB+1)) ) - ZPM_STAT = ZPRES(IKB) * EXP(XG *(ZZM_STAT-ZZHATM(IKB))& - /(XRD* 0.5 *(ZTV_STAT+ZTV(IKB)))) - ZEM_STAT = ZPM_STAT * ZRV(IKB) / ( ZRDSRV + ZRV(IKB) ) -! add contribution below the model orography - ZZHDR=( 1.E-6 * ZK1 * ZPM_STAT * ( ZZ(IKB) - XZS_GPS ) / ZTV_STAT ) - ZZWDR=( 1.E-6 * ( (ZK2-ZRDSRV*ZK1) + (ZK3/ZTM_STAT) )& - * ZEM_STAT* ( ZZ(IKB) - XZS_GPS ) / ZTM_STAT ) - ZZHD_PROFILER=ZZHD_PROFILER+ZZHDR - ZZWD_PROFILER=ZZWD_PROFILER+ZZWDR - ZZTD_PROFILER=ZZTD_PROFILER+ZZHDR+ZZWDR - END IF - TPROFILERS(JP)%XIWV(IN)= ZIWV - TPROFILERS(JP)%XZTD(IN)= ZZTD_PROFILER - TPROFILERS(JP)%XZWD(IN)= ZZWD_PROFILER - TPROFILERS(JP)%XZHD(IN)= ZZHD_PROFILER - ELSE - CMNHMSG(1) = 'altitude of profiler ' // TRIM( TPROFILERS(JP)%CNAME ) // ' is too far from orography' - CMNHMSG(2) = 'some variables are therefore not computed (IWV, ZTD, ZWD, ZHD)' - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'PROFILER_n', OLOCAL = .TRUE. ) - TPROFILERS(JP)%XIWV(IN)= XUNDEF - TPROFILERS(JP)%XZTD(IN)= XUNDEF - TPROFILERS(JP)%XZWD(IN)= XUNDEF - TPROFILERS(JP)%XZHD(IN)= XUNDEF - END IF - TPROFILERS(JP)%XZON (:,IN) = ZU_PROFILER(:) * COS(ZGAM) + ZV_PROFILER(:) * SIN(ZGAM) - TPROFILERS(JP)%XMER (:,IN) = - ZU_PROFILER(:) * SIN(ZGAM) + ZV_PROFILER(:) * COS(ZGAM) - TPROFILERS(JP)%XFF (:,IN) = ZFF(:) - TPROFILERS(JP)%XDD (:,IN) = ZDD(:) - TPROFILERS(JP)%XW (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PW ) - TPROFILERS(JP)%XTH (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PTH ) - TPROFILERS(JP)%XTHV (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZTHV ) - IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) & - TPROFILERS(JP)%XVISIGUL(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZVISIGUL ) - IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) & - TPROFILERS(JP)%XVISIKUN(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZVISIKUN ) - TPROFILERS(JP)%XZZ (:,IN) = ZZ(:) - TPROFILERS(JP)%XRHOD(:,IN) = ZRHOD(:) - IF (CCLOUD=="LIMA") THEN - TPROFILERS(JP)%XCIZ(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NI) ) - TPROFILERS(JP)%XCCZ(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NC) ) - TPROFILERS(JP)%XCRZ(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NR) ) - ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN - TPROFILERS(JP)%XCIZ(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PCIT ) - END IF - - CALL Sensor_wc_compute( TPROFILERS(JP), IN, PR, PRHODREF ) - CALL Sensor_rare_compute( TPROFILERS(JP), IN, PR, PSV, PRHODREF, PCIT, ZTEMP, ZZ, PSEA ) - !! - TPROFILERS(JP)%XP (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PP ) - ! - DO JSV=1,SIZE(PR,4) - TPROFILERS(JP)%XR (:,IN,JSV) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PR(:,:,:,JSV) ) - END DO - ZWORK(:,:,:,:)=PSV(:,:,:,:) - ZWORK(:,:,1,:)=PSV(:,:,2,:) - DO JSV=1,SIZE(PSV,4) - TPROFILERS(JP)%XSV (:,IN,JSV) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZWORK(:,:,:,JSV) ) - END DO - ZWORK2(:,:,:,:) = 0. - DO JK=IKB,IKE - IKRAD = JK - JPVEXT - ZWORK2(:,:,JK,:)=PAER(:,:,IKRAD,:) - END DO - DO JSV=1,SIZE(PAER,4) - TPROFILERS(JP)%XAER(:,IN,JSV) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZWORK2(:,:,:,JSV) ) - END DO - IF (SIZE(PTKE)>0) TPROFILERS(JP)%XTKE (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PTKE ) - - ! XRHOD_SENSOR is not computed for profilers because not very useful - ! If needed, the interpolation must also be done vertically - ! (and therefore the vertical interpolation coefficients have to be computed) - ! TPROFILERS(JP)%XRHOD_SENSOR(IN) = ... - - IF ( CRAD /= 'NONE' ) TPROFILERS(JP)%XTSRAD(IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PTS ) - ! - IF ( LDIAG_SURFRAD_PROF ) CALL STATPROF_DIAG_SURFRAD(TPROFILERS(JP), IN ) - TPROFILERS(JP)%XTKE_DISS(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( XCURRENT_TKE_DISS ) -END DO PROFILER -! -!---------------------------------------------------------------------------- -! -END SUBROUTINE PROFILER_n diff --git a/src/PHYEX/ext/radar_scattering.f90 b/src/PHYEX/ext/radar_scattering.f90 deleted file mode 100644 index 047cb5800..000000000 --- a/src/PHYEX/ext/radar_scattering.f90 +++ /dev/null @@ -1,2088 +0,0 @@ -!MNH_LIC Copyright 2004-2019 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ######spl - MODULE MODI_RADAR_SCATTERING -! ############################# -! -INTERFACE - SUBROUTINE RADAR_SCATTERING(PT_RAY,PRHODREF_RAY,PR_RAY,PI_RAY,PCIT_RAY,PS_RAY,PG_RAY,PVDOP_RAY, & - PELEV,PX_H,PX_V,PW_H,PW_V,PZE,PBU_MASK_RAY,PCR_RAY,PH_RAY) -REAL, DIMENSION(:,:,:,:,:,:),INTENT(IN) :: PT_RAY ! temperature interpolated along the rays -REAL, DIMENSION(:,:,:,:,:,:),INTENT(IN) :: PRHODREF_RAY ! -REAL, DIMENSION(:,:,:,:,:,:),INTENT(IN) :: PR_RAY ! rainwater mixing ratio interpolated along the rays -REAL, DIMENSION(:,:,:,:,:,:),INTENT(IN) :: PI_RAY ! pristine ice mixing ratio interpolated along the rays -REAL, DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PCIT_RAY ! pristine ice concentration interpolated along the rays -REAL, DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PS_RAY !aggregates mixing ratio interpolated along the rays -REAL, DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PG_RAY ! graupel mixing ratio interpolated along the rays -REAL, DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PVDOP_RAY !Doppler radial velocity interpolated along the rays -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PELEV ! elevation -REAL, DIMENSION(:), INTENT(IN) :: PX_H ! Gaussian horizontal nodes -REAL, DIMENSION(:), INTENT(IN) :: PX_V ! Gaussian vertical nodes -REAL, DIMENSION(:), INTENT(IN) :: PW_H ! Gaussian horizontal weights -REAL, DIMENSION(:), INTENT(IN) :: PW_V ! Gaussian vertical weights -REAL,DIMENSION(:,:,:,:,:), INTENT(INOUT) :: PZE ! 5D matrix (iradar, ielev, iaz, irangestep, ivar) containing the radar variables that will be calculated -!in polar or cartesian projection (same projection as the observation grid) -! convective/stratiform -REAL, DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PBU_MASK_RAY -REAL, DIMENSION(:,:,:,:,:,:),OPTIONAL,INTENT(IN) :: PCR_RAY ! rainwater concentration interpolated along the rays -REAL, DIMENSION(:,:,:,:,:,:),OPTIONAL,INTENT(IN) :: PH_RAY ! hail mixing ratio interpolated along the rays - END SUBROUTINE RADAR_SCATTERING -END INTERFACE -END MODULE MODI_RADAR_SCATTERING -! -! ######spl - SUBROUTINE RADAR_SCATTERING(PT_RAY,PRHODREF_RAY,PR_RAY,PI_RAY,PCIT_RAY, & - PS_RAY,PG_RAY,PVDOP_RAY,PELEV,PX_H,PX_V,PW_H,PW_V,PZE,PBU_MASK_RAY,PCR_RAY,PH_RAY) -! ############################## -! -!!**** *RADAR_SCATTERING* - computes radar reflectivities. -!! -!! PURPOSE -!! ------- -!! Compute equivalent reflectivities of a mixed phase cloud. -!! -!!** METHOD -!! ------ -!! The reflectivities are computed using the n(D) * sigma(D) formula. The -!! equivalent reflectiviy is the sum of the reflectivity produced by the -!! the raindrops and the equivalent reflectivities of the ice crystals. -!! The latter are computed using the mass-equivalent diameter. -!! Four types of diffusion are possible : Rayleigh, Mie, T-matrix, and -!! Rayleigh-Gans (Kerker, 1969, Chap. 10; Battan, 1973, Sec. 5.4; van de -!! Hulst, 1981, Sec. 6.32; Doviak and Zrnic, 1993, p. 249; Bringi and -!! Chandrasekar, 2001, Chap. 2). -!! The integration over diameters for Mie and T-matrix methods is done by -!! using Gauss-Laguerre quadrature (Press et al. 1986). Attenuation is taken -!! into account by computing the extinction efficiency and correcting -!! reflectivities along the beam path. -!! Gaussian quadrature methods are used to model the beam broadening (Gauss- -!! Hermite or Gauss-Legendre, see Press et al. 1986). -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST -!! XLIGHTSPEED -!! XPI -!! Module MODD_ARF -!! -!! REFERENCE -!! --------- -!! Press, W. H., B. P. Flannery, S. A. Teukolsky et W. T. Vetterling, 1986: -!! Numerical Recipes: The Art of Scientific Computing. Cambridge University -!! Press, 818 pp. -!! Probert-Jones, J. R., 1962 : The radar equation in meteorology. Quart. -!! J. Roy. Meteor. Soc., 88, 485-495. -!! -!! AUTHOR -!! ------ -!! O. Caumont & V. Ducrocq * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 26/03/2004 -!! O. Caumont 09/09/2009 minor changes to compute radial velocities when no -!! hydrometeors so as to emulate wind lidar -!! O. Caumont 21/12/2009 correction of bugs to compute KDP. -!! O. Caumont 11/02/2010 thresholding and conversion from linear to -!! log values after interpolation instead of before. -!! G.Tanguy 25/03/2010 Introduction of MODD_TMAT and ALLOCATE/DEALLOCATE -!! C.Augros 2014 New simulator for T matrice -!! G.Delautier 10/2014 : Mise a jour simulateur T-matrice pour LIMA -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT -USE MODD_PARAMETERS -USE MODD_PARAM_ICE_n, ONLY: LSNOW_T_I=>LSNOW_T -USE MODD_RAIN_ICE_DESCR_n, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XDR_I=>XDR,XLBEXR_I=>XLBEXR,& - XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XCR_I=>XCR,& - XALPHAS_I=>XALPHAS,XNUS_I=>XNUS,XDS_I=>XDS,XLBEXS_I=>XLBEXS,& - XLBS_I=>XLBS,XCCS_I=>XCCS,XNS_I=>XNS,XAS_I=>XAS,XBS_I=>XBS,XCXS_I=>XCXS,XCS_I=>XCS,& - XALPHAG_I=>XALPHAG,XNUG_I=>XNUG,XDG_I=>XDG,XLBEXG_I=>XLBEXG,& - XLBG_I=>XLBG,XCCG_I=>XCCG,XAG_I=>XAG,XBG_I=>XBG,XCXG_I=>XCXG,XCG_I=>XCG,& - XALPHAH_I=>XALPHAH,XNUH_I=>XNUH,XDH_I=>XDH,XLBEXH_I=>XLBEXH,& - XLBH_I=>XLBH,XCCH_I=>XCCH,XAH_I=>XAH,XBH_I=>XBH,XCXH_I=>XCXH,XCH_I=>XCH,& - XALPHAI_I=>XALPHAI,XNUI_I=>XNUI,XDI_I=>XDI,XLBEXI_I=>XLBEXI,& - XLBI_I=>XLBI,XAI_I=>XAI,XBI_I=>XBI,XC_I_I=>XC_I,& - XRTMIN_I=>XRTMIN, & - XLBDAS_MAX_I=>XLBDAS_MAX,XLBDAS_MIN_I=>XLBDAS_MIN,XTRANS_MP_GAMMAS_I=>XTRANS_MP_GAMMAS -!!LIMA -USE MODD_PARAM_LIMA_WARM, ONLY: XDR_L=>XDR,XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XCR_L=>XCR -USE MODD_PARAM_LIMA_COLD, ONLY: XDI_L=>XDI,XLBEXI_L=>XLBEXI,XLBI_L=>XLBI,XAI_L=>XAI,XBI_L=>XBI,XC_I_L=>XC_I,& - XDS_L=>XDS,XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,XNS_L=>XNS,XAS_L=>XAS,XBS_L=>XBS,& - XCXS_L=>XCXS,XCS_L=>XCS,& - XLBDAS_MAX_L=>XLBDAS_MAX,XLBDAS_MIN_L=>XLBDAS_MIN,XTRANS_MP_GAMMAS_L=>XTRANS_MP_GAMMAS - -USE MODD_PARAM_LIMA_MIXED, ONLY:XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L=>XCCG,XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG -USE MODD_PARAM_LIMA, ONLY: XALPHAR_L=>XALPHAR,XNUR_L=>XNUR,XALPHAS_L=>XALPHAS,XNUS_L=>XNUS,& - XALPHAG_L=>XALPHAG,XNUG_L=>XNUG, XALPHAI_L=>XALPHAI,XNUI_L=>XNUI,& - XRTMIN_L=>XRTMIN, LSNOW_T_L=>LSNOW_T -!!LIMA -USE MODD_RADAR, ONLY:XLAM_RAD,XSTEP_RAD,NBELEV,NDIFF,LATT,NPTS_GAULAG,LQUAD,XVALGROUND,NDGS, & - LFALL,LWBSCS,LWREFL,XREFLVDOPMIN,XREFLMIN,LSNRT,XSNRMIN -USE MODD_TMAT -! -USE MODE_ARF -USE MODE_FSCATTER -USE MODE_READTMAT -USE MODE_FGAU , ONLY:GAULAG -USE MODI_GAMMA, ONLY:GAMMA -! -USE MODD_LUNIT -USE MODE_IO_FILE, ONLY: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_add2list -USE MODE_MSG - -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -! -REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PT_RAY ! temperature interpolated along the rays -REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PRHODREF_RAY ! -REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PR_RAY ! rainwater mixing ratio interpolated along the rays -REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PI_RAY ! pristine ice mixing ratio interpolated along the rays -REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PCIT_RAY !pristine ice concentration interpolated along the rays -REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PS_RAY !aggregates mixing ratio interpolated along the rays -REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PG_RAY ! graupel mixing ratio interpolated along the rays -REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PVDOP_RAY !Doppler radial velocity interpolated along the rays -REAL,DIMENSION(:,:,:,:), INTENT(IN) :: PELEV ! elevation -REAL,DIMENSION(:), INTENT(IN) :: PX_H ! Gaussian horizontal nodes -REAL,DIMENSION(:), INTENT(IN) :: PX_V ! Gaussian vertical nodes -REAL,DIMENSION(:), INTENT(IN) :: PW_H ! Gaussian horizontal weights -REAL,DIMENSION(:), INTENT(IN) :: PW_V ! Gaussian vertical weights -REAL,DIMENSION(:,:,:,:,:), INTENT(INOUT) :: PZE ! gate equivalent reflectivity factor (horizontal & vertical) -! convective/stratiform -REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PBU_MASK_RAY -! /convective/stratiform -REAL, DIMENSION(:,:,:,:,:,:),OPTIONAL,INTENT(IN) :: PCR_RAY ! rainwater concentration interpolated along the rays -REAL, DIMENSION(:,:,:,:,:,:),OPTIONAL,INTENT(IN) :: PH_RAY ! hail mixing ratio interpolated along the rays -! -!* 0.2 Declarations of local variables : -! -REAL, DIMENSION(:,:,:,:,:,:,:),ALLOCATABLE :: ZREFL -!1: ZHH (dBZ), 2: ZDR, 3: KDP, 4: CSR (0 pr air clair, 1 pour stratiforme, 2 pour convectif) -!5-8: ZER, ZEI, ZES,ZEG -!9 : VRU (vitesse radiale) -!10-13 : AER, AEI, AES, AEG -!14-17: ATR, ATI, ATS, ATG -!18-20: RhoHV, PhiDP, DeltaHV - -REAL, DIMENSION(:,:,:,:,:,:,:),ALLOCATABLE :: ZAELOC ! local attenuation -REAL, DIMENSION(:,:,:),ALLOCATABLE :: ZAETOT ! 1: total attenuation, 2: // vertical -REAL :: ZAERINT,ZAEIINT,ZAESINT,ZAEGINT,ZAEHINT ! total attenuation horizontal -REAL :: ZAVRINT,ZAVSINT,ZAVGINT,ZAVHINT ! total attenuation vertical -! -REAL,DIMENSION(:),ALLOCATABLE :: ZX,ZW ! Gauss-Laguerre points and weights -! -REAL,DIMENSION(4) :: ZREFLOC -REAL,DIMENSION(2) :: ZAETMP -REAL,DIMENSION(:),ALLOCATABLE :: ZVTEMP ! temp var for Gaussian quadrature 8 : r_r, 9 : r_i, 10 : r_s , 11 : r_g -REAL :: ZCXR=-1.0 ! for rain N ~ 1/N_0 (in Kessler parameterization) -REAL :: ZDMELT_FACT ! factor used to compute the equivalent melted diameter -REAL :: ZEQICE=0.224! factor used to convert the ice crystals reflectivity into an equivalent liquid water reflectivity (from Smith, JCAM 84) -REAL :: ZEXP ! anciliary parameter -REAL :: ZLBDA ! slope distribution parameter -REAL :: ZN ! Number concentration -REAL :: ZFRAC_ICE,ZD,ZDE ! auxiliary variables -REAL :: ZQSCA -REAL,DIMENSION(2) :: ZQEXT -REAL,DIMENSION(3) :: ZQBACK ! Q_b(HH),Q_b(VV) (backscattering efficiencies at horizontal and vertical polarizations, resp.) -!REAL :: P=DACOS(-1D0) -REAL :: ZRHOI ! pristine ice density (from m=a*D**b), -REAL :: ZRHOPI=916. !pure ice density (kg/m3) -COMPLEX :: ZNUM, ZDEN !for calculation of ice dielectri cconstant -COMPLEX :: ZQM,ZQMW,ZQMI,ZQK,ZQB, ZEPSI ! dielectric parameters -REAL :: ZS11_CARRE_R,ZS22_CARRE_R,ZRE_S22S11_R,ZIM_S22S11_R -REAL :: ZS11_CARRE_I,ZS22_CARRE_I,ZRE_S22S11_I,ZIM_S22S11_I -REAL :: ZS11_CARRE_S,ZS22_CARRE_S,ZRE_S22S11_S,ZIM_S22S11_S -REAL :: ZS11_CARRE_G,ZS22_CARRE_G,ZRE_S22S11_G,ZIM_S22S11_G -REAL :: ZS11_CARRE_H,ZS22_CARRE_H,ZRE_S22S11_H,ZIM_S22S11_H -REAL :: ZS11_CARRE_T,ZS22_CARRE_T,ZRE_S22S11_T,ZIM_S22S11_T -REAL :: ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT - -REAL :: ZM -! -INTEGER :: INBRAD,IIELV,INBAZIM,INBSTEPMAX,INPTS_H,INPTS_V ! sizes of the arrays -INTEGER :: IEL -INTEGER :: JI,JL,JEL,JAZ,JH,JV,JJ,JT ! Loop variables of control -REAL :: ZLB ! depolarization factor along the spheroid symmetry axis -REAL :: ZCXI=0. ! should be defined with other parameters of microphysical scheme -REAL :: ZCR,ZCI,ZCS,ZCG,ZCH ! coefficients to take into account fall speeds when simulating Doppler winds -REAL, DIMENSION(:,:,:,:),ALLOCATABLE :: ZCONC_BIN -INTEGER :: IMAX -LOGICAL :: LPART_MASK ! indicates a partial mask along the beam - -! -INTEGER :: IZER,IZEI,IZES,IZEG -INTEGER :: IVDOP,IRHV,IPDP,IDHV -INTEGER :: IAER,IAEI,IAES,IAEG -INTEGER :: IAVR,IAVI,IAVS,IAVG -INTEGER :: IATR,IATI,IATS,IATG -INTEGER :: IRHR, IRHS, IRHG, IZDA, IZDS, IZDG, IKDR, IKDS, IKDG -INTEGER :: IZEH, IRHH,IKDH,IZDH ! hail -INTEGER :: IAEH,IAVH,IATH -! -!for ZSNR threshold -REAL ::ZDISTRAD,ZSNR,ZSNR_R,ZSNR_S,ZSNR_I,ZSNR_G,ZSNR_H,ZZHH,ZZE_R,ZZE_I,ZZE_S,ZZE_G,ZZE_H -LOGICAL :: GTHRESHOLD_V, GTHRESHOLD_Z,GTHRESHOLD_ZR,GTHRESHOLD_ZI,GTHRESHOLD_ZS,GTHRESHOLD_ZG,GTHRESHOLD_ZH - -!--------- TO READ T-MATRIX TABLE -------- -CHARACTER(LEN=6) :: YBAND -CHARACTER(LEN=1) ::YTYPE -CHARACTER(LEN=1),DIMENSION(5) :: YTAB_TYPE -CHARACTER(LEN=25),DIMENSION(5) :: YFILE_COEFINT - -REAL,DIMENSION(5) :: ZELEV_MIN,ZELEV_MAX,ZELEV_STEP,& -ZTC_MIN,ZTC_MAX,ZTC_STEP,ZFW_MIN,ZFW_MAX,ZFW_STEP -INTEGER :: IRESP,ILINE,INB_M -INTEGER,DIMENSION(5) :: INB_ELEV,INB_TC,INB_FW,INB_LINE - -REAL, DIMENSION(:),ALLOCATABLE :: ZTC_T_R, ZTC_T_S, ZTC_T_G, ZTC_T_W -REAL, DIMENSION(:),ALLOCATABLE :: ZELEV_T_R, ZELEV_T_S, ZELEV_T_G, ZELEV_T_W -REAL, DIMENSION(:),ALLOCATABLE :: ZFW_T_S, ZFW_T_G, ZFW_T_W -REAL, DIMENSION(:),ALLOCATABLE :: ZM_T_R, ZM_T_S, ZM_T_G, ZM_T_W -REAL, DIMENSION(:),ALLOCATABLE :: ZS11_CARRE_T_R, ZS11_CARRE_T_S, ZS11_CARRE_T_G, ZS11_CARRE_T_W -REAL, DIMENSION(:),ALLOCATABLE :: ZS22_CARRE_T_R, ZS22_CARRE_T_S, ZS22_CARRE_T_G, ZS22_CARRE_T_W -REAL, DIMENSION(:),ALLOCATABLE :: ZRE_S22S11_T_R, ZRE_S22S11_T_S, ZRE_S22S11_T_G, ZRE_S22S11_T_W -REAL, DIMENSION(:),ALLOCATABLE :: ZIM_S22S11_T_R, ZIM_S22S11_T_S, ZIM_S22S11_T_G, ZIM_S22S11_T_W -REAL, DIMENSION(:),ALLOCATABLE :: ZIM_S22FT_T_R, ZIM_S22FT_T_S, ZIM_S22FT_T_G, ZIM_S22FT_T_W -REAL, DIMENSION(:),ALLOCATABLE :: ZIM_S11FT_T_R, ZIM_S11FT_T_S, ZIM_S11FT_T_G, ZIM_S11FT_T_W -REAL, DIMENSION(:),ALLOCATABLE :: ZRE_S22FMS11FT_T_R, ZRE_S22FMS11FT_T_S, ZRE_S22FMS11FT_T_G, ZRE_S22FMS11FT_T_W -REAL, DIMENSION(:),ALLOCATABLE :: ZTC_T_H ,ZELEV_T_H ,ZFW_T_H,ZM_T_H,ZS11_CARRE_T_H,ZS22_CARRE_T_H,ZRE_S22S11_T_H -REAL, DIMENSION(:),ALLOCATABLE :: ZIM_S22S11_T_H,ZIM_S22FT_T_H,ZIM_S11FT_T_H,ZRE_S22FMS11FT_T_H -INTEGER,DIMENSION(16):: ITMAT -REAL:: ZELEV_RED,ZTC_RED,ZM_RED,ZFW_RED -INTEGER :: JIND -REAL,DIMENSION(7,16) :: KMAT_COEF !matrice contenant tous les coef interpolés - !pour chaque val inf et sup de ELEV_t -REAL :: ZEXPM_MIN, ZEXPM_STEP, ZEXPM_MAX,ZM_MIN -REAL :: ZFW !water fraction inside melting graupel (ZFW=0 for rain, snow and dry graupel). used only with NDIFF=7: Tmatrix -INTEGER :: ILUOUT0,IUNIT -! -! MODIF GAELLE POUR LIMA -! -LOGICAL :: GLIMA,GHAIL -REAL,DIMENSION(5) :: ZCC_MIN,ZCC_MAX, ZCC_STEP -INTEGER,DIMENSION(5):: INB_CC -REAL, DIMENSION(:),ALLOCATABLE :: ZCC_T_R -REAL :: ZCC_RED -LOGICAL :: GCALC -REAL :: ZCC -REAL, DIMENSION(:,:,:,:,:,:),ALLOCATABLE :: ZM_6D,ZCC_6D -REAL :: ZC -! -REAL :: ZCCR,ZLBR,ZLBEXR,ZDR,ZALPHAR,ZNUR,ZBR -REAL :: ZCCS,ZLBS,ZLBEXS,ZDS,ZALPHAS,ZNUS,ZAS,ZBS,ZCXS,ZNS -REAL :: ZCCG,ZLBG,ZLBEXG,ZDG,ZALPHAG,ZNUG,ZAG,ZBG,ZCXG -REAL :: ZCCH,ZLBH,ZLBEXH,ZDH,ZALPHAH,ZNUH,ZAH,ZBH,ZCXH -REAL :: ZLBI,ZLBEXI,ZDI,ZALPHAI,ZNUI,ZAI,ZBI -REAL,DIMENSION(:),ALLOCATABLE :: ZRTMIN -CHARACTER(LEN=100) :: YMSG -TYPE(TFILEDATA),POINTER :: TZFILE -! -!* 1. INITIALISATION -!-------------- -ILUOUT0 = TLUOUT0%NLU -TZFILE => NULL() -! -IF (PRESENT(PCR_RAY)) THEN - GLIMA=.TRUE. -ELSE - GLIMA=.FALSE. -ENDIF -IF (PRESENT(PH_RAY)) THEN - GHAIL=.TRUE. -ELSE - GHAIL=.FALSE. -ENDIF -! -! -! - ZS11_CARRE_R=0 - ZS22_CARRE_R=0 - ZRE_S22S11_R=0 - ZIM_S22S11_R=0 - ZS11_CARRE_I=0 - ZS22_CARRE_I=0 - ZRE_S22S11_I=0 - ZIM_S22S11_I=0 - ZS11_CARRE_S=0 - ZS22_CARRE_S=0 - ZRE_S22S11_S=0 - ZIM_S22S11_S=0 - ZS11_CARRE_G=0 - ZS22_CARRE_G=0 - ZRE_S22S11_G=0 - ZIM_S22S11_G=0 - ZS11_CARRE_H=0 - ZS22_CARRE_H=0 - ZRE_S22S11_H=0 - ZIM_S22S11_H=0 -! Initialisation varibales microphysiques -IF (GLIMA) THEN ! LIMA - ZLBR=XLBR_L - ZLBEXR=XLBEXR_L - ZDR=XDR_L - ZALPHAR=XALPHAR_L - ZNUR=XNUR_L - ZBR=XBR_L - ZCCS=XCCS_L - ZCXS=XCXS_L - ZLBS=XLBS_L - ZLBEXS=XLBEXS_L - ZNS=XNS_L - ZDS=XDS_L - ZALPHAS=XALPHAS_L - ZNUS=XNUS_L - ZAS=XAS_L - ZBS=XBS_L - ZCCG=XCCG_L - ZCXG=XCXG_L - ZLBG=XLBG_L - ZLBEXG=XLBEXG_L - ZDG=XDG_L - ZALPHAG=XALPHAG_L - ZNUG=XNUG_L - ZAG=XAG_L - ZBG=XBG_L - ZLBI=XLBI_L - ZLBEXI=XLBEXI_L - ZDI=XDI_L - ZALPHAI=XALPHAI_L - ZNUI=XNUI_L - ZAI=XAI_L - ZBI=XBI_L - ALLOCATE(ZRTMIN(SIZE(XRTMIN_L))) - ZRTMIN=XRTMIN_L -ELSE ! ICE3 - ZCCR=XCCR_I - ZLBR=XLBR_I - ZLBEXR=XLBEXR_I - ZDR=XDR_I - ZALPHAR=XALPHAR_I - ZNUR=XNUR_I - ZBR=XBR_I - ZCCS=XCCS_I - ZCXS=XCXS_I - ZLBS=XLBS_I - ZLBEXS=XLBEXS_I - ZNS=XNS_I - ZDS=XDS_I - ZALPHAS=XALPHAS_I - ZNUS=XNUS_I - ZAS=XAS_I - ZBS=XBS_I - ZCCG=XCCG_I - ZCXG=XCXG_I - ZLBG=XLBG_I - ZLBEXG=XLBEXG_I - ZDG=XDG_I - ZALPHAG=XALPHAG_I - ZNUG=XNUG_I - ZAG=XAG_I - ZBG=XBG_I - ZLBI=XLBI_I - ZLBEXI=XLBEXI_I - ZDI=XDI_I - ZALPHAI=XALPHAI_I - ZNUI=XNUI_I - ZAI=XAI_I - ZBI=XBI_I - ALLOCATE(ZRTMIN(SIZE(XRTMIN_I))) - ZRTMIN=XRTMIN_I - IF (GHAIL) THEN - ZCCH=XCCH_I - ZCXH=XCXH_I - ZLBH=XLBH_I - ZLBEXH=XLBEXH_I - ZDH=XDH_I - ZALPHAH=XALPHAH_I - ZNUH=XNUH_I - ZAH=XAH_I - ZBH=XBH_I - ENDIF -ENDIF -! -! initialisation of refractivity indices -! 1 : ZHH -! 2 : ZDR -! 3 : KDP -! 4 : CSR -IZER=5 ! ZER -IZEI=IZER+1 ! ZEI -IZES=IZEI+1 ! ZES -IZEG=IZES+1 ! ZEG -IF (GHAIL) THEN - IZEH=IZEG+1 !ZEH - IVDOP=IZEH+1 !VRU -ELSE - IVDOP=IZEG+1 !VRU -END IF -IF (LATT) THEN - IF (GHAIL) THEN - IAER=IVDOP+1 - IAEI=IAER+1 - IAES=IAEI+1 - IAEG=IAES+1 - IAEH=IAEG+1 - IAVR=IAEH+1 - IAVI=IAVR+1 - IAVS=IAVI+1 - IAVG=IAVS+1 - IAVH=IAVG+1 - IATR=IAVH+1 - IATI=IATR+1 - IATS=IATI+1 - IATG=IATS+1 - IATH=IATG+1 - IRHV=IATH+1 - ELSE - IAER=IVDOP+1 - IAEI=IAER+1 - IAES=IAEI+1 - IAEG=IAES+1 - IAVR=IAEG+1 - IAVI=IAVR+1 - IAVS=IAVI+1 - IAVG=IAVS+1 - IATR=IAVG+1 - IATI=IATR+1 - IATS=IATI+1 - IATG=IATS+1 - IRHV=IATG+1 - ENDIF -ELSE - IRHV=IVDOP+1 -ENDIF -IPDP=IRHV+1 -IDHV=IPDP+1 -IRHR=IDHV+1 -IRHS=IRHR+1 -IRHG=IRHS+1 -IF (GHAIL) THEN - IRHH=IRHG+1 - IZDA=IRHH+1 -ELSE - IZDA=IRHG+1 -ENDIF -IZDS=IZDA+1 -IZDG=IZDS+1 -IF (GHAIL) THEN - IZDH=IZDG+1 - IKDR=IZDH+1 -ELSE - IKDR=IZDG+1 -ENDIF -IKDS=IKDR+1 -IKDG=IKDS+1 -IF (GHAIL) THEN - IKDH=IKDG+1 -ENDIF -! -! -! -INBRAD=SIZE(PT_RAY,1) -IIELV=SIZE(PT_RAY,2) -INBAZIM=SIZE(PT_RAY,3) -INBSTEPMAX=SIZE(PT_RAY,4) -INPTS_H=SIZE(PT_RAY,5) -INPTS_V=SIZE(PT_RAY,6) -! -! Initialisation for radial winds -IF(LFALL) THEN - IF (GLIMA) THEN - ZCR=XCR_L - ZCI=XC_I_L - ZCS=XCS_L - ZCG=XCG_L - ELSE - ZCR=XCR_I - ZCI=XC_I_I - ZCS=XCS_I - ZCG=XCG_I - IF (GHAIL) ZCH=XCH_I - ENDIF -ELSE - ZCR=0. - ZCI=0. - ZCS=0. - ZCG=0. - IF (GHAIL) ZCH=0. -END IF - -! Calculation of nodes and weights for the Gauss-Laguerre quadrature -! for Mie and T-matrix and RG -IF(NDIFF/=0) THEN - ALLOCATE(ZX(NPTS_GAULAG),ZW(NPTS_GAULAG)) !NPTS_GAULAG : number of points for the quadrature - CALL GAULAG(NPTS_GAULAG,ZX,ZW) -END IF -! -! -IMAX=SIZE(PZE,5) -WRITE(ILUOUT0,*) "-----------------" -WRITE(ILUOUT0,*) "Radar scattering" -WRITE(ILUOUT0,*) "-----------------" -WRITE(ILUOUT0,*) 'Nombre de variables dans PZE: ',IMAX - -IF(.NOT.LWREFL) IMAX=IMAX+1 - -ALLOCATE(ZREFL(INBRAD,IIELV,INBAZIM,INBSTEPMAX,INPTS_H,INPTS_V,IMAX)) -ZREFL(:,:,:,:,:,:,:)=0. -IF(LATT) THEN - ZREFL(:,:,:,:,:,:,IATR:IATG)=1. - IF (GHAIL) ZREFL(:,:,:,:,:,:,IATH)=1. -END IF -PZE(:,:,:,:,:)=0. -IF (LATT)THEN - ALLOCATE(ZAELOC(INBRAD,IIELV,INBAZIM,INBSTEPMAX,INPTS_H,INPTS_V,2)) - ALLOCATE(ZAETOT(INPTS_H,INPTS_V,2)) - ZAELOC(:,:,:,:,:,:,:)=0. ! initialization of attenuation stuff (alpha_e for first gate) - ZAETOT(:,:,:)=1. ! initialization of attenuation stuff (total attenuation) -END IF -WRITE(ILUOUT0,*) 'BEFORE LOOP DIFFUSION' - -IF(LWBSCS) THEN - ALLOCATE(ZCONC_BIN(INBRAD,IIELV,INBAZIM,INBSTEPMAX)) - ZCONC_BIN(:,:,:,:)=0. -END IF - -WRITE(ILUOUT0,*) "XCCR:",ZCCR -WRITE(ILUOUT0,*) "XLBR:",ZLBR -WRITE(ILUOUT0,*) "XLBEXR:",ZLBEXR - -WRITE(ILUOUT0,*) "XCCS:",ZCCS -WRITE(ILUOUT0,*) "XLBS:",ZLBS -WRITE(ILUOUT0,*) "XLBEXS:",ZLBEXS - -WRITE(ILUOUT0,*) "XCCG:",ZCCG -WRITE(ILUOUT0,*) "XLBG:",ZLBG -WRITE(ILUOUT0,*) "XLBEXG:",ZLBEXG - -IF (GHAIL) THEN - WRITE(ILUOUT0,*) "XCCH:",ZCCH - WRITE(ILUOUT0,*) "XLBH:",ZLBH - WRITE(ILUOUT0,*) "XLBEXH:",ZLBEXH -ENDIF -! -IF (GLIMA .AND. NDIFF==7) THEN - IF (ZALPHAR/=1 .AND. ZNUR /=2.) THEN - WRITE(ILUOUT0,*) " ERROR : TMATRICE TABLE ARE MADE WITH XALPHAR=1 XNUR=2" - WRITE(ILUOUT0,*) " FOR CCLOUD=LIMA. PLEASE CHANGE THIS VALUES OR PROVIDE " - WRITE(ILUOUT0,*) " NEW TMATRICE TABLES " - CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING','') - ENDIF -ELSE - IF (ZALPHAR/=1 .AND. ZNUR /=1.) THEN - WRITE(ILUOUT0,*) " ERROR : TMATRICE TABLE ARE MADE WITH XALPHAR=1 XNUR=1" - WRITE(ILUOUT0,*) " FOR CCLOUD=ICE3. PLEASE CHANGE THIS VALUEs OR PROVIDE " - WRITE(ILUOUT0,*) " NEW TMATRICE TABLES " - CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING','') - ENDIF -ENDIF - -!--------------------------------------------- -! LOOP OVER EVERYTHING -!-------------------------------------------- -IF(NDIFF==7) THEN - YTAB_TYPE(1)='r' - YTAB_TYPE(2)='s' - YTAB_TYPE(3)='g' - YTAB_TYPE(4)='w' - YTAB_TYPE(5)='h' - ! definition des paramètres de lecture de la table T-matrice - ! all mixing ratio - ZEXPM_MIN=-7. - ZEXPM_STEP=0.01 - ZEXPM_MAX=-2. - ZM_MIN=10**ZEXPM_MIN - ! rain - ZELEV_MIN(1)=0.0 - ZELEV_STEP(1)=4.0 - ZELEV_MAX(1)=12.0 - ZTC_MIN(1)=-20.0 - ZTC_STEP(1)=1.0 - ZTC_MAX(1)=40.0 - ZFW_MIN(1)=0.0 - ZFW_STEP(1)=0.1 - ZFW_MAX(1)=0.0 - IF (GLIMA) THEN - ZCC_MIN(1)=1.8 - ZCC_STEP(1)=0.02 - ZCC_MAX(1)=6 - ELSE - ZCC_MIN(1)=1. - ZCC_STEP(1)=1. - ZCC_MAX(1)=1. - ENDIF - ! snow + graupel - ZELEV_MIN(2:3)=0.0 - ZELEV_STEP(2:3)=12.0 - ZELEV_MAX(2:3)=12.0 - ZTC_MIN(2:3)=-70.0 - ZTC_STEP(2:3)=1.0 - ZTC_MAX(2:3)=10.0 - ZFW_MIN(2:3)=0.0 - ZFW_STEP(2:3)=0.1 - ZFW_MAX(2:3)=0.0 - ZCC_MIN(2:3)=1. - ZCC_STEP(2:3)=1. - ZCC_MAX(2:3)=1. - ! wet graupel - ZELEV_MIN(4)=0.0 - ZELEV_STEP(4)=4.0 - ZELEV_MAX(4)=12.0 - ZTC_MIN(4)=-10.0 - ZTC_STEP(4)=1.0 - ZTC_MAX(4)=10.0 - ZFW_MIN(4)=0.0 - ZFW_STEP(4)=0.1 - ZFW_MAX(4)=1.0 - ZCC_MIN(4)=1. - ZCC_STEP(4)=1. - ZCC_MAX(4)=1. - ! hail - ZELEV_MIN(5)=0.0 - ZELEV_STEP(5)=4.0 - ZELEV_MAX(5)=12.0 - ZTC_MIN(5)=-20.0 - ZTC_STEP(5)=1.0 - ZTC_MAX(5)=30.0 - ZFW_MIN(5)=0. - ZFW_STEP(5)=0.1 - ZFW_MAX(5)=0.0 - ZCC_MIN(5)=1. - ZCC_STEP(5)=1. - ZCC_MAX(5)=1. - DO JT=1,5 - INB_ELEV(JT)=NINT((ZELEV_MAX(JT)-ZELEV_MIN(JT))/ZELEV_STEP(JT))+1 - INB_TC(JT)=NINT((ZTC_MAX(JT)-ZTC_MIN(JT))/ZTC_STEP(JT))+1 - INB_FW(JT)=NINT((ZFW_MAX(JT)-ZFW_MIN(JT))/ZFW_STEP(JT))+1 - INB_M=NINT((ZEXPM_MAX-ZEXPM_MIN)/ZEXPM_STEP)+1 - INB_CC(JT)=NINT((ZCC_MAX(JT)-ZCC_MIN(JT))/ZCC_STEP(JT))+1 - INB_LINE(JT)=INB_ELEV(JT)*INB_TC(JT)*INB_FW(JT)*INB_M*INB_CC(JT) - ENDDO -ENDIF - -!--------------------------------------------- -! LOOP OVER EVERYTHING -!-------------------------------------------- - !============== loop over radars ================= -WRITE(ILUOUT0,*) "INBRAD",INBRAD -DO JI=1,INBRAD - WRITE(ILUOUT0,*) "JI",JI - WRITE(ILUOUT0,*) "XLAM_RAD(JI):",XLAM_RAD(JI) - - IF(NDIFF==7) THEN ! If T-MATRIX - !--------------------------------------------------------------------------------------------- - ! 0. LECTURE DES TABLES TMAT POUR PLUIE, NEIGE, GRAUPEL - ! en fonction de la bande frequence - !--------------------------------------------------------------------------------------------- - IF ( XLAM_RAD(JI)==0.1062) THEN - YBAND='S106.2' - ELSEIF (XLAM_RAD(JI) ==0.0532 ) THEN - YBAND='C053.2' - ELSEIF (XLAM_RAD(JI)==0.0319 ) THEN - YBAND='X031.9' - ELSE - WRITE(ILUOUT0,*) "ERROR RADAR_SCATTERING" - WRITE(ILUOUT0,*) "Tmatrice tables are only available for XLAM_RAD=0.1062" - WRITE(ILUOUT0,*) "or XLAM_RAD=0.0532 or XLAM_RAD=0.0319" - WRITE(ILUOUT0,*) "change XLAM_RAD in namelist or compute new tmatrice table" - CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING','') - ENDIF - - !************ fichiers Min Max Pas et Coef Tmat *********** - DO JT=1,5 !types (r, s, g, w, h) - - YTYPE=YTAB_TYPE(JT) - IF (JT .EQ. 1) THEN - IF (GLIMA) THEN - YFILE_COEFINT(JT)='TmatCoefInt_LIMA_'//YBAND//YTYPE - ELSE - YFILE_COEFINT(JT)='TmatCoefInt_ICE3_'//YBAND//YTYPE - ENDIF - ELSE - YFILE_COEFINT(JT)='TmatCoefInt_'//YBAND//YTYPE - ENDIF - YFILE_COEFINT(JT)=TRIM(ADJUSTL(YFILE_COEFINT(JT))) - ENDDO - !lookup tables for rain - ALLOCATE (ZTC_T_R(INB_LINE(1)),ZELEV_T_R(INB_LINE(1)),ZCC_T_R(INB_LINE(1)),ZM_T_R(INB_LINE(1)),& - ZS11_CARRE_T_R(INB_LINE(1)),ZS22_CARRE_T_R(INB_LINE(1)), ZRE_S22S11_T_R(INB_LINE(1)),ZIM_S22S11_T_R(INB_LINE(1)),& - ZRE_S22FMS11FT_T_R(INB_LINE(1)),ZIM_S22FT_T_R(INB_LINE(1)),ZIM_S11FT_T_R(INB_LINE(1))) - - !lookup tables for snow - ALLOCATE (ZTC_T_S(INB_LINE(2)),ZELEV_T_S(INB_LINE(2)),ZFW_T_S(INB_LINE(2)),ZM_T_S(INB_LINE(2)),& - ZS11_CARRE_T_S(INB_LINE(2)),ZS22_CARRE_T_S(INB_LINE(2)),ZRE_S22S11_T_S(INB_LINE(2)),ZIM_S22S11_T_S(INB_LINE(2)),& - ZRE_S22FMS11FT_T_S(INB_LINE(2)),ZIM_S22FT_T_S(INB_LINE(2)),ZIM_S11FT_T_S(INB_LINE(2))) - - !lookup tables for graupel - ALLOCATE (ZTC_T_G(INB_LINE(3)),ZELEV_T_G(INB_LINE(3)),ZFW_T_G(INB_LINE(3)),ZM_T_G(INB_LINE(3)),& - ZS11_CARRE_T_G(INB_LINE(3)),ZS22_CARRE_T_G(INB_LINE(3)), ZRE_S22S11_T_G(INB_LINE(3)),ZIM_S22S11_T_G(INB_LINE(3)),& - ZRE_S22FMS11FT_T_G(INB_LINE(3)),ZIM_S22FT_T_G(INB_LINE(3)),ZIM_S11FT_T_G(INB_LINE(3))) - - !lookup tables for wet graupel - ALLOCATE (ZTC_T_W(INB_LINE(4)),ZELEV_T_W(INB_LINE(4)),ZFW_T_W(INB_LINE(4)),ZM_T_W(INB_LINE(4)),& - ZS11_CARRE_T_W(INB_LINE(4)),ZS22_CARRE_T_W(INB_LINE(4)), ZRE_S22S11_T_W(INB_LINE(4)),ZIM_S22S11_T_W(INB_LINE(4)),& - ZRE_S22FMS11FT_T_W(INB_LINE(4)),ZIM_S22FT_T_W(INB_LINE(4)),ZIM_S11FT_T_W(INB_LINE(4))) - - IF (GHAIL) THEN - !lookup tables for hail - ALLOCATE (ZTC_T_H(INB_LINE(5)),ZELEV_T_H(INB_LINE(5)),ZFW_T_H(INB_LINE(5)),ZM_T_H(INB_LINE(5)),& - ZS11_CARRE_T_H(INB_LINE(5)),ZS22_CARRE_T_H(INB_LINE(5)), ZRE_S22S11_T_H(INB_LINE(5)),ZIM_S22S11_T_H(INB_LINE(5)),& - ZRE_S22FMS11FT_T_H(INB_LINE(5)),ZIM_S22FT_T_H(INB_LINE(5)),ZIM_S11FT_T_H(INB_LINE(5))) - ENDIF - !===== Lecture des tables =========== - - 6003 FORMAT (E11.4,2X,E9.3,2X,E10.4,2X,E10.4,2X,E12.5,2X,E12.5,2X,& - E12.5,2X,E12.5,2X,E12.5,2X,E12.5,2X,E12.5) - - !rain - CALL IO_File_add2list(TZFILE,YFILE_COEFINT(1),'TXT','READ') - CALL IO_File_open(TZFILE,KRESP=IRESP) - IUNIT = TZFILE%NLU - IF ( IRESP /= 0 ) THEN - WRITE(YMSG,*) "problem opening file ",TRIM(YFILE_COEFINT(1)) - CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING',YMSG) - ENDIF - ILINE=1 - DO WHILE (ILINE .LE. INB_LINE(1)) - READ( UNIT=IUNIT,FMT=6003, IOSTAT=IRESP ) ZTC_T_R(ILINE),ZELEV_T_R(ILINE),& - ZCC_T_R(ILINE),ZM_T_R(ILINE),ZS11_CARRE_T_R(ILINE),ZS22_CARRE_T_R(ILINE),ZRE_S22S11_T_R(ILINE),& - ZIM_S22S11_T_R(ILINE),ZRE_S22FMS11FT_T_R(ILINE),ZIM_S22FT_T_R(ILINE),ZIM_S11FT_T_R(ILINE) - ILINE=ILINE+1 - ENDDO - CALL IO_File_close(TZFILE) - TZFILE => NULL() - WRITE(ILUOUT0,*) "NLIGNE rain",ILINE - ILINE=2 - WRITE(ILUOUT0,*) "ILINE=",ILINE - WRITE(ILUOUT0,*) "ZTC_T_R(ILINE),ZELEV_T_R(ILINE),ZCC_T_R(ILINE)",& - ZTC_T_R(ILINE),ZELEV_T_R(ILINE),ZCC_T_R(ILINE) - WRITE(ILUOUT0,*) "ZM_T_R(ILINE),ZS11_CARRE_T_R(ILINE),ZS22_CARRE_T_R(ILINE),ZRE_S22S11_T_R(ILINE)",& - ZM_T_R(ILINE),ZS11_CARRE_T_R(ILINE),ZS22_CARRE_T_R(ILINE),ZRE_S22S11_T_R(ILINE) - WRITE(ILUOUT0,*) "ZIM_S22S11_T_R(ILINE),ZRE_S22FMS11FT_T_R(ILINE),ZIM_S22FT_T_R(ILINE),ZIM_S11FT_T_R(ILINE)",& - ZIM_S22S11_T_R(ILINE),ZRE_S22FMS11FT_T_R(ILINE),ZIM_S22FT_T_R(ILINE),ZIM_S11FT_T_R(ILINE) - - !snow - CALL IO_File_add2list(TZFILE,YFILE_COEFINT(2),'TXT','READ') - CALL IO_File_open(TZFILE,KRESP=IRESP) - IUNIT = TZFILE%NLU - IF ( IRESP /= 0 ) THEN - WRITE(YMSG,*) "problem opening file ",TRIM(YFILE_COEFINT(2)) - CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING',YMSG) - ENDIF - ILINE=1 - DO WHILE (ILINE .LE. INB_LINE(2)) - READ( UNIT=IUNIT,FMT=6003, IOSTAT=IRESP ) ZTC_T_S(ILINE),ZELEV_T_S(ILINE),& - ZFW_T_S(ILINE),ZM_T_S(ILINE),ZS11_CARRE_T_S(ILINE),ZS22_CARRE_T_S(ILINE),ZRE_S22S11_T_S(ILINE),& - ZIM_S22S11_T_S(ILINE),ZRE_S22FMS11FT_T_S(ILINE),ZIM_S22FT_T_S(ILINE),ZIM_S11FT_T_S(ILINE) - ILINE=ILINE+1 - ENDDO - CALL IO_File_close(TZFILE) - TZFILE => NULL() - WRITE(ILUOUT0,*) "NLIGNE snow",ILINE - ILINE=2 - WRITE(ILUOUT0,*) "ILINE=",ILINE - WRITE(ILUOUT0,*) "ZTC_T_S(ILINE),ZELEV_T_S(ILINE),ZFW_T_S(ILINE)",& - ZTC_T_S(ILINE),ZELEV_T_S(ILINE),ZFW_T_S(ILINE) - WRITE(ILUOUT0,*) "ZM_T_S(ILINE),ZS11_CARRE_T_S(ILINE),ZS22_CARRE_T_S(ILINE),ZRE_S22S11_T_S(ILINE)",& - ZM_T_S(ILINE),ZS11_CARRE_T_S(ILINE),ZS22_CARRE_T_S(ILINE),ZRE_S22S11_T_S(ILINE) - WRITE(ILUOUT0,*) "ZIM_S22S11_T_S(ILINE),ZRE_S22FMS11FT_T_S(ILINE),ZIM_S22FT_T_S(ILINE),ZIM_S11FT_T_S(ILINE)",& - ZIM_S22S11_T_S(ILINE),ZRE_S22FMS11FT_T_S(ILINE),ZIM_S22FT_T_S(ILINE),ZIM_S11FT_T_S(ILINE) - - !graupel - CALL IO_File_add2list(TZFILE,YFILE_COEFINT(3),'TXT','READ') - CALL IO_File_open(TZFILE,KRESP=IRESP) - IUNIT = TZFILE%NLU - IF ( IRESP /= 0 ) THEN - WRITE(YMSG,*) "problem opening file ",TRIM(YFILE_COEFINT(3)) - CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING',YMSG) - ENDIF - ILINE=1 - DO WHILE (ILINE .LE. INB_LINE(3)) - READ( UNIT=IUNIT, FMT=6003,IOSTAT=IRESP ) ZTC_T_G(ILINE),ZELEV_T_G(ILINE),& - ZFW_T_G(ILINE),ZM_T_G(ILINE),ZS11_CARRE_T_G(ILINE),ZS22_CARRE_T_G(ILINE),ZRE_S22S11_T_G(ILINE),& - ZIM_S22S11_T_G(ILINE),ZRE_S22FMS11FT_T_G(ILINE),ZIM_S22FT_T_G(ILINE),ZIM_S11FT_T_G(ILINE) - ILINE=ILINE+1 - ENDDO - CALL IO_File_close(TZFILE) - TZFILE => NULL() - WRITE(ILUOUT0,*) "NLIGNE graupel",ILINE - ILINE=2 - WRITE(ILUOUT0,*) "ILINE=",ILINE - WRITE(ILUOUT0,*) "ZTC_T_G(ILINE),ZELEV_T_G(ILINE)",& - ZTC_T_G(ILINE),ZELEV_T_G(ILINE) - WRITE(ILUOUT0,*) "ZM_T_G(ILINE),ZS11_CARRE_T_G(ILINE),ZS22_CARRE_T_G(ILINE),ZRE_S22S11_T_G(ILINE)",& - ZM_T_G(ILINE),ZS11_CARRE_T_G(ILINE),ZS22_CARRE_T_G(ILINE),ZRE_S22S11_T_G(ILINE) - WRITE(ILUOUT0,*) "ZIM_S22S11_T_G(ILINE),ZRE_S22FMS11FT_T_G(ILINE),ZIM_S22FT_T_G(ILINE),ZIM_S11FT_T_G(ILINE)",& - ZIM_S22S11_T_G(ILINE),ZRE_S22FMS11FT_T_G(ILINE),ZIM_S22FT_T_G(ILINE),ZIM_S11FT_T_G(ILINE) - - !wet graupel - CALL IO_File_add2list(TZFILE,YFILE_COEFINT(4),'TXT','READ') - CALL IO_File_open(TZFILE,KRESP=IRESP) - IUNIT = TZFILE%NLU - IF ( IRESP /= 0 ) THEN - WRITE(YMSG,*) "problem opening file ",TRIM(YFILE_COEFINT(4)) - CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING',YMSG) - ENDIF - ILINE=1 - DO WHILE (ILINE .LE. INB_LINE(4)) - READ( UNIT=IUNIT, FMT=6003,IOSTAT=IRESP ) ZTC_T_W(ILINE),ZELEV_T_W(ILINE),& - ZFW_T_W(ILINE),ZM_T_W(ILINE),ZS11_CARRE_T_W(ILINE),ZS22_CARRE_T_W(ILINE),ZRE_S22S11_T_W(ILINE),& - ZIM_S22S11_T_W(ILINE),ZRE_S22FMS11FT_T_W(ILINE),ZIM_S22FT_T_W(ILINE),ZIM_S11FT_T_W(ILINE) - ILINE=ILINE+1 - ENDDO - CALL IO_File_close(TZFILE) - TZFILE => NULL() - WRITE(ILUOUT0,*) "NLIGNE wet graupel",ILINE - ILINE=2 - WRITE(ILUOUT0,*) "ILINE=",ILINE - WRITE(ILUOUT0,*) "ZTC_T_W(ILINE),ZELEV_T_W(ILINE)", ZTC_T_W(ILINE),ZELEV_T_W(ILINE) - WRITE(ILUOUT0,*) "ZM_T_W(ILINE),ZS11_CARRE_T_W(ILINE),ZS22_CARRE_T_W(ILINE),ZRE_S22S11_T_W(ILINE)",& - ZM_T_W(ILINE),ZS11_CARRE_T_W(ILINE),ZS22_CARRE_T_W(ILINE),ZRE_S22S11_T_W(ILINE) - WRITE(ILUOUT0,*) "ZIM_S22S11_T_W(ILINE),ZRE_S22FMS11FT_T_W(ILINE),ZIM_S22FT_T_W(ILINE),ZIM_S11FT_T_W(ILINE)",& - ZIM_S22S11_T_W(ILINE),ZRE_S22FMS11FT_T_W(ILINE),ZIM_S22FT_T_W(ILINE),ZIM_S11FT_T_W(ILINE) - - !hail - IF (GHAIL) THEN - CALL IO_File_add2list(TZFILE,YFILE_COEFINT(5),'TXT','READ') - CALL IO_File_open(TZFILE,KRESP=IRESP) - IUNIT = TZFILE%NLU - IF ( IRESP /= 0 ) THEN - WRITE(YMSG,*) "problem opening file ",TRIM(YFILE_COEFINT(5)) - CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING',YMSG) - ENDIF - ILINE=1 - DO WHILE (ILINE .LE. INB_LINE(5)) - READ( UNIT=IUNIT, FMT=6003,IOSTAT=IRESP ) ZTC_T_H(ILINE),ZELEV_T_H(ILINE),& - ZFW_T_H(ILINE),ZM_T_H(ILINE),ZS11_CARRE_T_H(ILINE),ZS22_CARRE_T_H(ILINE),ZRE_S22S11_T_H(ILINE),& - ZIM_S22S11_T_H(ILINE),ZRE_S22FMS11FT_T_H(ILINE),ZIM_S22FT_T_H(ILINE),ZIM_S11FT_T_H(ILINE) - ILINE=ILINE+1 - ENDDO - CALL IO_File_close(TZFILE) - TZFILE => NULL() - WRITE(ILUOUT0,*) "NLIGNE hail",ILINE - ILINE=2 - WRITE(ILUOUT0,*) "ILINE=",ILINE - WRITE(ILUOUT0,*) "ZTC_T_H(ILINE),ZELEV_T_H(ILINE)", ZTC_T_H(ILINE),ZELEV_T_H(ILINE) - WRITE(ILUOUT0,*) "ZM_T_H(ILINE),ZS11_CARRE_T_H(ILINE),ZS22_CARRE_T_H(ILINE),ZRE_S22S11_T_H(ILINE)",& - ZM_T_W(ILINE),ZS11_CARRE_T_H(ILINE),ZS22_CARRE_T_H(ILINE),ZRE_S22S11_T_H(ILINE) - WRITE(ILUOUT0,*) "ZIM_S22S11_T_H(ILINE),ZRE_S22FMS11FT_T_H(ILINE),ZIM_S22FT_T_H(ILINE),ZIM_S11FT_T_H(ILINE)",& - ZIM_S22S11_T_H(ILINE),ZRE_S22FMS11FT_T_H(ILINE),ZIM_S22FT_T_H(ILINE),ZIM_S11FT_T_H(ILINE) - ENDIF - ENDIF !END IF T-MATRIX => END OF LOOKUP TABLE READING - - !============== loop over elevations ================= - IEL=NBELEV(JI) - WRITE(ILUOUT0,*) "NBELEV(JI)",NBELEV(JI) - WRITE(ILUOUT0,*) "INPTS_V",INPTS_V - DO JEL=1,IEL - WRITE(ILUOUT0,*) "JEL",JEL - JL=1 - JV=1 - WRITE(ILUOUT0,*) "JL,JV",JL,JV - WRITE(ILUOUT0,*) "PELEV(JI,JEL,JL,JV)*180./XPI",PELEV(JI,JEL,JL,JV)*180./XPI - JL=INBSTEPMAX - JV=INPTS_V - WRITE(ILUOUT0,*) "JL,JV",JL,JV - WRITE(ILUOUT0,*) "PELEV(JI,JEL,JL,JV)*180./XPI",PELEV(JI,JEL,JL,JV)*180./XPI - !============== loop over azimuths ================= - DO JAZ=1,INBAZIM - DO JH=1,INPTS_H !horizontal discretization of the beam - DO JV=1,INPTS_V ! vertical discretization (we go down to check partial masks) - IF(LATT) THEN - ZAERINT=1. - ZAVRINT=1. - ZAEIINT=1. - ZAESINT=1. - ZAVSINT=1. - ZAEGINT=1. - ZAVGINT=1. - ZAEHINT=1. - ZAVHINT=1. - END IF - !Loop over the ranges for one azimuth. If the range is masked, the reflectivity for all the consecutive ranges is set to 0 - LPART_MASK=.FALSE. - LOOPJL: DO JL=1,INBSTEPMAX - IF(LPART_MASK) THEN ! THIS RAY IS MASKED - ZREFL(JI,JEL,JAZ,JL:INBSTEPMAX,JH,JV,1)=0. - EXIT LOOPJL - ELSE - ! if not underground or outside of the MESO-NH domain (PT_RAY : temperature interpolated along the rays) - IF(PT_RAY(JI,JEL,JAZ,JL,JH,JV) /= -XUNDEF) THEN - ! - !--------------------------------------------------------------------------------------------------- - !* 2. RAINDROPS - ! --------- - ! - IF(SIZE(PR_RAY,1) > 0) THEN ! if PR_RAY is available for at least one radar - !contenu en hydrometeore - ZM=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PR_RAY(JI,JEL,JAZ,JL,JH,JV) - IF (GLIMA) ZCC=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PCR_RAY(JI,JEL,JAZ,JL,JH,JV) - !ZM_MIN : min value for rain content (10**-7 <=> Z=-26 dBZ)mixing ratio - IF (GLIMA) THEN - GCALC=((ZM > ZM_MIN).AND.(ZCC > 10**ZCC_MIN(1))) - ELSE - GCALC=(ZM > ZM_MIN) - ENDIF - IF(GCALC ) THEN - !calculation of the dielectrique constant (permittitivité relative) - ! for liquid water from function QEPSW - !(defined in mode_fscatter.f90 => equation 3.6 p 64) - YTYPE='r' - ZQMW=SQRT(QEPSW(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XLIGHTSPEED/XLAM_RAD(JI))) - !ZLBDA : slope distribution parameter (equation 2.6 p 23) - IF (GLIMA) THEN - ZLBDA=( ZLBR*ZCC / ZM )**ZLBEXR - ELSE - ZLBDA=ZLBR*(ZM)**ZLBEXR - ENDIF - ZQK=(ZQMW**2-1.)/(ZQMW**2+2.) !dielectric factor (3.43 p 56) - ZFW=0 !Liquid water fraction (only for melting graupel => 0 for rain) - - !compteur=compteur+1 - !--------------------------------------------------- - ! ------------ DIFFUSION -------------- - !--------------------------------------------------- - !******************************* NDIFF=0 or 4 ********************************* - IF(NDIFF==0.OR.NDIFF==4) THEN ! Rayleigh - !ZREFLOC(1:2) : Zh et Zv = int(sigma(D)*N(D)) (eq 1.6 p 16) - !with N(D) formulation (eq 2.2 p 23) and sigma Rayleigh (3.41 p 55) - !MOMG : gamma function defined in mong.f90 - !XCCR = 1.E7; XLBEXR = -0.25! Marshall-Palmer law (radar_rain_ice.f90) - !ZCXR : -1 (Xi coeff in equation 2.3 p 23) - ZREFLOC(1:2)=1.E18*ZCCR*ZLBDA**(ZCXR-6.)*MOMG(ZALPHAR,ZNUR,6.) - IF(LWREFL) THEN ! weighting by reflectivities - !ZREFL(...,IVDOP)=radial velocity (IVDOP=9), weighted by reflectivity and - !taking into account raindrops fall velocity (ZCR = 842, XDR = 0.8 -> 2.8 p23 et 2.1 p24) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=-ZCR*SIN(PELEV(JI,JEL,JL,JV)) & - *1.E18*ZCCR*ZLBDA**(ZCXR-6.-ZDR)*MOMG(ZALPHAR,ZNUR,6.+ZDR) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZCCR*ZLBDA**ZCXR ! N0j of equation 2.3 p23 (density of particules) - !projection of fall velocity only - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=-ZCR*SIN(PELEV(JI,JEL,JL,JV)) & - *ZCCR*ZLBDA**(ZCXR-ZDR)*MOMG(ZALPHAR,ZNUR,ZDR) - END IF ! end weighting by reflectivities - IF(LATT) THEN ! Calculation of Extinction coefficient - IF(NDIFF==0) THEN ! Rayleigh 3rd order : calculation from equations - ! 3.39 p55 : extinction coeff = int(extinction_section(D) * N(D)) - ! 2.2 and 2.3 p23: simplification of int(D**p * N(D)) and N0j - ! 3.42 p57 : extinction_section(D) - ZAETMP(:)=ZCCR*ZLBDA**ZCXR*(XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)& - *MOMG(ZALPHAR,ZNUR,ZBR)/ZLBDA**ZBR) - ELSE ! Rayleigh 6th order ! eq 3.52 p 58 for extinction coefficient - ZAETMP(:)=ZCCR*ZLBDA**ZCXR*(XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)& - *MOMG(ZALPHAR,ZNUR,ZBR)/ZLBDA**ZBR & - +XPI**4/15./XLAM_RAD(JI)**3*AIMAG(ZQK**2*(ZQMW**4+27.*ZQMW**2+38.) & - /(2.*ZQMW**2+3.))*MOMG(ZALPHAR,ZNUR,5.*ZBR/3.)/ZLBDA**(5.*ZBR/3.)& - +2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(ZQK**2) & - *MOMG(ZALPHAR,ZNUR,2.*ZBR) /ZLBDA**(2.*ZBR)) - END IF - END IF ! end IF(LATT) - ZRE_S22S11_R=0 - ZIM_S22S11_R=0 - ZS22_CARRE_R=0 - ZS11_CARRE_R=0 - !******************************* NDIFF==7 ************************************ - ELSE IF(NDIFF==7) THEN !T-matrix - ZREFLOC(:)=0 - IF(LATT) ZAETMP(:)=0 - IF (GLIMA) THEN - CALL CALC_KTMAT_LIMA(PELEV(JI,JEL,JL,JV),& - PT_RAY(JI,JEL,JAZ,JL,JH,JV),ZCC,ZM,& - ZELEV_MIN(1),ZELEV_MAX(1),ZELEV_STEP(1),& - ZTC_MIN(1),ZTC_MAX(1),ZTC_STEP(1),& - ZCC_MIN(1),ZCC_MAX(1),ZCC_STEP(1),& - ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,& - ITMAT,ZELEV_RED,ZTC_RED,ZCC_RED,ZM_RED) - ELSE - CALL CALC_KTMAT(PELEV(JI,JEL,JL,JV),& - PT_RAY(JI,JEL,JAZ,JL,JH,JV),ZFW,ZM,& - ZELEV_MIN(1),ZELEV_MAX(1),ZELEV_STEP(1),& - ZTC_MIN(1),ZTC_MAX(1),ZTC_STEP(1),& - ZFW_MIN(1),ZFW_MAX(1),ZFW_STEP(1),& - ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,& - ITMAT,ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED) - ENDIF - IF (ITMAT(1) .NE. -NUNDEF) THEN - DO JIND=1,SIZE(KMAT_COEF,2),1 - KMAT_COEF(1,JIND)=ZS11_CARRE_T_R(ITMAT(JIND)) - KMAT_COEF(2,JIND)=ZS22_CARRE_T_R(ITMAT(JIND)) - KMAT_COEF(3,JIND)=ZRE_S22S11_T_R(ITMAT(JIND)) - KMAT_COEF(4,JIND)=ZIM_S22S11_T_R(ITMAT(JIND)) - KMAT_COEF(5,JIND)=ZRE_S22FMS11FT_T_R(ITMAT(JIND)) - KMAT_COEF(6,JIND)=ZIM_S22FT_T_R(ITMAT(JIND)) - KMAT_COEF(7,JIND)=ZIM_S11FT_T_R(ITMAT(JIND)) - ENDDO - IF (GLIMA) THEN - CALL INTERPOL(ZELEV_RED,ZTC_RED,ZCC_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_R,ZS22_CARRE_R,& - ZRE_S22S11_R,ZIM_S22S11_R,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT) - ELSE - CALL INTERPOL(ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_R,ZS22_CARRE_R,& - ZRE_S22S11_R,ZIM_S22S11_R,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT) - ENDIF - ELSE - ZS11_CARRE_R=0 - ZS22_CARRE_R=0 - ZRE_S22S11_R=0 - ZIM_S22S11_R=0 - ZRE_S22FMS11F=0 - ZIM_S22FT=0 - ZIM_S11FT=0 - END IF - ZREFLOC(1)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS22_CARRE_R - ZREFLOC(2)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS11_CARRE_R - ZREFLOC(3)=180.E3/XPI*XLAM_RAD(JI)*ZRE_S22FMS11F - IF (GLIMA) THEN - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & - -ZCR*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) & - *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCC/4./ZLBDA**(2+ZDR) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & - -ZCR*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) & - *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCCR/4./ZLBDA**(3+ZDR) - ENDIF - IF(LATT) THEN - ZAETMP(1)=ZIM_S22FT*XLAM_RAD(JI)*2 - ZAETMP(2)=ZIM_S11FT*XLAM_RAD(JI)*2 - END IF - !******************************* NDIFF=1 or 3 ********************************* - ! Gauss Laguerre integration - ELSE ! MIE OR T-MATRIX OR RAYLEIGH FOR ELLIPSOIDES - ZREFLOC(:)=0. - IF(LATT) ZAETMP(:)=0. - DO JJ=1,NPTS_GAULAG ! ****** Gauss-Laguerre quadrature - SELECT CASE(NDIFF) - CASE(1) ! *************** NDIFF=1 MIE ***************** - ! subroutine BHMIE defined in mode_fscatter.f90 - ! calculate extinction coefficient ZQEXT(1),scattering : ZQSCA - ! and backscattering ZQBACK(1) on the horizontal plan (spheroid) - CALL BHMIE(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA,ZQMW,ZQEXT(1),ZQSCA,ZQBACK(1)) - ZQBACK(2)=ZQBACK(1) !=> same because sphere - ZQEXT(2)=ZQEXT(1) ! modif Clotilde 23/04/2012 - ZQBACK(3)=0. !=> 0 because sphere - CASE(3) !****************** NDIFF==3 RG RAYLEIGH FOR ELLIPSOIDES *********************** - IF(ARF(ZX(JJ)/ZLBDA)==1.) THEN - ZLB=1./3. - ELSE - ZLB=1./(ARF(ZX(JJ)/ZLBDA))**2-1. ! f**2 - ZLB=(1.+ZLB)/ZLB*(1.-ATAN(SQRT(ZLB))/SQRT(ZLB)) ! lambda_b - IF(ZX(JJ)/ZLBDA>16.61E-3) PRINT*, 'Negative axis ratio; reduce NPTS_GAULAG.' - END IF - ! equation 3.44 p 56 (ZX**4 instead of ZX**6 but ZQBACK is multiplied after by ZX**2) - ZQBACK(1)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)**4& - *ABS((ZQMW**2-1.)/3./(1.+.5*(1.-ZLB)*(ZQMW**2-1.)))**2 - ! equation 3.45 p 56 - ZQBACK(2)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)**4*ABS((ZQMW**2-1.)/3.*& - (SIN(PELEV(JI,JEL,JL,JV))**2/(1.+.5*(1.-ZLB)*(ZQMW**2-1.))+& ! PELEV=PI+THETA_I - COS(PELEV(JI,JEL,JL,JV))**2/(1.+ZLB*(ZQMW**2-1.))) )**2 ! - ! KDP from equation 3.49 - ZQBACK(3)=ZX(JJ)/ZLBDA**3*REAL((ZQMW**2-1.)**2*(3.*ZLB-1.)/(2.+(ZQMW**2-1.)*(ZLB+1.) & - +ZLB*(1.-ZLB)*(ZQMW**2-1.)**2)) - IF(LATT) THEN - ! equations 3.48 and 3.49 p57 - ZQEXT(1)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)*AIMAG((ZQMW**2-1.)/3./(1.+.5*(1.-ZLB)*(ZQMW**2-1.))) - ZQEXT(2)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)*AIMAG((ZQMW**2-1.)/3.*& - (SIN(PELEV(JI,JEL,JL,JV))**2/(1.+.5*(1.-ZLB)*(ZQMW**2-1.))+& ! PELEV=PI+THETA_I - COS(PELEV(JI,JEL,JL,JV))**2/(1.+ZLB*(ZQMW**2-1.)))) - END IF - END SELECT !end SELECT NDIFF - !incrementation of the reflectivity and Kdp(1,2,3,4 for Zh, Zv, ) - !with the backscattering coefficients for each point of the GAULAG distribution - ! or each diameter D - ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**2*ZW(JJ) - ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(2+ZDR)*ZW(JJ) - !same for attenuation with extinction coefficient - IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**2*ZW(JJ) - END DO ! ****** end loop Gauss-Laguerre quadrature - - ZREFLOC(1:2)=1.E18*ZREFLOC(1:2)*(XLAM_RAD(JI)/XPI)**4/.93*ZCCR/4./ZLBDA**3 - ZREFLOC(3)=ZREFLOC(3)*XPI**2/6./XLAM_RAD(JI)*ZCCR/ZLBDA & - *180.E3/XPI ! (in deg/km) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & - -ZCR*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) & - *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCCR/4./ZLBDA**(3+ZDR) - - !********* for all cases with Gauss-Laguerre integration - ZRE_S22S11_R=0 - ZIM_S22S11_R=0 - ZS22_CARRE_R=0 - ZS11_CARRE_R=0 - IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZCCR*ZLBDA**(ZCXR-2.*ZBR/3.)/(4.*GAMMA(ZNUR)) - END IF ! ****************** End if for each type of diffusion ************************ - !incrementation of ZHH, ZDR and KDP - ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3) - ! ZER (Z due to raindrops) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZER)=ZREFLOC(1) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDA)=ZREFLOC(2) !Zvv for ZDR due to rain - ZREFL(JI,JEL,JAZ,JL,JH,JV,IKDR)=ZREFLOC(3) !Zvv for ZDR due to rain - - ! RhoHV due to rain - IF (ZS22_CARRE_R*ZS11_CARRE_R .GT. 0) THEN - ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHR)=SQRT(ZRE_S22S11_R**2+ZIM_S22S11_R**2)/SQRT(ZS22_CARRE_R*ZS11_CARRE_R) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHR)=1 - END IF - IF(LATT) THEN - ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAETMP(:) ! specific attenuation due to rain - ZREFL(JI,JEL,JAZ,JL,JH,JV,IAER)=ZAETMP(1) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IAVR)=ZAETMP(2) - ! for ranges over 1, correction of attenuation on reflectivity due to rain - IF(JL>1) THEN - ZAERINT=ZAERINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAER)*XSTEP_RAD) - ZAVRINT=ZAVRINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAVR)*XSTEP_RAD) - END IF - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZER)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZER)*ZAERINT ! Z_r attenuated - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDA)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDA)*ZAVRINT ! ZVr attenuated - END IF !end IF(LATT) - END IF - ! mimimum rainwater mixing ratio - ! Total attenuation even if no hydrometeors (equation 1.7 p 17) - IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATR)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATR) & - *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAER)*XSTEP_RAD) - END IF ! **************** end RAIN (end IF SIZE(PR_RAY,1) > 0) - ! - !--------------------------------------------------------------------------------------------------- - !* 3. PRISTINE ICE - ! --------- - ! - IF (SIZE(PI_RAY,1)>0) THEN - ZM=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PI_RAY(JI,JEL,JAZ,JL,JH,JV) !ice content - IF (PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)==-XUNDEF .OR. PI_RAY(JI,JEL,JAZ,JL,JH,JV)==-XUNDEF) ZM=-XUNDEF - IF (GLIMA) THEN - ZC=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PCIT_RAY(JI,JEL,JAZ,JL,JH,JV) - IF (PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)==-XUNDEF .OR. PCIT_RAY(JI,JEL,JAZ,JL,JH,JV)==-XUNDEF) ZC=-XUNDEF - ELSE - ZC=PCIT_RAY(JI,JEL,JAZ,JL,JH,JV) - ENDIF - IF(ZM>ZM_MIN .AND. ZC> 527.82) THEN - ! cit > 527.82 otherwise pbs due to interpolation - !ice dielectric constant (QPESI defined in mode_fscatter, equation 3.65 p 65) - ZEPSI=QEPSI(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XLIGHTSPEED/XLAM_RAD(JI)) - ZQMI=SQRT(ZEPSI) - ZQK=(ZQMI**2-1.)/(ZQMI**2+2.) - !see 3.77 p68 : to replace Dg by an equivalent diameter De of pure ice, a multiplicative - !melting factor has to be added - ZDMELT_FACT=(6.*ZAI)/(XPI*.92*XRHOLW) - ZEXP=2.*ZBI !XBI = 2.5 (Plates) in ini_radar.f90 (bj tab 2.1 p24) - !ZLBDA : slope distribution parameter (equation 2.6 p 23) - IF (GLIMA) THEN - ZLBDA=(ZLBI*ZC/ZM)**ZLBEXI - ELSE - ZLBDA=ZLBI*(ZM/ZC)**ZLBEXI - ENDIF - ! Rayleigh or Rayleigh-Gans (=> Rayleigh) or Rayleigh with 6th order for attenuation - ! (pristine ice = sphere), - IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN - !ZREFLOC(1:2) : Zh et Zv from equation 2.2 p23 and Cristals parameters - !ZEQICE=0.224 (radar_rain_ice.f90) factor used to convert the ice crystals - !reflectivity into an equivalent liquid water reflectivity (from Smith, JCAM 84) - ZREFLOC(1:2)=ZEQICE*.92**2*ZDMELT_FACT**2*1.E18*ZC & - *ZLBDA**(ZCXI-ZEXP)*MOMG(ZALPHAI,ZNUI,ZEXP) - ZREFLOC(3)=0. - IF(LWREFL) THEN ! weighting by reflectivities - !calculation of radial velocity - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - -ZCI*SIN(PELEV(JI,JEL,JL,JV))*ZEQICE*.92**2*ZDMELT_FACT**2& - *1.E18*ZC*ZLBDA**(ZCXI-ZEXP-ZDI)& - *MOMG(ZALPHAI,ZNUI,ZEXP+ZDI) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)& - +ZC*ZLBDA**ZCXI - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - -ZCI*SIN(PELEV(JI,JEL,JL,JV))& - *ZC& - *ZLBDA**(ZCXI-ZDI)*MOMG(ZALPHAI,ZNUI,ZDI) - END IF - IF(LATT) THEN ! Calculation of Extinction coefficient - ! Rayleigh 3rd order - IF(NDIFF==0.OR.NDIFF==3) THEN - ZAETMP(:)=ZC*ZLBDA**ZCXI& - *(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)& - *MOMG(ZALPHAI,ZNUI,ZBI)/ZLBDA**ZBI) - ! Rayleigh 6th order - ELSE - ZAETMP(:)=ZC*ZLBDA**ZCXI*(& - ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)& - *MOMG(ZALPHAI,ZNUI,ZBI)/ZLBDA**ZBI& - +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3& - *AIMAG(ZQK**2*(ZQMI**4+27.*ZQMI**2+38.)& - /(2.*ZQMI**2+3.))*MOMG(ZALPHAI,ZNUI,5.*ZBI/3.)/ZLBDA**(5.*ZBI/3.) & - +ZDMELT_FACT**2*2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(ZQK**2)& - *MOMG(ZALPHAI,ZNUI,2.*ZBI)/ZLBDA**(2.*ZBI)) - END IF - END IF - ELSE ! (if NDIFF=1 or NDIFF=7) => MIE (if choice=T-Matrix => Mie) - ZREFLOC(:)=0. - IF(LATT) ZAETMP(:)=0. - DO JJ=1,NPTS_GAULAG ! ****** Gauss-Laguerre quadrature - ZD=ZX(JJ)**(1./ZALPHAI)/ZLBDA !equivaut au ZDELTA_EQUIV olivier - ZRHOI=6*ZAI*ZD**(ZBI-3.)/XPI !pristine ice density - ZNUM=1.+2.*ZRHOI*(ZEPSI-1.)/(ZRHOPI*(ZEPSI+2.)) - ZDEN=1.-ZRHOI*(ZEPSI-1.)/(ZRHOPI*(ZEPSI+2.)) - ZQM=sqrt(ZNUM/ZDEN) - CALL BHMIE(XPI/XLAM_RAD(JI)*ZD,ZQM,ZQEXT(1),ZQSCA,ZQBACK(1)) - ZQBACK(2)=ZQBACK(1) - ZQEXT(2)=ZQEXT(1) ! modif Clotilde 23/04/2012 - ZQBACK(3)=0. - ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**(ZNUI-1.)*ZD**2*ZW(JJ) - ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(ZNUI-1.+ZDI/ZALPHAI)*ZD**2*ZW(JJ) - IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(ZNUI-1.)*ZD**2*ZW(JJ) - END DO ! **************** end loop Gauss-Laguerre quadrature - - ZREFLOC(1:2)=ZREFLOC(1:2)*1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZC & - *ZLBDA**(ZCXI)/(4.*GAMMA(ZNUI)) - - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & - -ZCI*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) & - *1.E18*(XLAM_RAD(JI)/XPI)**4*ZC & - *ZLBDA**(ZCXI-ZDI)/(4.*GAMMA(ZNUI)*.93) - IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZC*ZLBDA**(ZCXI)/(4.*GAMMA(ZNUI)) - END IF !**************** end loop for each type of diffusion - ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEI)=ZREFLOC(1) ! z_e due to pristine ice - IF(LATT) THEN - ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)+ZAETMP(:) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IAEI)=ZAETMP(1) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IAVI)=ZAETMP(2) - IF(JL>1) ZAEIINT=ZAEIINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEI)*XSTEP_RAD) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEI)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEI)*ZAEIINT ! Z_i attenuated - END IF - END IF !********************* end IF (SIZE(PI_RAY,1)>0) - - ! Total attenuation even if no hydrometeors - IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATI)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATI) & - *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEI)*XSTEP_RAD) - ZRE_S22S11_I=0 - ZIM_S22S11_I=0 - ZS22_CARRE_I=0 - ZS11_CARRE_I=0 - END IF !******************** end IF (SIZE(PI_RAY,1)>0) - !--------------------------------------------------------------------------------------------------- - !* 4. SNOW - ! ----- - IF (SIZE(PS_RAY,1)>0) THEN - ZM=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PS_RAY(JI,JEL,JAZ,JL,JH,JV) !snow content - IF(ZM > ZM_MIN) THEN - YTYPE='s' - !ZQMI: same formulation than for ice because snow is simulated only - !above melting leyer (3.5.4 p 67) - ZFW=0 - ZQMI=SQRT(QEPSI(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XLIGHTSPEED/XLAM_RAD(JI))) - ZQK=(ZQMI**2-1.)/(ZQMI**2+2.) !ajout de Clotilde 23/04/2012 - ZDMELT_FACT=6.*ZAS/(XPI*.92*XRHOLW) - ZEXP=2.*ZBS !XBS = 1.9 in ini_radar.f90 (bj tab 2.1 p24) - !dans ini_rain_ice.f90 : - IF (GLIMA .AND. LSNOW_T_L) THEN - IF (PT_RAY(JI,JEL,JAZ,JL,JH,JV)>263.15) THEN - ZLBDA = MAX(MIN(XLBDAS_MAX_L, 10**(14.554-0.0423*PT_RAY(JI,JEL,JAZ,JL,JH,JV))),XLBDAS_MIN_L) & - *XTRANS_MP_GAMMAS_L - ELSE - ZLBDA = MAX(MIN(XLBDAS_MAX_L, 10**(6.226-0.0106*PT_RAY(JI,JEL,JAZ,JL,JH,JV))),XLBDAS_MIN_L) & - *XTRANS_MP_GAMMAS_L - END IF - ZN=ZNS*ZM*ZLBDA**ZBS - ELSE IF (.NOT.GLIMA .AND. LSNOW_T_I) THEN - IF (PT_RAY(JI,JEL,JAZ,JL,JH,JV)>263.15) THEN - ZLBDA = MAX(MIN(XLBDAS_MAX_I, 10**(14.554-0.0423*PT_RAY(JI,JEL,JAZ,JL,JH,JV))),XLBDAS_MIN_I) & - *XTRANS_MP_GAMMAS_I - ELSE - ZLBDA = MAX(MIN(XLBDAS_MAX_I, 10**(6.226-0.0106*PT_RAY(JI,JEL,JAZ,JL,JH,JV))),XLBDAS_MIN_I) & - *XTRANS_MP_GAMMAS_I - END IF - ZN=ZNS*ZM*ZLBDA**ZBS - ELSE - ZLBDA= ZLBS*(ZM)**ZLBEXS - ZN=ZCCS*ZLBDA**ZCXS - END IF - ! Rayleigh or Rayleigh-Gans or Rayleigh with 6th order for attenuation - IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN - ZREFLOC(1:2)=ZEQICE*.92**2*ZDMELT_FACT**2*1.E18*ZN*ZLBDA**(ZEXP)*MOMG(ZALPHAS,ZNUS,ZEXP) - ZREFLOC(3)=0. - IF(LWREFL) THEN ! weighting by reflectivities - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - -ZCS*SIN(PELEV(JI,JEL,JL,JV))*ZEQICE*.92**2*ZDMELT_FACT**2& - *1.E18*ZN*ZLBDA**(ZEXP-ZDS)*MOMG(ZALPHAS,ZNUS,ZEXP+ZDS) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)+ZN - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - -ZCS*SIN(PELEV(JI,JEL,JL,JV))& - *ZN*ZLBDA**(ZDS)*MOMG(ZALPHAS,ZNUS,ZDS) - END IF - IF(LATT) THEN - IF(NDIFF==0.OR.NDIFF==3) THEN - ZAETMP(:)=ZN*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)& - *MOMG(ZALPHAS,ZNUS,ZBS)/ZLBDA**ZBS) - ELSE - ZAETMP(:)=ZN*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK) & - *MOMG(ZALPHAS,ZNUS,ZBS)/ZLBDA**ZBS & - +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3 & - *AIMAG(ZQK**2*(ZQMI**4+27.*ZQMI**2+38.) & - /(2.*ZQMI**2+3.))*MOMG(ZALPHAS,ZNUS,5.*ZBS/3.)/ZLBDA**(5.*ZBS/3.) & - +ZDMELT_FACT**2 *2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(ZQK**2) & - *MOMG(ZALPHAS,ZNUS,2.*ZBS)/ZLBDA**(2.*ZBS)) - END IF - END IF - ZRE_S22S11_S=0 - ZIM_S22S11_S=0 - ZS22_CARRE_S=0 - ZS11_CARRE_S=0 - !******************************* NDIFF==7 ************************************ - ELSE IF(NDIFF==7) THEN - - ZREFLOC(:)=0 - IF(LATT) ZAETMP(:)=0 - CALL CALC_KTMAT(PELEV(JI,JEL,JL,JV), PT_RAY(JI,JEL,JAZ,JL,JH,JV),& - ZFW,ZM,& - ZELEV_MIN(2),ZELEV_MAX(2),ZELEV_STEP(2),& - ZTC_MIN(2),ZTC_MAX(2),ZTC_STEP(2),& - ZFW_MIN(2),ZFW_MAX(2),ZFW_STEP(2),& - ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,& - ITMAT,ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED) - - IF (ITMAT(1) .NE. -NUNDEF) THEN - DO JIND=1,SIZE(KMAT_COEF,2),1 - KMAT_COEF(1,JIND)=ZS11_CARRE_T_S(ITMAT(JIND)) - KMAT_COEF(2,JIND)=ZS22_CARRE_T_S(ITMAT(JIND)) - KMAT_COEF(3,JIND)=ZRE_S22S11_T_S(ITMAT(JIND)) - KMAT_COEF(4,JIND)=ZIM_S22S11_T_S(ITMAT(JIND)) - KMAT_COEF(5,JIND)=ZRE_S22FMS11FT_T_S(ITMAT(JIND)) - KMAT_COEF(6,JIND)=ZIM_S22FT_T_S(ITMAT(JIND)) - KMAT_COEF(7,JIND)=ZIM_S11FT_T_S(ITMAT(JIND)) - ENDDO - CALL INTERPOL(ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_S,ZS22_CARRE_S,& - ZRE_S22S11_S,ZIM_S22S11_S,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT) - ELSE - ZS11_CARRE_S=0 - ZS22_CARRE_S=0 - ZRE_S22S11_S=0 - ZIM_S22S11_S=0 - ZRE_S22FMS11F=0 - ZIM_S22FT=0 - ZIM_S11FT=0 - END IF - ZREFLOC(1)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS22_CARRE_S - ZREFLOC(2)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS11_CARRE_S - ZREFLOC(3)=180.E3/XPI*XLAM_RAD(JI)*ZRE_S22FMS11F - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & - -ZCS*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) & - *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*(ZN*ZLBDA**(-ZCXS))/4./ZLBDA**(3+ZDS) - IF(LATT) THEN - ZAETMP(1)=ZIM_S22FT*XLAM_RAD(JI)*2 - ZAETMP(2)=ZIM_S11FT*XLAM_RAD(JI)*2 - END IF - ELSE ! MIE - ZREFLOC(:)=0. - IF(LATT) ZAETMP(:)=0. - DO JJ=1,NPTS_GAULAG ! ****** Gauss-Laguerre quadrature - ZD=ZX(JJ)**(1./ZALPHAS)/ZLBDA - ZDE=ZDMELT_FACT**(1./3.)*ZD**(ZBS/3.) - CALL BHMIE(XPI/XLAM_RAD(JI)*ZDE,ZQMI,ZQEXT(1),ZQSCA,ZQBACK(1)) - ZQBACK(2)=ZQBACK(1) - ZQEXT(2)=ZQEXT(1) ! modif Clotilde 23/04/2012 - ZQBACK(3)=0. - ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**(ZNUS-1.+2.*ZBS/3./ZALPHAS)*ZW(JJ) - ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(ZNUS-1.+2.*ZBS/3./ZALPHAS+ZDS/ZALPHAS)*ZW(JJ) - IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(ZNUS-1.+2.*ZBS/3./ZALPHAS)*ZW(JJ) - END DO ! ****** end loop Gauss-Laguerre quadrature - ZREFLOC(1:2)=1.E18*(XLAM_RAD(JI)/XPI)**4*ZN*ZLBDA**(-2.*ZBS/3.)/& - (4.*GAMMA(ZNUS)*.93)*ZDMELT_FACT**(2./3.)*ZREFLOC(1:2) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & - -ZCS*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) & - *1.E18*(XLAM_RAD(JI)/XPI)**4*ZN & - *ZLBDA**(2.*ZBS/3.-ZDS)/ & - (4.*GAMMA(ZNUS)*.93)*ZDMELT_FACT**(2./3.) - IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZN*ZLBDA**(-2.*ZBS/3.)/(4.*GAMMA(ZNUS))& - *ZDMELT_FACT**(2./3.) - ZRE_S22S11_S=0 - ZIM_S22S11_S=0 - ZS22_CARRE_S=0 - ZS11_CARRE_S=0 - END IF !**************** end loop for each type of diffusion - ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZES)=ZREFLOC(1) ! Z_e due to snow - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDS)=ZREFLOC(2) !Zvv for ZDR due to snow - ZREFL(JI,JEL,JAZ,JL,JH,JV,IKDS)=ZREFLOC(3) !Zvv for ZDR due to snow - IF (ZS22_CARRE_S*ZS11_CARRE_S .GT. 0) THEN - ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHS)=SQRT(ZRE_S22S11_S**2+ZIM_S22S11_S**2)/SQRT(ZS22_CARRE_S*ZS11_CARRE_S) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHS)=1 - END IF - IF(LATT) THEN - ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)+ZAETMP(:) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IAES)=ZAETMP(1) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IAVS)=ZAETMP(2) - IF(JL>1) THEN - ZAESINT=ZAESINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAES)*XSTEP_RAD) - ZAVSINT=ZAVSINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAVS)*XSTEP_RAD) - ENDIF - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZES)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZES)*ZAESINT ! Z_s attenuated - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDS)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDS)*ZAVSINT ! ZVs attenuated - END IF !end IF(LATT) - END IF !end IF(PS_RAY(JI,JEL,JAZ,JL,JH,JV) > ...) - - - ! Total attenuation even if no hydrometeors - IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATS)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATS) & - *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAES)*XSTEP_RAD) - END IF !END IF (SIZE(PS_RAY,1)>0) - !--------------------------------------------------------------------------------------------------- - !* 5. GRAUPEL - ! ------- - ! - !ZDG=.5 ! from Bringi & Chandrasekar 2001, p. 433 - IF (SIZE(PG_RAY,1)>0) THEN - ZM=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PG_RAY(JI,JEL,JAZ,JL,JH,JV) !graupel content - IF(ZM > ZM_MIN) THEN - YTYPE='g' - ZQMI=SQRT(QEPSI(MIN(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XTT),XLIGHTSPEED/XLAM_RAD(JI))) - ZQMW=SQRT(QEPSW(MAX(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XTT),XLIGHTSPEED/XLAM_RAD(JI))) - !ini_radar.f90 : ZCXG = -0.5 XBG = 2.8 ( Xj et bj tab 2.1 p 24) - !ini_rain_ice.f90 : XLBEXG = 1.0/(XCXG-XBG) XAG = 19.6 (aj tab 2.1 p 24) - !XLBG = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG) )**(-XLBEXG) (eq 2.6 p 23) - IF (PR_RAY(JI,JEL,JAZ,JL,JH,JV) > ZRTMIN(3) ) THEN - ZFW=PR_RAY(JI,JEL,JAZ,JL,JH,JV)/(PR_RAY(JI,JEL,JAZ,JL,JH,JV)+PG_RAY(JI,JEL,JAZ,JL,JH,JV)) - ELSE - ZFW=0. - END IF - ZLBDA=ZLBG*(PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PG_RAY(JI,JEL,JAZ,JL,JH,JV))**ZLBEXG - !XTT : température du point triple de l'eau (273.16 K <=> 0.1 °C) - IF(PT_RAY(JI,JEL,JAZ,JL,JH,JV) > XTT) THEN ! mixture of ice and water - ZFRAC_ICE = .85 !(see p 68) - ELSE ! only ice - ZFRAC_ICE=1. - END IF - ! from eq 3.77 p 68 - !XRHOLW=1000 (initialized in ini_cst.f90) - ZDMELT_FACT=6.*ZAG/(XPI*XRHOLW*((1.-ZFRAC_ICE)+ZFRAC_ICE*0.92)) - ZEXP=2.*ZBG - !Calculation of the refractive index from Bohren and Battan (3.72 p66) - ZQB=2.*ZQMW**2*(2.*ZQMI**2*LOG(ZQMI/ZQMW)/(ZQMI**2-ZQMW**2)-1.)/(ZQMI**2-ZQMW**2) !Beta (3.73 p66) - ZQM=SQRT(((1.-ZFRAC_ICE)*ZQMW**2+ZFRAC_ICE*ZQB*ZQMI**2)/(1.-ZFRAC_ICE+ZFRAC_ICE*ZQB)) ! Bohren & Battan (1982) 3.72 p66 - ZQK=(ZQM**2-1.)/(ZQM**2+2.) - !Rayleigh, Rayleigh for ellipsoides or Rayleigh 6th order - IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN - ZREFLOC(1:2)=ABS(ZQK)**2/.93*ZDMELT_FACT**2*1.E18*ZCCG*ZLBDA**(ZCXG-ZEXP)*MOMG(ZALPHAG,ZNUG,ZEXP) - ZREFLOC(3)=0. - IF(LWREFL) THEN ! weighting by reflectivities - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - -ZCG*SIN(PELEV(JI,JEL,JL,JV))*ABS(ZQK)**2/.93*ZDMELT_FACT**2& - *1.E18*ZCCG*ZLBDA**(ZCXG-ZEXP-ZDG)*MOMG(ZALPHAG,ZNUG,ZEXP+ZDG) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)+ZCCG*ZLBDA**ZCXG - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - -ZCG*SIN(PELEV(JI,JEL,JL,JV))& - *ZCCG*ZLBDA**(ZCXG-ZDG)*MOMG(ZALPHAG,ZNUG,ZDG) - END IF !end IF(LWREFL) - IF(LATT) THEN - IF(NDIFF==0.OR.NDIFF==3) THEN - ZAETMP(:)=ZCCG*ZLBDA**ZCXG*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK) & - *MOMG(ZALPHAG,ZNUG,ZBG)/ZLBDA**ZBG) - ELSE - ZAETMP(:)=ZCCG*ZLBDA**ZCXG*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK) & - *MOMG(ZALPHAG,ZNUG,ZBG)/ZLBDA**ZBG& - +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3 & - *AIMAG(ZQK**2*(ZQM**4+27.*ZQM**2+38.) & - /(2.*ZQM**2+3.))*MOMG(ZALPHAG,ZNUG,5.*ZBG/3.)/ZLBDA**(5.*ZBG/3.)& - +ZDMELT_FACT**2 *2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(ZQK**2) & - *MOMG(ZALPHAG,ZNUG,2.*ZBG) /ZLBDA**(2.*ZBG)) - END IF ! end IF(NDIFF==0.OR.NDIFF==3) - END IF ! end IF(LATT) - ZRE_S22S11_G=0 - ZIM_S22S11_G=0 - ZS22_CARRE_G=0 - ZS11_CARRE_G=0 - !******************************* NDIFF==7 TmatInt ************************************ - ELSE IF(NDIFF==7) THEN - ZREFLOC(:)=0 - IF(LATT) ZAETMP(:)=0 - IF (ZFW < 0.01) THEN !******** DRY GRAUPEL - CALL CALC_KTMAT(PELEV(JI,JEL,JL,JV), PT_RAY(JI,JEL,JAZ,JL,JH,JV),& - ZFW,ZM,& - ZELEV_MIN(3),ZELEV_MAX(3),ZELEV_STEP(3),& - ZTC_MIN(3),ZTC_MAX(3),ZTC_STEP(3),& - ZFW_MIN(3),ZFW_MAX(3),ZFW_STEP(3),& - ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,& - ITMAT,ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED) - IF (ITMAT(1) .NE. -NUNDEF) THEN - DO JIND=1,SIZE(KMAT_COEF,2),1 - KMAT_COEF(1,JIND)=ZS11_CARRE_T_G(ITMAT(JIND)) - KMAT_COEF(2,JIND)=ZS22_CARRE_T_G(ITMAT(JIND)) - KMAT_COEF(3,JIND)=ZRE_S22S11_T_G(ITMAT(JIND)) - KMAT_COEF(4,JIND)=ZIM_S22S11_T_G(ITMAT(JIND)) - KMAT_COEF(5,JIND)=ZRE_S22FMS11FT_T_G(ITMAT(JIND)) - KMAT_COEF(6,JIND)=ZIM_S22FT_T_G(ITMAT(JIND)) - KMAT_COEF(7,JIND)=ZIM_S11FT_T_G(ITMAT(JIND)) - ENDDO - CALL INTERPOL(ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_G,ZS22_CARRE_G,& - ZRE_S22S11_G,ZIM_S22S11_G,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT) - ELSE - ZS11_CARRE_G=0 - ZS22_CARRE_G=0 - ZRE_S22S11_G=0 - ZIM_S22S11_G=0 - ZRE_S22FMS11F=0 - ZIM_S22FT=0 - ZIM_S11FT=0 - END IF - ELSE !ZFW >= 0.01 ************** WET GRAUPEL - CALL CALC_KTMAT(PELEV(JI,JEL,JL,JV),PT_RAY(JI,JEL,JAZ,JL,JH,JV),& - ZFW,ZM,& - ZELEV_MIN(4),ZELEV_MAX(4),ZELEV_STEP(4),& - ZTC_MIN(4),ZTC_MAX(4),ZTC_STEP(4),& - ZFW_MIN(4),ZFW_MAX(4),ZFW_STEP(4),& - ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,& - ITMAT,ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED) - IF (ITMAT(1) .NE. -NUNDEF) THEN - DO JIND=1,SIZE(KMAT_COEF,2),1 - KMAT_COEF(1,JIND)=ZS11_CARRE_T_W(ITMAT(JIND)) - KMAT_COEF(2,JIND)=ZS22_CARRE_T_W(ITMAT(JIND)) - KMAT_COEF(3,JIND)=ZRE_S22S11_T_W(ITMAT(JIND)) - KMAT_COEF(4,JIND)=ZIM_S22S11_T_W(ITMAT(JIND)) - KMAT_COEF(5,JIND)=ZRE_S22FMS11FT_T_W(ITMAT(JIND)) - KMAT_COEF(6,JIND)=ZIM_S22FT_T_W(ITMAT(JIND)) - KMAT_COEF(7,JIND)=ZIM_S11FT_T_W(ITMAT(JIND)) - ENDDO - CALL INTERPOL(ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_G,ZS22_CARRE_G,& - ZRE_S22S11_G,ZIM_S22S11_G,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT) - ELSE - ZS11_CARRE_G=0 - ZS22_CARRE_G=0 - ZRE_S22S11_G=0 - ZIM_S22S11_G=0 - ZRE_S22FMS11F=0 - ZIM_S22FT=0 - ZIM_S11FT=0 - END IF - END IF!END IF (ZFW<0.01) - ZREFLOC(1)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS22_CARRE_G - ZREFLOC(2)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS11_CARRE_G - ZREFLOC(3)=180.E3/XPI*XLAM_RAD(JI)*ZRE_S22FMS11F - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & - -ZCG*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) & - *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCCG/4./ZLBDA**(3+ZDG) - IF(LATT) THEN - ZAETMP(1)=ZIM_S22FT*XLAM_RAD(JI)*2 - ZAETMP(2)=ZIM_S11FT*XLAM_RAD(JI)*2 - END IF - ELSE ! Mie (NDIFF=1) - ZREFLOC(:)=0. - IF(LATT) ZAETMP(:)=0. - DO JJ=1,NPTS_GAULAG ! ****** Gauss-Laguerre quadrature - ZD=ZX(JJ)**(1./ZALPHAG)/ZLBDA - ZDE=ZDMELT_FACT**(1./3.)*ZD**(ZBG/3.) - CALL BHMIE(XPI/XLAM_RAD(JI)*ZDE,ZQM,ZQEXT(1),ZQSCA,ZQBACK(1)) - ZQBACK(2)=ZQBACK(1) - ZQEXT(2)=ZQEXT(1) ! modif Clotilde 23/04/2012 - ZQBACK(3)=0. - ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**(ZNUG-1.+2.*ZBG/3./ZALPHAG)*ZW(JJ) - ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(ZNUG-1.+2.*ZBG/3./ZALPHAG+ZDG/ZALPHAG)*ZW(JJ) - IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(ZNUG-1.+2.*ZBG/3./ZALPHAG)*ZW(JJ) - END DO ! ****** end loop on diameter (Gauss-Laguerre) - ZREFLOC(1:2)=ZREFLOC(1:2)*1.E18*(XLAM_RAD(JI)/XPI)**4*ZCCG & - *ZLBDA**(ZCXG-2.*ZBG/3.)/(4.*GAMMA(ZNUG)*.93)*ZDMELT_FACT**(2./3.) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP) & - +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & - -ZCG*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) & - *1.E18*(XLAM_RAD(JI)/XPI)**4*ZCCG & - *ZLBDA**(ZCXG-2.*ZBG/3.-ZDG)/(4.*GAMMA(ZNUG)*.93)*ZDMELT_FACT**(2./3.) - IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZCCG*ZLBDA**(ZCXG-2.*ZBG/3.)/(4.*GAMMA(ZNUG)) & - *ZDMELT_FACT**(2./3.) - ZRE_S22S11_G=0 - ZIM_S22S11_G=0 - ZS22_CARRE_G=0 - ZS11_CARRE_G=0 !0 in case of Mie - END IF !**************** end loop for each type of diffusion : IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) - ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEG)=ZREFLOC(1) ! z_e due to graupel - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDG)=ZREFLOC(2) !Zvv for ZDR due to graupel - ZREFL(JI,JEL,JAZ,JL,JH,JV,IKDG)=ZREFLOC(3) !Zvv for ZDR due to graupel - - IF (ZS22_CARRE_G*ZS11_CARRE_G .GT. 0) THEN - ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHG)=SQRT(ZRE_S22S11_G**2+ZIM_S22S11_G**2)/SQRT(ZS22_CARRE_G*ZS11_CARRE_G) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHG)=1 - END IF - IF(LATT) THEN - ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)+ZAETMP(:) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IAEG)=ZAETMP(1) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IAVG)=ZAETMP(2) - IF(JL>1) THEN - ZAEGINT=ZAEGINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEG)*XSTEP_RAD) - ZAVGINT=ZAVGINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAVG)*XSTEP_RAD) - END IF - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEG)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEG)*ZAEGINT ! Z_g attenuated - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDG)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDG)*ZAVGINT ! Z_g attenuated - END IF !end IF(LATT) - END IF !**************** IF(PG_RAY(JI,JEL,JAZ,JL,JH,JV) > XRTMIN(6)) - - ! Total attenuation even if no hydrometeors - IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATG)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATG) & - *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEG)*XSTEP_RAD) - - END IF ! **************** end GRAUPEL (end IF SIZE(PG_RAY,1) > 0) - !----------------------------------------------------------------------------------------------- - !----------------------------------------------------------------------------------------------- -!********************************** -!********************************** -!********************************** -!********************************** - - -!--------------------------------------------------------------------------------------------------- - !* 6. HAIL - ! ------- - ! - ! - IF (GHAIL) THEN - ZM=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PH_RAY(JI,JEL,JAZ,JL,JH,JV) !graupel content - IF(ZM > ZM_MIN) THEN - YTYPE='h' - ZQMI=SQRT(QEPSI(MIN(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XTT),XLIGHTSPEED/XLAM_RAD(JI))) - ZQMW=SQRT(QEPSW(MAX(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XTT),XLIGHTSPEED/XLAM_RAD(JI))) - !ini_radar.f90 : ZCXG = -0.5 XBG = 2.8 ( Xj et bj tab 2.1 p 24) - !ini_rain_ice.f90 : XLBEXG = 1.0/(XCXG-XBG) XAG = 19.6 (aj tab 2.1 p 24) - !XLBG = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG) )**(-XLBEXG) (eq 2.6 p 23) -ZFW=0 !???????? - ZLBDA=ZLBH*(PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PH_RAY(JI,JEL,JAZ,JL,JH,JV))**ZLBEXH - !XTT : température du point triple de l'eau (273.16 K <=> 0.1 °C) - IF(PT_RAY(JI,JEL,JAZ,JL,JH,JV) > XTT) THEN ! mixture of ice and water - ZFRAC_ICE = .85 !(see p 68) - ELSE ! only ice - ZFRAC_ICE=1. - END IF - ! from eq 3.77 p 68 - !XRHOLW=1000 (initialized in ini_cst.f90) - ZDMELT_FACT=6.*ZAG/(XPI*XRHOLW*((1.-ZFRAC_ICE)+ZFRAC_ICE*0.92)) - ZEXP=2.*ZBH - !Calculation of the refractive index from Bohren and Battan (3.72 p66) - ZQB=2.*ZQMW**2*(2.*ZQMI**2*LOG(ZQMI/ZQMW)/(ZQMI**2-ZQMW**2)-1.)/(ZQMI**2-ZQMW**2) !Beta (3.73 p66) - ZQM=SQRT(((1.-ZFRAC_ICE)*ZQMW**2+ZFRAC_ICE*ZQB*ZQMI**2)/(1.-ZFRAC_ICE+ZFRAC_ICE*ZQB)) ! Bohren & Battan (1982) 3.72 p66 - ZQK=(ZQM**2-1.)/(ZQM**2+2.) - !Rayleigh, Rayleigh for ellipsoides or Rayleigh 6th order - IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN - ZREFLOC(1:2)=ABS(ZQK)**2/.93*ZDMELT_FACT**2*1.E18*ZCCH*ZLBDA**(ZCXH-ZEXP)*MOMG(ZALPHAH,ZNUH,ZEXP) - ZREFLOC(3)=0. - IF(LWREFL) THEN ! weighting by reflectivities - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - -ZCH*SIN(PELEV(JI,JEL,JL,JV))*ABS(ZQK)**2/.93*ZDMELT_FACT**2& - *1.E18*ZCCH*ZLBDA**(ZCXH-ZEXP-ZDH)*MOMG(ZALPHAH,ZNUH,ZEXP+ZDH) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)+ZCCH*ZLBDA**ZCXH - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - -ZCH*SIN(PELEV(JI,JEL,JL,JV))& - *ZCCH*ZLBDA**(ZCXH-ZDH)*MOMG(ZALPHAH,ZNUH,ZDH) - END IF !end IF(LWREFL) - IF(LATT) THEN - IF(NDIFF==0.OR.NDIFF==3) THEN - ZAETMP(:)=ZCCH*ZLBDA**ZCXH*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK) & - *MOMG(ZALPHAH,ZNUH,ZBH)/ZLBDA**ZBH) - ELSE - ZAETMP(:)=ZCCH*ZLBDA**ZCXH*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK) & - *MOMG(ZALPHAH,ZNUH,ZBH)/ZLBDA**ZBH& - +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3 & - *AIMAG(ZQK**2*(ZQM**4+27.*ZQM**2+38.) & - /(2.*ZQM**2+3.))*MOMG(ZALPHAH,ZNUH,5.*ZBH/3.)/ZLBDA**(5.*ZBH/3.)& - +ZDMELT_FACT**2 *2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(ZQK**2) & - *MOMG(ZALPHAH,ZNUH,2.*ZBH) /ZLBDA**(2.*ZBH)) - END IF ! end IF(NDIFF==0.OR.NDIFF==3) - END IF ! end IF(LATT) - ZRE_S22S11_H=0 - ZIM_S22S11_H=0 - ZS22_CARRE_H=0 - ZS11_CARRE_H=0 - !******************************* NDIFF==7 TmatInt ************************************ - ELSE IF(NDIFF==7) THEN - ZREFLOC(:)=0 - IF(LATT) ZAETMP(:)=0 - CALL CALC_KTMAT(PELEV(JI,JEL,JL,JV), PT_RAY(JI,JEL,JAZ,JL,JH,JV),& - ZFW,ZM,& - ZELEV_MIN(3),ZELEV_MAX(3),ZELEV_STEP(3),& - ZTC_MIN(3),ZTC_MAX(3),ZTC_STEP(3),& - ZFW_MIN(3),ZFW_MAX(3),ZFW_STEP(3),& - ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,& - ITMAT,ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED) - IF (ITMAT(1) .NE. -NUNDEF) THEN - DO JIND=1,SIZE(KMAT_COEF,2),1 - KMAT_COEF(1,JIND)=ZS11_CARRE_T_H(ITMAT(JIND)) - KMAT_COEF(2,JIND)=ZS22_CARRE_T_H(ITMAT(JIND)) - KMAT_COEF(3,JIND)=ZRE_S22S11_T_H(ITMAT(JIND)) - KMAT_COEF(4,JIND)=ZIM_S22S11_T_H(ITMAT(JIND)) - KMAT_COEF(5,JIND)=ZRE_S22FMS11FT_T_H(ITMAT(JIND)) - KMAT_COEF(6,JIND)=ZIM_S22FT_T_H(ITMAT(JIND)) - KMAT_COEF(7,JIND)=ZIM_S11FT_T_H(ITMAT(JIND)) - ENDDO - CALL INTERPOL(ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_H,ZS22_CARRE_H,& - ZRE_S22S11_H,ZIM_S22S11_H,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT) - ELSE - ZS11_CARRE_H=0 - ZS22_CARRE_H=0 - ZRE_S22S11_H=0 - ZIM_S22S11_H=0 - ZRE_S22FMS11F=0 - ZIM_S22FT=0 - ZIM_S11FT=0 - END IF - ZREFLOC(1)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS22_CARRE_H - ZREFLOC(2)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS11_CARRE_H - ZREFLOC(3)=180.E3/XPI*XLAM_RAD(JI)*ZRE_S22FMS11F - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & - -ZCH*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) & - *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCCH/4./ZLBDA**(3+ZDH) - IF(LATT) THEN - ZAETMP(1)=ZIM_S22FT*XLAM_RAD(JI)*2 - ZAETMP(2)=ZIM_S11FT*XLAM_RAD(JI)*2 - END IF - ELSE ! Mie (NDIFF=1) - ZREFLOC(:)=0. - IF(LATT) ZAETMP(:)=0. - DO JJ=1,NPTS_GAULAG ! ****** Gauss-Laguerre quadrature - ZD=ZX(JJ)**(1./ZALPHAH)/ZLBDA - ZDE=ZDMELT_FACT**(1./3.)*ZD**(ZBH/3.) - CALL BHMIE(XPI/XLAM_RAD(JI)*ZDE,ZQM,ZQEXT(1),ZQSCA,ZQBACK(1)) - ZQBACK(2)=ZQBACK(1) - ZQEXT(2)=ZQEXT(1) ! modif Clotilde 23/04/2012 - ZQBACK(3)=0. - ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**(ZNUH-1.+2.*ZBH/3./ZALPHAH)*ZW(JJ) - ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(ZNUH-1.+2.*ZBH/3./ZALPHAH+ZDH/ZALPHAH)*ZW(JJ) - IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(ZNUH-1.+2.*ZBH/3./ZALPHAH)*ZW(JJ) - END DO ! ****** end loop on diameter (Gauss-Laguerre) - ZREFLOC(1:2)=ZREFLOC(1:2)*1.E18*(XLAM_RAD(JI)/XPI)**4*ZCCH & - *ZLBDA**(ZCXH-2.*ZBH/3.)/(4.*GAMMA(ZNUH)*.93)*ZDMELT_FACT**(2./3.) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP) & - +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & - -ZCH*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) & - *1.E18*(XLAM_RAD(JI)/XPI)**4*ZCCH & - *ZLBDA**(ZCXH-2.*ZBH/3.-ZDH)/(4.*GAMMA(ZNUH)*.93)*ZDMELT_FACT**(2./3.) - IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZCCH*ZLBDA**(ZCXH-2.*ZBH/3.)/(4.*GAMMA(ZNUH)) & - *ZDMELT_FACT**(2./3.) - ZRE_S22S11_H=0 - ZIM_S22S11_H=0 - ZS22_CARRE_H=0 - ZS11_CARRE_H=0 !0 in case of Mie - END IF !**************** end loop for each type of diffusion : IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) - ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEH)=ZREFLOC(1) ! z_e due to graupel - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDH)=ZREFLOC(2) !Zvv for ZDR due to graupel - ZREFL(JI,JEL,JAZ,JL,JH,JV,IKDH)=ZREFLOC(3) !Zvv for ZDR due to graupel - - IF (ZS22_CARRE_H*ZS11_CARRE_H .GT. 0) THEN - ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHH)=SQRT(ZRE_S22S11_H**2+ZIM_S22S11_H**2)/SQRT(ZS22_CARRE_H*ZS11_CARRE_H) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHH)=1 - END IF - IF(LATT) THEN - ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)+ZAETMP(:) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IAEH)=ZAETMP(1) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IAVH)=ZAETMP(2) - IF(JL>1) THEN - ZAEHINT=ZAEHINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEH)*XSTEP_RAD) - ZAVHINT=ZAVHINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAVH)*XSTEP_RAD) - END IF - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEH)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEH)*ZAEHINT ! Z_g attenuated - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDH)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDH)*ZAVHINT ! Z_g attenuated - END IF !end IF(LATT) - END IF !**************** IF(PH_RAY(JI,JEL,JAZ,JL,JH,JV) > XRTMIN(6)) - - ! Total attenuation even if no hydrometeors - IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATH)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATH) & - *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEH)*XSTEP_RAD) - - END IF ! **************** end HAIL (end IF SIZE(PH_RAY,1) > 0) - !----------------------------------------------------------------------------------------------- - !----------------------------------------------------------------------------------------------- -!********************************** -!********************************** -!********************************** -!********************************** - - IF(LWREFL) THEN ! weighting by reflectivities - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFL(JI,JEL,JAZ,JL,JH,JV,1) - ELSE IF(LWBSCS) THEN ! weighting by hydrometeor concentrations - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX) - ELSE IF(ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)/=0.) THEN ! no weighting - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)/ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)& - +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV) - END IF - !Calculation of Phidp (ZREFL(JI,JEL,JAZ,JL,JH,JV,IPDP) is initialized to 0 before the loop - IF (JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IPDP)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IPDP)+ & - 2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,3)*XSTEP_RAD*1D-3 - - !Calculation of RhoHV and DeltaHV - ZRE_S22S11_T=ZRE_S22S11_R+ZRE_S22S11_I+ZRE_S22S11_S+ZRE_S22S11_G+ZRE_S22S11_H - ZIM_S22S11_T=ZIM_S22S11_R+ZIM_S22S11_I+ZIM_S22S11_S+ZIM_S22S11_G+ZIM_S22S11_H - ZS22_CARRE_T=ZS22_CARRE_R+ZS22_CARRE_I+ZS22_CARRE_S+ZS22_CARRE_G+ZS22_CARRE_H - ZS11_CARRE_T=ZS11_CARRE_R+ZS11_CARRE_I+ZS11_CARRE_S+ZS11_CARRE_G+ZS11_CARRE_H - !RhoHV - IF ((ZS22_CARRE_T*ZS11_CARRE_T)>0.) THEN - ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHV)=SQRT(ZRE_S22S11_T**2+ZIM_S22S11_T**2)/SQRT(ZS22_CARRE_T*ZS11_CARRE_T) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHV)=-XUNDEF - END IF - !DeltaHV - IF (ZRE_S22S11_T/=0) THEN - ZREFL(JI,JEL,JAZ,JL,JH,JV,IDHV)=180/XPI*ATAN(ZIM_S22S11_T/ZRE_S22S11_T) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IDHV)=0 - END IF - ELSE !if temperature is not defined - ZREFL(JI,JEL,JAZ,JL,JH,JV,1:2)=XVALGROUND - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=XVALGROUND - LPART_MASK=.TRUE. - END IF !end condition : IF(PT_RAY(JI,JEL,JAZ,JL,JH,JV) /= -XUNDEF) => if temperature is defined - END IF !end condition : IF(LPART_MASK) => if pixel is not masked - END DO LOOPJL - END DO !JV - END DO !JH - END DO !JAZ - END DO !JEL - ! - IF (NDIFF == 7 ) THEN - !lookup tables for rain - DEALLOCATE (ZTC_T_R,ZELEV_T_R,ZM_T_R,ZS11_CARRE_T_R,ZS22_CARRE_T_R,& - ZRE_S22S11_T_R,ZIM_S22S11_T_R,ZRE_S22FMS11FT_T_R,ZIM_S22FT_T_R,ZIM_S11FT_T_R) - !lookup tables for snow - DEALLOCATE (ZTC_T_S,ZELEV_T_S,ZM_T_S,ZS11_CARRE_T_S,ZS22_CARRE_T_S,& - ZRE_S22S11_T_S,ZIM_S22S11_T_S,ZRE_S22FMS11FT_T_S,ZIM_S22FT_T_S,ZIM_S11FT_T_S) - !lookup tables for graupel - DEALLOCATE (ZTC_T_G,ZELEV_T_G,ZM_T_G,ZS11_CARRE_T_G,ZS22_CARRE_T_G,& - ZRE_S22S11_T_G,ZIM_S22S11_T_G,ZRE_S22FMS11FT_T_G,ZIM_S22FT_T_G,ZIM_S11FT_T_G) - !lookup tables for wet graupel - DEALLOCATE (ZTC_T_W,ZELEV_T_W,ZM_T_W,ZS11_CARRE_T_W,ZS22_CARRE_T_W,& - ZRE_S22S11_T_W,ZIM_S22S11_T_W,ZRE_S22FMS11FT_T_W,ZIM_S22FT_T_W,ZIM_S11FT_T_W) - IF (GHAIL) THEN - !lookup tables for hail - DEALLOCATE (ZTC_T_H,ZELEV_T_H,ZM_T_H,ZS11_CARRE_T_H,ZS22_CARRE_T_H,& - ZRE_S22S11_T_H,ZIM_S22S11_T_H,ZRE_S22FMS11FT_T_H,ZIM_S22FT_T_H,ZIM_S11FT_T_H) - ENDIF - ENDIF -END DO !JI -! -! attenuation in dB/km -IF(LATT) ZREFL(:,:,:,:,:,:,IAER:IAEH)=4343.*2.*ZREFL(:,:,:,:,:,:,IAER:IAEH) ! horizontal specific attenuation -IF(LATT) ZREFL(:,:,:,:,:,:,IAVR:IAVH)=4343.*2.*ZREFL(:,:,:,:,:,:,IAVR:IAVH) ! vertical specific attenuation -! convective/stratiform -ZREFL(:,:,:,:,:,:,4)=PBU_MASK_RAY(:,:,:,:,:,:) ! CSR -! /convective/stratiform - -WRITE(ILUOUT0,*) 'NB ZREFL MIN MAX :', MINVAL(ZREFL(:,:,:,:,:,:,:)),MAXVAL(ZREFL(:,:,:,:,:,:,:)) -WRITE(ILUOUT0,*) 'NB ZREFL VALGROUND :', COUNT(ZREFL(:,:,:,:,:,:,:) ==XVALGROUND) -WRITE(ILUOUT0,*) 'NB ZREFL -XUNDEF :', COUNT(ZREFL(:,:,:,:,:,:,:) ==-XUNDEF) -WRITE(ILUOUT0,*) 'NB ZREFL > 0 :', COUNT(ZREFL(:,:,:,:,:,:,:)>0.) -WRITE(ILUOUT0,*) 'NB ZREFL = 0 :', COUNT(ZREFL(:,:,:,:,:,:,:)==0.) -WRITE(ILUOUT0,*) 'NB ZREFL < 0 :', COUNT(ZREFL(:,:,:,:,:,:,:) < 0.)-COUNT( ZREFL(:,:,:,:,:,:,:)==XVALGROUND) -!--------------------------------------------------------------------------------------------------- -!* 6. FINAL STEP : TOTAL ATTENUATION AND EQUIVALENT REFLECTIVITY FACTOR -! --------------------------------------------------------------- -! -ALLOCATE(ZVTEMP(IMAX)) -DO JI=1,INBRAD - IEL=NBELEV(JI) - DO JEL=1,IEL - DO JAZ=1,INBAZIM - IF (LATT) ZAETOT(:,:,1:2)=1. - PZE(JI,JEL,JAZ,1,IPDP)=0 - DO JL=1,INBSTEPMAX - ! if no undef point in gate JL and at least one point where T is defined - IF(COUNT(ZREFL(JI,JEL,JAZ,JL,:,:,1)==-XUNDEF)==0.AND. & - COUNT(ZREFL(JI,JEL,JAZ,JL,:,:,1)==XVALGROUND)==0.AND. & - COUNT(PT_RAY(JI,JEL,JAZ,JL,:,:)/=-XUNDEF)/=0) THEN - DO JH=1,INPTS_H - ZVTEMP(:)=0. - DO JV=1,INPTS_V ! Loop on Jv - !if range is over 1, attenuation is added - IF (JL > 1) THEN - IF(LATT) THEN ! we use ZALPHAE0=alpha_0 from last gate - !Total attenuation - ZAETOT(JH,JV,1:2)=ZAETOT(JH,JV,1:2)*EXP(-2.*ZAELOC(JI,JEL,JAZ,JL-1,JH,JV,:)*XSTEP_RAD) - !Zhh, Zvv - ZREFL(JI,JEL,JAZ,JL,JH,JV,1:2)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:2)*ZAETOT(JH,JV,1:2)!attenuated reflectivity - !Z for Radial velocity - IF(LWREFL) ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)*ZAETOT(JH,JV,1) - END IF !end IF(LATT) - END IF !end IF (JL > 1) - IF(.NOT.(LWREFL.AND.LWBSCS)) THEN - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV) - END IF - ! Quadrature on vertical reflectivities +VDOP - IF(LQUAD) THEN - ZVTEMP(:)=ZVTEMP(:)+ZREFL(JI,JEL,JAZ,JL,JH,JV,:)*PW_V(ABS((2*JV-INPTS_V-1)/2)+1) & - *EXP(-2.*LOG(2.)*PX_V(ABS((2*JV-INPTS_V-1)/2)+1)**2) - ELSE - ZVTEMP(:)=ZVTEMP(:)+ZREFL(JI,JEL,JAZ,JL,JH,JV,:)*PW_V(ABS((2*JV-INPTS_V-1)/2)+1) - END IF - END DO ! End loop on JV -! - IF(LQUAD) THEN - PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)+ZVTEMP(1:SIZE(PZE,5))*PW_H(ABS((2*JH-INPTS_H-1)/2)+1) & - *EXP(-2.*LOG(2.)*PX_H(ABS((2*JH-INPTS_H-1)/2)+1)**2) - IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)+ZVTEMP(IMAX)* & - PW_H(ABS((2*JH-INPTS_H-1)/2)+1)*EXP(-2.*LOG(2.)*PX_H(ABS((2*JH-INPTS_H-1)/2)+1)**2) - ELSE - PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)+ZVTEMP(1:SIZE(PZE,5))*PW_H(ABS((2*JH-INPTS_H-1)/2)+1) - IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)+ZVTEMP(IMAX)* & - PW_H(ABS((2*JH-INPTS_H-1)/2)+1) - END IF !end IF(LQUAD) - END DO ! End loop on JH - - IF(LQUAD) THEN - PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)*2.*LOG(2.)/XPI - IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)*2.*LOG(2.)/XPI - ELSE - PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)/XPI - IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)/XPI - END IF !end IF(LQUAD) -! - !**** Thresholding: with ZSNR, or with XREFLVDOPMIN and XREFLMIN - ZSNR=-XUNDEF - ZSNR_R=-XUNDEF - ZSNR_I=-XUNDEF - ZSNR_S=-XUNDEF - ZSNR_G=-XUNDEF - ZSNR_H=-XUNDEF - ZZHH=PZE(JI,JEL,JAZ,JL,1) - ZZE_R=PZE(JI,JEL,JAZ,JL,IZER) - ZZE_I=PZE(JI,JEL,JAZ,JL,IZEI) - ZZE_S=PZE(JI,JEL,JAZ,JL,IZES) - ZZE_G=PZE(JI,JEL,JAZ,JL,IZEG) - IF (GHAIL) ZZE_H=PZE(JI,JEL,JAZ,JL,IZEH) - ZDISTRAD=JL*XSTEP_RAD !radar distance in meters - IF (LSNRT) THEN - IF (ZZHH/=XVALGROUND .AND. ZZHH/=-XUNDEF.AND.ZZHH/=0) THEN - ZSNR=10*LOG10(ZZHH)-20*LOG10(ZDISTRAD/(100*10**3)) - END IF - IF (ZZE_R/=XVALGROUND .AND. ZZE_R/=-XUNDEF.AND.ZZE_R/=0) THEN - ZSNR_R=10*LOG10(ZZE_R)-20*LOG10(ZDISTRAD/(100*10**3)) - END IF - IF (ZZE_I/=XVALGROUND .AND. ZZE_I/=-XUNDEF.AND.ZZE_I/=0) THEN - ZSNR_I=10*LOG10(ZZE_I)-20*LOG10(ZDISTRAD/(100*10**3)) - END IF - IF (ZZE_S/=XVALGROUND .AND. ZZE_S/=-XUNDEF.AND.ZZE_S/=0) THEN - ZSNR_S=10*LOG10(ZZE_S)-20*LOG10(ZDISTRAD/(100*10**3)) - END IF - IF (ZZE_G/=XVALGROUND .AND. ZZE_G/=-XUNDEF.AND.ZZE_G/=0) THEN - ZSNR_G=10*LOG10(ZZE_G)-20*LOG10(ZDISTRAD/(100*10**3)) - END IF - IF (GHAIL) THEN - IF (ZZE_H/=XVALGROUND .AND. ZZE_H/=-XUNDEF.AND.ZZE_H/=0) THEN - ZSNR_H=10*LOG10(ZZE_H)-20*LOG10(ZDISTRAD/(100*10**3)) - END IF - END IF - GTHRESHOLD_V=(ZSNR>=XSNRMIN) - GTHRESHOLD_Z=GTHRESHOLD_V - GTHRESHOLD_ZR=(ZSNR_R>=XSNRMIN) - GTHRESHOLD_ZI=(ZSNR_I>=XSNRMIN) - GTHRESHOLD_ZS=(ZSNR_S>=XSNRMIN) - GTHRESHOLD_ZG=(ZSNR_G>=XSNRMIN) - IF (GHAIL) GTHRESHOLD_ZH=(ZSNR_H>=XSNRMIN) - ELSE - GTHRESHOLD_V=(ZZHH>=10**(XREFLVDOPMIN/10.)) - GTHRESHOLD_Z=(ZZHH>=10**(XREFLMIN/10.)) - GTHRESHOLD_ZR=(ZZE_R>=10**(XREFLMIN/10.)) - GTHRESHOLD_ZI=(ZZE_I>=10**(XREFLMIN/10.)) - GTHRESHOLD_ZS=(ZZE_S>=10**(XREFLMIN/10.)) - GTHRESHOLD_ZG=(ZZE_G>=10**(XREFLMIN/10.)) - IF (GHAIL) GTHRESHOLD_ZH=(ZZE_H>=10**(XREFLMIN/10.)) - END IF - !--- Doppler velocities - IF(GTHRESHOLD_V) THEN - IF(LWREFL) THEN - !change Clotilde 27/04/2012 to avoid division by zero and floating point exception - IF (PZE(JI,JEL,JAZ,JL,1)/=0) THEN - PZE(JI,JEL,JAZ,JL,IVDOP)=PZE(JI,JEL,JAZ,JL,IVDOP)/PZE(JI,JEL,JAZ,JL,1) - END IF - ELSE IF(LWBSCS) THEN - IF(ZCONC_BIN(JI,JEL,JAZ,JL)>0.) THEN - PZE(JI,JEL,JAZ,JL,IVDOP)=PZE(JI,JEL,JAZ,JL,IVDOP)/ZCONC_BIN(JI,JEL,JAZ,JL) - ELSE - PZE(JI,JEL,JAZ,JL,IVDOP)=-XUNDEF - END IF !end IF(ZCONC_BIN(JI,JEL,JAZ,JL)>0.) - END IF !end IF(LWREFL) - ELSE - PZE(JI,JEL,JAZ,JL,IVDOP)=-XUNDEF - END IF !end IF(GTHRESHOLD_V) - - !--- Zhh, Zvv et variables globales - IF(GTHRESHOLD_Z .EQV. .FALSE.) THEN - PZE(JI,JEL,JAZ,JL,1:4)=-XUNDEF - PZE(JI,JEL,JAZ,JL,IRHV:IDHV)=-XUNDEF - END IF - !--- ZER, ZDA, KDR, RHR - IF(GTHRESHOLD_ZR .EQV. .FALSE.) THEN - PZE(JI,JEL,JAZ,JL,IZER)=-XUNDEF - PZE(JI,JEL,JAZ,JL,IZDA)=-XUNDEF - PZE(JI,JEL,JAZ,JL,IKDR)=-XUNDEF - PZE(JI,JEL,JAZ,JL,IRHR)=-XUNDEF - END IF - !--- ZES, ZDS, KDS, RHS - IF(GTHRESHOLD_ZS .EQV. .FALSE.) THEN - PZE(JI,JEL,JAZ,JL,IZES)=-XUNDEF - PZE(JI,JEL,JAZ,JL,IZDS)=-XUNDEF - PZE(JI,JEL,JAZ,JL,IKDS)=-XUNDEF - PZE(JI,JEL,JAZ,JL,IRHS)=-XUNDEF - END IF - - !--- ZEG, ZDG, KDG, RHG - IF(GTHRESHOLD_ZG .EQV. .FALSE.) THEN - PZE(JI,JEL,JAZ,JL,IZEG)=-XUNDEF - PZE(JI,JEL,JAZ,JL,IZDG)=-XUNDEF - PZE(JI,JEL,JAZ,JL,IKDG)=-XUNDEF - PZE(JI,JEL,JAZ,JL,IRHG)=-XUNDEF - END IF - !--- ZEH, ZDH, KDH, RHH - IF (GHAIL) THEN - IF(GTHRESHOLD_ZH .EQV. .FALSE.) THEN - PZE(JI,JEL,JAZ,JL,IZEH)=-XUNDEF - PZE(JI,JEL,JAZ,JL,IZDH)=-XUNDEF - PZE(JI,JEL,JAZ,JL,IKDH)=-XUNDEF - PZE(JI,JEL,JAZ,JL,IRHH)=-XUNDEF - END IF - END IF - !--- ZEI - IF(GTHRESHOLD_ZI .EQV. .FALSE.) THEN - PZE(JI,JEL,JAZ,JL,IZEI)=-XUNDEF - END IF - ELSE - ! ground clutter or outside Meso-NH domain - !(IF T not defined or if one undef point at least in gate) - PZE(JI,JEL,JAZ,JL,:)=XVALGROUND - END IF - IF(PZE(JI,JEL,JAZ,JL,1) < 0. .AND. PZE(JI,JEL,JAZ,JL,1)/=-XUNDEF) THEN ! flag bin when underground => xvalground si < 0? - PZE(JI,JEL,JAZ,JL,:)=XVALGROUND - END IF ! end IF(PZE(JI,JEL,JAZ,JL,1) < 0.) - END DO ! end DO JL=1,INBSTEPMAX - END DO !end DO JAZ=1,INBAZIM - END DO !end DO JEL=1,IEL -END DO !end DO JI=1,INBRAD -DEALLOCATE(ZREFL,ZVTEMP,ZRTMIN) -WRITE(ILUOUT0,*) '*****************FIN RADAR_SCATTERING ***********************' -WRITE(ILUOUT0,*) 'NB PZE MIN MAX :', MINVAL(PZE(:,:,:,:,IZEI)),MAXVAL(PZE(:,:,:,:,IZEI)) -WRITE(ILUOUT0,*) 'NB PZE VALGROUND :', COUNT(PZE(:,:,:,:,IZEI) ==XVALGROUND) -WRITE(ILUOUT0,*) 'NB PZE -XUNDEF :', COUNT(PZE(:,:,:,:,IZEI) ==-XUNDEF) -WRITE(ILUOUT0,*) 'NB PZE > 0 :', COUNT(PZE(:,:,:,:,IZEI)>0.) -WRITE(ILUOUT0,*) 'NB PZE = 0 :', COUNT(PZE(:,:,:,:,IZEI)==0.) -WRITE(ILUOUT0,*) 'NB PZE < 0 :', COUNT(PZE(:,:,:,:,IZEI) < 0.)-COUNT(PZE(:,:,:,:,IZEI) ==XVALGROUND) -IF(NDIFF/=0) DEALLOCATE(ZX,ZW) -IF (LATT) DEALLOCATE(ZAELOC,ZAETOT) -WRITE(ILUOUT0,*) 'END OF RADAR SCATTERING' -END SUBROUTINE RADAR_SCATTERING - diff --git a/src/PHYEX/ext/radiations.f90 b/src/PHYEX/ext/radiations.f90 deleted file mode 100644 index f4db08bfc..000000000 --- a/src/PHYEX/ext/radiations.f90 +++ /dev/null @@ -1,3504 +0,0 @@ -!MNH_LIC Copyright 1995-2022 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ######################## - MODULE MODI_RADIATIONS -! ######################## -! -CONTAINS -! -! ############################################################################ - SUBROUTINE RADIATIONS (TPFILE,OCLEAR_SKY,OCLOUD_ONLY, & - KCLEARCOL_TM1,HEFRADL,HEFRADI,HOPWSW,HOPISW,HOPWLW,HOPILW, & - PFUDG, KDLON, KFLEV, KRAD_DIAG, KFLUX, KRAD, KAER, KSWB_OLD, & - KSWB_MNH,KLWB_MNH, KSTATM,KRAD_COLNBR,PCOSZEN,PSEA, PCORSOL, & - PDIR_ALB, PSCA_ALB,PEMIS, PCLDFR, PCCO2, PTSRAD, PSTATM, & - PTHT, PRT, PPABST, POZON, PAER, PDST_WL, PAER_CLIM, PSVT, & - PDTHRAD, PSRFLWD, PSRFSWD_DIR,PSRFSWD_DIF, PRHODREF, PZZ, & - PRADEFF, PSWU, PSWD, PLWU,PLWD, PDTHRADSW, PDTHRADLW ) -! ############################################################################ -! -!!**** *RADIATIONS * - routine to call the SW and LW radiation calculations -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to prepare the temperature, water vapor -!! liquid water, cloud fraction, ozone profiles for the ECMWF radiation -!! calculations. There is a great number of available radiative fluxes in -!! the output, but only the potential temperature radiative tendency and the -!! SW and LW surface fluxes are provided in the output of the routine. -!! Two simplified computations are available (switches OCLEAR_SKY and -!! OCLOUD_ONLY). When OCLOUD_ONLY is .TRUE. the computations are performed -!! for the cloudy columns only. Furthermore with OCLEAR_SKY being .TRUE. -!! the clear sky columns are averaged and the computations are made for -!! the cloudy columns plus a single ensemble-mean clear sky column. -!! -!!** METHOD -!! ------ -!! First the temperature, water vapor, liquid water, cloud fraction -!! and profile arrays are built using the current model fields and -!! the standard atmosphere for the upper layer filling. -!! The standard atmosphere is used between the levels IKUP and -!! KFLEV where KFLEV is the number of vertical levels for the radiation -!! computations. -!! The aerosols optical thickness and the ozone fields come directly -!! from ini_radiation step (climatlogies used) and are already defined for KFLEV. -!! Surface parameter ( albedo, emiss ) are also defined from current surface fields. -!! In the case of clear-sky or cloud-only approximations, the cloudy -!! columns are selected by testing the vertically integrated cloud fraction -!! and the radiation computations are performed for these columns plus the -!! mean clear-sky one. In addition, columns where cloud have disapeared are determined -!! by saving cloud trace between radiation step and they are also recalculated -!! in cloud only step. In all case, the sun position correponds to the centered -!! time between 2 full radiation steps (determined in physparam). -!! Then the ECMWF radiation package is called and the radiative -!! heating/cooling tendancies are reformatted in case of partial -!! computations. In case of "cloud-only approximation" the only cloudy -!! column radiative fields are updated. -!! -!! EXTERNAL -!! -------- -!! Subroutine ECMWF_RADIATION_VERS2 : ECMWF interface calling radiation routines -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : constants -!! XP00 : reference pressure -!! XCPD : calorific capacity of dry air at constant pressure -!! XRD : gas constant for dry air -!! Module MODD_PARAMETERS : parameters -!! JPHEXT : Extra columns on the horizontal boundaries -!! JPVEXT : Extra levels on the vertical boundaries -!! -!! REFERENCE -!! --------- -!! Book2 of documentation ( routine RADIATIONS ) -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 26/02/95 -!! J.Stein 20/12/95 add the array splitting in order to save memory -!! J.-P. Pinty 19/11/96 change the split arrays, specific humidity -!! and add the ice phase -!! J.Stein 22/06/97 use of the absolute pressure -!! P.Jabouille 31/07/97 impose a zero humidity for dry simulation -!! V.Masson 22/09/97 case of clear-sky approx. with no clear-sky column -!! V.Masson 07/11/97 half level pressure defined from averaged Exner -!! function -!! V.Masson 07/11/97 modification of junction between standard atm -!! and model for half level variables (top model -!! pressure and temperatures are used preferentially -!! to atm standard profile for the first point). -!! P.Jabouille 24/08/98 impose positivity for ZQLAVE -!! J.-P. Pinty 29/01/98 add storage for diagnostics -!! J. Stein 18/07/99 add the ORAD_DIAG switch and keep inside the -!! subroutine the partial tendencies -!! -!! F.Solmon 04/03/01 MAJOR MODIFICATIONS, updated version of ECMWF radiation scheme -!! P.Jabouille 05/05/03 bug in humidity conversion -!! Y.Seity 25/08/03 KSWB=6 for SW direct and scattered surface -!! downward fluxes used in surface scheme. -!! P. Tulet 01/20/05 climatologic SSA -!! A. Grini 05/20/05 dust direct effect (optical properties) -!! V.Masson, C.Lac 08/10 Correction of inversion of Diffuse and direct albedo -!! B.Aouizerats 2010 Explicit aerosol optical properties -!! C.Lac 11/2015 Correction on aerosols -!! B.Vie /13 LIMA -!! J.Escobar 30/03/2017 : Management of compilation of ECMWF_RAD in REAL*8 with MNH_REAL=R4 -!! J.Escobar 29/06/2017 : Check if Pressure Decreasing with height <-> elsif PB & STOP -!! Q.LIBOIS 06/2017 : correction on CLOUD_ONLY -!! Q.Libois 02/2018 : ECRAD -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! J.Escobar 28/06/2018 : Reproductible parallelisation of CLOUD_ONLY case -!! J.Escobar 20/07/2018 : for real*4 compilation, convert with REAL(X) argument to SUM_DD... -!! P.Wautelet 22/01/2019: use standard FLUSH statement instead of non standard intrinsics -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 06/09/2022: small fix: GSURF_CLOUD was not set outside of physical domain -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE PARKIND1, ONLY: JPRB -USE OYOESW , ONLY : RTAUA ,RPIZA ,RCGA -! -USE MODD_CH_AEROSOL, ONLY: LORILAM -USE MODD_CONF, ONLY: LCARTESIAN -USE MODD_CST -USE MODD_DUST, ONLY: LDUST -use modd_field, only: tfieldmetadata, TYPEREAL -USE MODD_GRID , ONLY: XLAT0, XLON0 -USE MODD_GRID_n , ONLY: XLAT, XLON -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_NSV, ONLY: NSV_C2R2,NSV_C2R2BEG,NSV_C2R2END, & - NSV_C1R3,NSV_C1R3BEG,NSV_C1R3END, & - NSV_DSTBEG, NSV_DSTEND, & - NSV_AERBEG, NSV_AEREND, & - NSV_SLTBEG, NSV_SLTEND, & - NSV_LIMA,NSV_LIMA_BEG,NSV_LIMA_END, & - NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI -USE MODD_PARAMETERS -USE MODD_PARAM_LIMA -USE MODD_PARAM_n, ONLY: CCLOUD, CRAD -USE MODD_PARAM_RAD_n, ONLY: CAOP -USE MODD_RAIN_ICE_DESCR_n -USE MODD_SALT, ONLY: LSALT -USE MODD_TIME -! -USE MODE_DUSTOPT -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -USE MODE_ll -use mode_msg -USE MODE_REPRO_SUM, ONLY : SUM_DD_R2_R1_ll,SUM_DD_R1_ll -! -#ifdef MNH_PGI -USE MODE_PACK_PGI -#endif -USE MODE_SALTOPT -USE MODE_SUM_ll, ONLY: MIN_ll -USE MODE_SUM2_ll, ONLY: GMINLOC_ll -USE MODE_THERMO -! -USE MODI_AEROOPT_GET -USE MODI_ECMWF_RADIATION_VERS2 -USE MODI_ECRAD_INTERFACE -USE MODD_VAR_ll, ONLY: IP -! -IMPLICIT NONE -! -!* 0.1 DECLARATIONS OF DUMMY ARGUMENTS : -! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -LOGICAL, INTENT(IN) :: OCLOUD_ONLY! flag for the cloud column - ! computations only -LOGICAL, INTENT(IN) :: OCLEAR_SKY ! -INTEGER, INTENT(IN) :: KDLON ! number of columns where the - ! radiation calculations are - ! performed -INTEGER, INTENT(IN) :: KFLEV ! number of vertical levels - ! where the radiation - ! calculations are performed -INTEGER, INTENT(IN) :: KRAD_DIAG ! index for the number of - ! fields in the output -INTEGER, INTENT(IN) :: KFLUX ! number of top and ground - ! fluxes for the ZFLUX array -INTEGER, INTENT(IN) :: KRAD ! number of satellite radiances - ! for the ZRAD and ZRADCS arrays -INTEGER, INTENT(IN) :: KAER ! number of AERosol classes - -INTEGER, INTENT(IN) :: KSWB_OLD ! number of SW band ECMWF -INTEGER, INTENT(IN) :: KSWB_MNH ! number of SW band ECRAD -INTEGER, INTENT(IN) :: KLWB_MNH ! number of LW band ECRAD -INTEGER, INTENT(IN) :: KSTATM ! index of the standard - ! atmosphere level just above - ! the model top -INTEGER, INTENT(IN) :: KRAD_COLNBR ! factor by which the memory - ! is split - ! - !Choice of : -CHARACTER (LEN=*), INTENT (IN) :: HEFRADL ! -CHARACTER (LEN=*), INTENT (IN) :: HEFRADI ! -CHARACTER (LEN=*), INTENT (IN) :: HOPWSW !cloud water SW optical properties -CHARACTER (LEN=*), INTENT (IN) :: HOPISW !ice water SW optical properties -CHARACTER (LEN=*), INTENT (IN) :: HOPWLW !cloud water LW optical properties -CHARACTER (LEN=*), INTENT (IN) :: HOPILW !ice water LW optical properties -REAL, INTENT(IN) :: PFUDG ! subgrid cloud inhomogenity factor -REAL, DIMENSION(:,:), INTENT(IN) :: PCOSZEN ! COS(zenithal solar angle) -REAL, INTENT(IN) :: PCORSOL ! SOLar constant CORrection -REAL, DIMENSION(:,:), INTENT(IN) :: PSEA ! Land-sea mask -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDIR_ALB! Surface direct ALBedo -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSCA_ALB! Surface diffuse ALBedo -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMIS ! Surface IR EMISsivity -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! CLouD FRaction -REAL, INTENT(IN) :: PCCO2 ! CO2 content -REAL, DIMENSION(:,:), INTENT(IN) :: PTSRAD ! RADiative Surface Temperature -REAL, DIMENSION(:,:), INTENT(IN) :: PSTATM ! selected standard atmosphere -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! THeta at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! moist variables at t (humidity, cloud water, rain water, ice water) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! pressure at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! scalar variable ( C2R2 and C1R3 particle) -! -REAL, DIMENSION(:,:,:), POINTER :: POZON ! OZONE field from clim. -REAL, DIMENSION(:,:,:,:), POINTER :: PAER ! AERosols optical thickness from clim. -REAL, DIMENSION(:,:,:,:), POINTER :: PDST_WL ! AERosols Extinction by wavelength . -REAL, DIMENSION(:,:,:,:), POINTER :: PAER_CLIM ! AERosols optical thickness from clim. - ! note : the vertical dimension of - ! these fields include the "radiation levels" - ! above domain top - ! - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ![kg/m3] air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ![m] height of layers - -INTEGER, DIMENSION(:,:), INTENT(INOUT) :: KCLEARCOL_TM1 ! trace of cloud/clear col - ! at the previous radiation step -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDTHRAD ! THeta RADiative Tendancy -REAL, DIMENSION(:,:), INTENT(INOUT) :: PSRFLWD ! Downward SuRFace LW Flux -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRFSWD_DIR ! Downward SuRFace SW Flux DIRect -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRFSWD_DIF ! Downward SuRFace SW Flux DIFfuse -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSWU ! upward SW Flux -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSWD ! downward SW Flux -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLWU ! upward LW Flux -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLWD ! downward LW Flux -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDTHRADSW ! dthrad sw -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDTHRADLW ! dthradsw -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRADEFF ! effective radius -! -! -!* 0.2 DECLARATIONS OF LOCAL VARIABLES -! -LOGICAL :: GNOCL ! .TRUE. when no cloud is present - ! with OCLEAR_SKY .TRUE. -LOGICAL :: GAOP ! .TRUE. when CAOP='EXPL' -LOGICAL, DIMENSION(KDLON,KFLEV) :: GCLOUD ! .TRUE. for the cloudy columns -LOGICAL, DIMENSION(KFLEV,KDLON) :: GCLOUDT ! transpose of the GCLOUD array -LOGICAL, DIMENSION(KDLON) :: GCLEAR_2D ! .TRUE. for the clear-sky columns -LOGICAL, DIMENSION(KDLON,KFLEV) :: GCLEAR ! .TRUE. for all the levels of the - ! clear-sky columns -LOGICAL, DIMENSION(KDLON,KSWB_MNH) :: GCLEAR_SWB! .TRUE. for all the bands of the - ! clear-sky columns -INTEGER, DIMENSION(:), ALLOCATABLE :: ICLEAR_2D_TM1 ! -! -INTEGER :: JI,JJ,JK,JK1,JK2,JKRAD,JALBS! loop indices -! -INTEGER :: IIB ! I index value of the first inner mass point -INTEGER :: IJB ! J index value of the first inner mass point -INTEGER :: IKB ! K index value of the first inner mass point -INTEGER :: IIE ! I index value of the last inner mass point -INTEGER :: IJE ! J index value of the last inner mass point -INTEGER :: IKE ! K index value of the last inner mass point -INTEGER :: IKU ! array size for the third index -INTEGER :: IIJ ! reformatted array index -INTEGER :: IKSTAE ! level number of the STAndard atmosphere array -INTEGER :: IKUP ! vertical level above which STAndard atmosphere data - ! are filled in -! -INTEGER :: ICLEAR_COL ! number of clear-sky columns -INTEGER :: ICLOUD_COL ! number of cloudy columns -INTEGER :: ICLOUD ! number of levels corresponding of the cloudy columns -INTEGER :: IDIM ! effective number of columns for which the radiation - ! code is run -INTEGER :: INIR ! index corresponding to NIR fisrt band (in SW) -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZTAVE ! mean-layer temperature -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZTAVE_RAD ! mean-layer temperature -REAL, DIMENSION(:,:), ALLOCATABLE :: ZPAVE ! mean-layer pressure -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZPAVE_RAD ! mean-layer pressure -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQSAVE ! saturation specific humidity -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQVAVE ! mean-layer specific humidity -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQLAVE ! Liquid water KG/KG -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQRAVE ! Rain water KG/KG -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQIAVE ! Ice water Kg/KG -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQLWC ! liquid water content kg/m3 -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQRWC ! Rain water content kg/m3 -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQIWC ! ice water content kg/m3 -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCFAVE ! mean-layer cloud fraction -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZO3AVE ! mean-layer ozone content -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZPRES_HL ! half-level pressure -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZT_HL ! half-level temperature -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZDPRES ! layer pressure thickness -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCCT_C2R2! Cloud water Concentarion (C2R2) -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCRT_C2R2! Rain water Concentarion (C2R2) -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCIT_C1R3! Ice water Concentarion (C2R2) -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCCT_LIMA! Cloud water Concentration(LIMA) -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCRT_LIMA! Rain water Concentration(LIMA) -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCIT_LIMA! Ice water Concentration(LIMA) -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZAER ! aerosol optical thickness -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZALBP ! spectral surface albedo for direct radiations -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZALBD ! spectral surface albedo for diffuse radiations -REAL(KIND=JPRB), DIMENSION (:,:), ALLOCATABLE :: ZEMIS ! surface LW emissivity -REAL(KIND=JPRB), DIMENSION (:,:), ALLOCATABLE :: ZEMIW ! surface LW WINDOW emissivity -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZTS ! reformatted surface PTSRAD array -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZLSM ! reformatted land sea mask -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZRMU0 ! Reformatted ZMU0 array -REAL(KIND=JPRB) :: ZRII0 ! corrected solar constant -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTLW ! LW temperature tendency -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTSW ! SW temperature tendency -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFLW_CS ! CLEAR-SKY LW NET FLUXES -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFLW ! TOTAL LW NET FLUXES -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFSW_CS ! CLEAR-SKY SW NET FLUXES -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFSW ! TOTAL SW NET FLUXES -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_TOP_GND_IRVISNIR ! Top and - ! Ground radiative FLUXes -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_SW_DOWN ! DowNward SW Flux profiles -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_SW_UP ! UPward SW Flux profiles -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFLUX_LW ! LW Flux profiles -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTLW_CS ! LW Clear-Sky temp. tendency -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTSW_CS ! SW Clear-Sky temp. tendency -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_TOP_GND_IRVISNIR_CS ! Top and - ! Ground Clear-Sky radiative FLUXes -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFSWDIR !surface SW direct flux -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFSWDIF !surface SW diffuse flux - -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_ALB_VIS, ZPLAN_ALB_NIR - ! PLANetary ALBedo in VISible, Near-InfraRed regions -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_TRA_VIS, ZPLAN_TRA_NIR - ! PLANetary TRANsmission in VISible, Near-InfraRed regions -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_ABS_VIS, ZPLAN_ABS_NIR - ! PLANetary ABSorption in VISible, Near-InfraRed regions -REAL, DIMENSION(:,:), ALLOCATABLE :: ZEFCL_LWD, ZEFCL_LWU - ! EFective DOWNward and UPward LW nebulosity (equivalent emissivities) - ! undefined if RRTM is used for LW -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLWP, ZFIWP - ! Liquid and Ice Water Path -REAL, DIMENSION(:,:), ALLOCATABLE :: ZRADLP, ZRADIP - ! Cloud liquid water and ice effective radius -REAL, DIMENSION(:,:), ALLOCATABLE :: ZEFCL_RRTM, ZCLSW_TOTAL - ! effective LW nebulosity ( RRTM case) - ! and SW CLoud fraction for mixed phase clouds -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTAU_TOTAL, ZOMEGA_TOTAL, ZCG_TOTAL - ! effective optical thickness, single scattering albedo - ! and asymetry factor for mixed phase clouds -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS - ! Clear-Sky DowNward and UPward SW Flux profiles -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFLUX_LW_CS - ! Thicknes of the mesh -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZDZ -! -REAL, DIMENSION(KDLON,KFLEV) :: ZZDTSW ! SW diabatic heating -REAL, DIMENSION(KDLON,KFLEV) :: ZZDTLW ! LW diabatic heating -REAL, DIMENSION(KDLON) :: ZZTGVIS! SW surface flux in the VIS band -REAL, DIMENSION(KDLON) :: ZZTGNIR! SW surface flux in the NIR band -REAL, DIMENSION(KDLON) :: ZZTGIR ! LW surface flux in the IR bands -REAL, DIMENSION(KDLON,SIZE(PSRFSWD_DIR,3)) :: ZZSFSWDIR -! ! SW direct surface flux -REAL, DIMENSION(KDLON,SIZE(PSRFSWD_DIR,3)) :: ZZSFSWDIF -! ! SW diffuse surface flux -! -REAL, DIMENSION(KDLON) :: ZCLOUD ! vertically summed cloud fraction -! -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZEXNT ! Exner function -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: ZLWD ! surface Downward LW flux -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PSRFSWD_DIR,3)) :: ZSWDDIR ! surface -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PSRFSWD_DIR,3)) :: ZSWDDIF ! surface Downward SW diffuse flux -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3),KSWB_OLD) :: ZPIZAZ ! Aerosols SSA -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3),KSWB_OLD) :: ZTAUAZ ! Aerosols Optical Detph -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3),KSWB_OLD) :: ZCGAZ ! Aerosols Asymetric factor -REAL :: ZZTGVISC ! downward surface SW flux (VIS band) for clear_sky -REAL :: ZZTGNIRC ! downward surface SW flux (NIR band) for clear_sky -REAL :: ZZTGIRC ! downward surface LW flux for clear_sky -REAL, DIMENSION(SIZE(PSRFSWD_DIR,3)) :: ZZSFSWDIRC -! ! downward surface SW direct flux for clear sky -REAL, DIMENSION(SIZE(PSRFSWD_DIR,3)) :: ZZSFSWDIFC -! ! downward surface SW diffuse flux for clear sky -REAL, DIMENSION(KFLEV) :: ZT_CLEAR ! ensemble mean clear-sky temperature -REAL, DIMENSION(KFLEV) :: ZP_CLEAR ! ensemble mean clear-sky temperature -REAL, DIMENSION(KFLEV) :: ZQV_CLEAR ! ensemble mean clear-sky specific humidity -REAL, DIMENSION(KFLEV) :: ZOZ_CLEAR ! ensemble mean clear-sky ozone -REAL, DIMENSION(KFLEV) :: ZHP_CLEAR ! ensemble mean clear-sky half-lev. pression -REAL, DIMENSION(KFLEV) :: ZHT_CLEAR ! ensemble mean clear-sky half-lev. temp. -REAL, DIMENSION(KFLEV) :: ZDP_CLEAR ! ensemble mean clear-sky pressure thickness -REAL, DIMENSION(KFLEV,KAER) :: ZAER_CLEAR ! ensemble mean clear-sky aerosols optical thickness -REAL, DIMENSION(KSWB_MNH) :: ZALBP_CLEAR ! ensemble mean clear-sky surface albedo (parallel) -REAL, DIMENSION(KSWB_MNH) :: ZALBD_CLEAR ! ensemble mean clear-sky surface albedo (diffuse) -REAL :: ZEMIS_CLEAR ! ensemble mean clear-sky surface emissivity -REAL :: ZEMIW_CLEAR ! ensemble mean clear-sky LW window -REAL :: ZRMU0_CLEAR ! ensemble mean clear-sky MU0 -REAL :: ZTS_CLEAR ! ensemble mean clear-sky surface temperature. -REAL :: ZLSM_CLEAR ! ensemble mean clear-sky land sea-mask -REAL :: ZLAT_CLEAR,ZLON_CLEAR -! -!work arrays -REAL, DIMENSION(:), ALLOCATABLE :: ZWORK1, ZWORK2, ZWORK3, ZWORK -REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK4, ZWORK1AER, ZWORK2AER, ZWORK_GRID -LOGICAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: ZWORKL -! -! split arrays used to split the memory required by the ECMWF_radiation -! subroutine, the fields have the same meaning as their complete counterpart -! -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZALBP_SPLIT, ZALBD_SPLIT -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZEMIS_SPLIT, ZEMIW_SPLIT -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZRMU0_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCFAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZO3AVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZT_HL_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZPRES_HL_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZTAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZPAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZAER_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZDPRES_SPLIT -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZLSM_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQVAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQSAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQLAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQIAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQRAVE_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQRWC_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQLWC_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZQIWC_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZDZ_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCCT_C2R2_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCRT_C2R2_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCIT_C1R3_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCCT_LIMA_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCRT_LIMA_SPLIT -REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE :: ZCIT_LIMA_SPLIT -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZTS_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFSWDIR_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFSWDIF_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFLW_CS_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFLW_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFSW_CS_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFSW_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTLW_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTSW_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_TOP_GND_IRVISNIR_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_SW_DOWN_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_SW_UP_SPLIT -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFLUX_LW_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTLW_CS_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTSW_CS_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_ALB_VIS_SPLIT -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_ALB_NIR_SPLIT -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_TRA_VIS_SPLIT -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_TRA_NIR_SPLIT -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_ABS_VIS_SPLIT -REAL, DIMENSION(:), ALLOCATABLE :: ZPLAN_ABS_NIR_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZEFCL_LWD_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZEFCL_LWU_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLWP_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFIWP_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZRADLP_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZRADIP_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZEFCL_RRTM_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLSW_TOTAL_SPLIT -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTAU_TOTAL_SPLIT -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZOMEGA_TOTAL_SPLIT -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCG_TOTAL_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_SW_DOWN_CS_SPLIT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_SW_UP_CS_SPLIT -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFLUX_LW_CS_SPLIT -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZPIZA_EQ_TMP !Single scattering albedo of aerosols (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZIR !Real part of the aerosol refractive index(lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZII !Imaginary part of the aerosol refractive index (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZCGA_EQ_TMP !Assymetry factor aerosols (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTAUREL_EQ_TMP !tau/tau_{550} aerosols (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZPIZA_DST_TMP !Single scattering albedo of dust (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZCGA_DST_TMP !Assymetry factor dust (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTAUREL_DST_TMP !tau/tau_{550} dust (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZPIZA_AER_TMP !Single scattering albedo of aerosol from ORILAM (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZCGA_AER_TMP !Assymetry factor aerosol from ORILAM (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTAUREL_AER_TMP !tau/tau_{550} aerosol from ORILAM (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZPIZA_SLT_TMP !Single scattering albedo of sea salt (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZCGA_SLT_TMP !Assymetry factor of sea salt (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTAUREL_SLT_TMP !tau/tau_{550} of sea salt (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: PAER_AER !tau/tau_{550} aerosol from ORILAM (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: PAER_SLT !tau/tau_{550} sea salt (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: PAER_DST !tau/tau_{550} dust (lon,lat,lev,wvl) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTAU550_EQ_TMP !tau/tau_{550} aerosols (lon,lat,lev,wvl) -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZPIZA_EQ !Single scattering albedo of aerosols (points,lev,wvl) -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZCGA_EQ !Assymetry factor aerosols (points,lev,wvl) -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZTAUREL_EQ !tau/tau_{550} aerosols (points,lev,wvl) -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZPIZA_EQ_SPLIT !Single scattering albedo of aerosols (points,lev,wvl) -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZCGA_EQ_SPLIT !Assymetry factor aerosols (points,lev,wvl) -REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZTAUREL_EQ_SPLIT !tau/tau_{550} aerosols (points,lev,wvl) -REAL, DIMENSION(KFLEV,KSWB_OLD) :: ZPIZA_EQ_CLEAR !Single scattering albedo of aerosols (lev,wvl) -REAL, DIMENSION(KFLEV,KSWB_OLD) :: ZCGA_EQ_CLEAR !Assymetry factor aerosols (lev,wvl) -REAL, DIMENSION(KFLEV,KSWB_OLD) :: ZTAUREL_EQ_CLEAR !tau/tau_{550} aerosols (lev,wvl) -INTEGER :: WVL_IDX !Counter for wavelength - -! -INTEGER :: JI_SPLIT ! loop on the split array -INTEGER :: INUM_CALL ! number of CALL of the radiation scheme -INTEGER :: IDIM_EFF ! effective number of air-columns to compute -INTEGER :: IDIM_RESIDUE ! number of remaining air-columns to compute -INTEGER :: IBEG, IEND ! auxiliary indices -! -! -REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2),SIZE(PDTHRAD,3)) & - :: ZDTRAD_LW! LW temperature tendency -REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2),SIZE(PDTHRAD,3)) & - :: ZDTRAD_SW! SW temperature tendency -INTEGER :: ILUOUT ! Logical unit number for output-listing -INTEGER :: IRESP ! Return code of FM routines -REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2),SIZE(PDTHRAD,3)) & - :: ZSTORE_3D, ZSTORE_3D2! 3D work array for storage -REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2)) & - :: ZSTORE_2D ! 2D work array for storage! -INTEGER :: JBAND ! Solar band index -CHARACTER (LEN=4), DIMENSION(KSWB_OLD) :: YBAND_NAME ! Solar band name -CHARACTER (LEN=2) :: YDIR ! Type of the data field -! -INTEGER :: ISWB ! number of SW spectral bands (between radiations and surface schemes) -INTEGER :: JSWB ! loop on SW spectral bands -INTEGER :: JAE ! loop on aerosol class -TYPE(TFIELDMeTaDATA) :: TZFIELD2D, TZFIELD3D -! -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZDZPABST -REAL :: ZMINVAL -INTEGER, DIMENSION(3) :: IMINLOC -INTEGER :: IINFO_ll -LOGICAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: GCLOUD_SURF -! -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZLON,ZLAT -REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE :: ZLON_SPLIT,ZLAT_SPLIT -! -INTEGER :: ICLEAR_COL_ll -INTEGER, DIMENSION(:), ALLOCATABLE :: INDEX_ICLEAR_COL -REAL, DIMENSION(KFLEV) :: ZT_CLEAR_DD ! ensemble mean clear-sky temperature -REAL :: ZCLEAR_COL_ll , ZDLON_ll -!------------------------------------------------------------------------- -!------------------------------------------------------------------------- -!------------------------------------------------------------------------- -! -!* 1. COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES -! ---------------------------------------------- -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) ! this definition must be coherent with - ! the one used in ini_radiations routine -IKU = SIZE(PTHT,3) -IKB = 1 + JPVEXT -IKE = IKU - JPVEXT -! -IKSTAE = SIZE(PSTATM,1) -IKUP = IKE-JPVEXT+1 -! -ISWB = SIZE(PSRFSWD_DIR,3) -! -!------------------------------------------------------------------------------- -!* 1.1 CHECK PRESSURE DECREASING -! ------------------------- -ZDZPABST(:,:,1:IKU-1) = PPABST(:,:,1:IKU-1) - PPABST(:,:,2:IKU) -ZDZPABST(:,:,IKU) = ZDZPABST(:,:,IKU-1) -! -ZMINVAL=MIN_ll(ZDZPABST,IINFO_ll) -! -IF ( ZMINVAL <= 0.0 ) THEN - ILUOUT = TLUOUT%NLU - IMINLOC=GMINLOC_ll( ZDZPABST ) - WRITE(ILUOUT,*) ' radiation.f90 STOP :: SOMETHING WRONG WITH PRESSURE , ZDZPABST <= 0.0 ' - WRITE(ILUOUT,*) ' radiation :: ZDZPABST ', ZMINVAL,' located at ', IMINLOC - FLUSH(unit=ILUOUT) - call Print_msg( NVERB_FATAL, 'GEN', 'RADIATIONS', 'something wrong with pressure: ZDZPABST <= 0.0' ) - -ENDIF -!------------------------------------------------------------------------------ -ALLOCATE(ZLAT(KDLON)) -ALLOCATE(ZLON(KDLON)) -IF(LCARTESIAN) THEN - ZLAT(:) = XLAT0*(XPI/180.) - ZLON(:) = XLON0*(XPI/180.) -ELSE - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZLAT(IIJ) = XLAT(JI,JJ)*(XPI/180.) - ZLON(IIJ) = XLON(JI,JJ)*(XPI/180.) - END DO - END DO -END IF -!------------------------------------------------------------------------------- -! -!* 2. INITIALIZES THE MEAN-LAYER VARIABLES -! ------------------------------------ -! -ZEXNT(:,:,:)= ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) -! -! Columns where radiation is computed are put on a single line -ALLOCATE(ZTAVE(KDLON,KFLEV)) -ALLOCATE(ZQVAVE(KDLON,KFLEV)) -ALLOCATE(ZQLAVE(KDLON,KFLEV)) -ALLOCATE(ZQIAVE(KDLON,KFLEV)) -ALLOCATE(ZCFAVE(KDLON,KFLEV)) -ALLOCATE(ZQRAVE(KDLON,KFLEV)) -ALLOCATE(ZQLWC(KDLON,KFLEV)) -ALLOCATE(ZQIWC(KDLON,KFLEV)) -ALLOCATE(ZQRWC(KDLON,KFLEV)) -ALLOCATE(ZDZ(KDLON,KFLEV)) -! -ZQVAVE(:,:) = 0.0 -ZQLAVE(:,:) = 0.0 -ZQIAVE(:,:) = 0.0 -ZQRAVE(:,:) = 0.0 -ZCFAVE(:,:) = 0.0 -ZQLWC(:,:) = 0.0 -ZQIWC(:,:) = 0.0 -ZQRWC(:,:) = 0.0 -ZDZ(:,:)=0.0 -! -!COMPUTE THE MESH SIZE -DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZDZ(IIJ,JKRAD) = PZZ(JI,JJ,JK+1) - PZZ(JI,JJ,JK) - ZTAVE(IIJ,JKRAD) = PTHT(JI,JJ,JK)*ZEXNT(JI,JJ,JK) ! Conversion potential temperature -> actual temperature - END DO - END DO -END DO -! -! Check if the humidity mixing ratio is available -! -IF( SIZE(PRT(:,:,:,:),4) >= 1 ) THEN - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZQVAVE(IIJ,JKRAD) =MAX(0., PRT(JI,JJ,JK,1)) - END DO - END DO - END DO -END IF -! -! Check if the cloudwater mixing ratio is available -! -IF( SIZE(PRT(:,:,:,:),4) >= 2 ) THEN - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZQLAVE(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,2)) - ZQLWC(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,2)*PRHODREF(JI,JJ,JK)) - ZCFAVE(IIJ,JKRAD) = PCLDFR(JI,JJ,JK) - END DO - END DO - END DO -END IF -! -! Check if the rainwater mixing ratio is available -! -IF( SIZE(PRT(:,:,:,:),4) >= 3 ) THEN - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZQRWC(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,3)*PRHODREF(JI,JJ,JK)) - ZQRAVE(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,3)) - END DO - END DO - END DO -END IF -! -! Check if the cloudice mixing ratio is available -! -IF( SIZE(PRT(:,:,:,:),4) >= 4 ) THEN - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZQIWC(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,4)*PRHODREF(JI,JJ,JK)) -! ZQIAVE(IIJ,JKRAD) = MAX( PRT(JI,JJ,JK,4)-XRTMIN(4),0.0 ) - ZQIAVE(IIJ,JKRAD) = MAX( PRT(JI,JJ,JK,4),0.0 ) - END DO - END DO - END DO -END IF -! -! Standard atmosphere extension -! -DO JK=IKUP,KFLEV - JK1 = (KSTATM-1)+(JK-IKUP) - JK2 = JK1+1 - ZTAVE(:,JK) = 0.5*( PSTATM(JK1,3)+PSTATM(JK2,3) ) - ZQVAVE(:,JK) = 0.5*( PSTATM(JK1,5)/PSTATM(JK1,4)+ & - PSTATM(JK2,5)/PSTATM(JK2,4) ) -END DO -! -! 2.1 pronostic water concentation fields (C2R2 coupling) -! -IF( NSV_C2R2 /= 0 ) THEN - ALLOCATE (ZCCT_C2R2(KDLON, KFLEV)) - ALLOCATE (ZCRT_C2R2(KDLON, KFLEV)) - ZCCT_C2R2(:, :) = 0. - ZCRT_C2R2 (:,:) = 0. - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZCCT_C2R2 (IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_C2R2BEG+1)) - ZCRT_C2R2 (IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_C2R2BEG+2)) - END DO - END DO - END DO -ELSE - ALLOCATE (ZCCT_C2R2(0,0)) - ALLOCATE (ZCRT_C2R2(0,0)) -END IF -! -IF( NSV_C1R3 /= 0 ) THEN - ALLOCATE (ZCIT_C1R3(KDLON, KFLEV)) - ZCIT_C1R3 (:,:) = 0. - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZCIT_C1R3 (IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_C1R3BEG)) - END DO - END DO - END DO -ELSE - ALLOCATE (ZCIT_C1R3(0,0)) -END IF -! -! -! 2.1*bis pronostic water concentation fields (LIMA coupling) -! -IF( CCLOUD == 'LIMA' ) THEN - ALLOCATE (ZCCT_LIMA(KDLON, KFLEV)) - ALLOCATE (ZCRT_LIMA(KDLON, KFLEV)) - ALLOCATE (ZCIT_LIMA(KDLON, KFLEV)) - ZCCT_LIMA(:, :) = 0. - ZCRT_LIMA (:,:) = 0. - ZCIT_LIMA (:,:) = 0. - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - IF (NMOM_C.GE.2) ZCCT_LIMA(IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_LIMA_NC)) - IF (NMOM_R.GE.2) ZCRT_LIMA(IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_LIMA_NR)) - IF (NMOM_I.GE.2) ZCIT_LIMA(IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_LIMA_NI)) - END DO - END DO - END DO -END IF -! -!------------------------------------------------------------------------------- -! -!* 3. INITIALIZES THE HALF-LEVEL VARIABLES -! ------------------------------------ -! -ALLOCATE(ZPRES_HL(KDLON,KFLEV+1)) -ALLOCATE(ZT_HL(KDLON,KFLEV+1)) -! -DO JK=IKB,IKE+1 - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZPRES_HL(IIJ,JKRAD) = XP00 * (0.5*(ZEXNT(JI,JJ,JK)+ZEXNT(JI,JJ,JK-1)))**(XCPD/XRD) - END DO - END DO -END DO - -! Standard atmosphere extension - pressure -!* begining at ikup+1 level allows to use a model domain higher than 50km -! -DO JK=IKUP+1,KFLEV+1 - JK1 = (KSTATM-1)+(JK-IKUP) - ZPRES_HL(:,JK) = PSTATM(JK1,2)*100.0 ! mb -> Pa -END DO -! -! Surface temperature at the first level -! and surface radiative temperature -ALLOCATE(ZTS(KDLON)) -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZT_HL(IIJ,1) = PTSRAD(JI,JJ) - ZTS(IIJ) = PTSRAD(JI,JJ) - END DO -END DO -! -! Temperature at half levels -! -ZT_HL(:,2:IKE-JPVEXT) = 0.5*(ZTAVE(:,1:IKE-JPVEXT-1)+ZTAVE(:,2:IKE-JPVEXT)) -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZT_HL(IIJ,IKE-JPVEXT+1) = 0.5*PTHT(JI,JJ,IKE )*ZEXNT(JI,JJ,IKE ) & - + 0.5*PTHT(JI,JJ,IKE+1)*ZEXNT(JI,JJ,IKE+1) - END DO -END DO -! -! Standard atmosphere extension - temperature -!* begining at ikup+1 level allows to use a model domain higher than 50km -! -DO JK=IKUP+1,KFLEV+1 - JK1 = (KSTATM-1)+(JK-IKUP) - ZT_HL(:,JK) = PSTATM(JK1,3) -END DO -! -!mean layer pressure and layer differential pressure (from half level variables) -! -ALLOCATE(ZPAVE(KDLON,KFLEV)) -ALLOCATE(ZDPRES(KDLON,KFLEV)) -DO JKRAD=1,KFLEV - ZPAVE(:,JKRAD)=0.5*(ZPRES_HL(:,JKRAD)+ZPRES_HL(:,JKRAD+1)) - ZDPRES(:,JKRAD)=ZPRES_HL(:,JKRAD)-ZPRES_HL(:,JKRAD+1) -END DO -!----------------------------------------------------------------------- -!* 4. INITIALIZES THE AEROSOLS and OZONE PROFILES from climatology -! ------------------------------------------- -! -! 4.1 AEROSOL optical thickness -! EXPL -> defined online, otherwise climatology -IF (CAOP=='EXPL') THEN - GAOP = .TRUE. -ELSE - GAOP = .FALSE. -ENDIF -! -IF (CAOP=='EXPL') THEN - ALLOCATE(ZPIZA_EQ_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZCGA_EQ_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZTAUREL_EQ_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - - ALLOCATE(ZPIZA_DST_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZCGA_DST_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZTAUREL_DST_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(PAER_DST(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3))) - - ALLOCATE(ZPIZA_AER_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZCGA_AER_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZTAUREL_AER_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(PAER_AER(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3))) - - ALLOCATE(ZPIZA_SLT_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZCGA_SLT_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(ZTAUREL_SLT_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) - ALLOCATE(PAER_SLT(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3))) - - - ALLOCATE(ZII(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),KSWB_OLD)) - ALLOCATE(ZIR(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),KSWB_OLD)) - - ZPIZA_EQ_TMP = 0. - ZCGA_EQ_TMP = 0. - ZTAUREL_EQ_TMP = 0. - - ZPIZA_DST_TMP = 0. - ZCGA_DST_TMP = 0. - ZTAUREL_DST_TMP = 0 - - ZPIZA_SLT_TMP = 0. - ZCGA_SLT_TMP = 0. - ZTAUREL_SLT_TMP = 0 - - ZPIZA_AER_TMP = 0. - ZCGA_AER_TMP = 0. - ZTAUREL_AER_TMP = 0 - - PAER_DST=0. - PAER_SLT=0. - PAER_AER=0. - - IF (LORILAM) THEN - CALL AEROOPT_GET( & - PSVT(IIB:IIE,IJB:IJE,:,NSV_AERBEG:NSV_AEREND) & !I [ppv] aerosols concentration - ,PZZ(IIB:IIE,IJB:IJE,:) & !I [m] height of layers - ,PRHODREF(IIB:IIE,IJB:IJE,:) & !I [kg/m3] density of air - ,ZPIZA_AER_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] single scattering albedo of aerosols - ,ZCGA_AER_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] assymetry factor for aerosols - ,ZTAUREL_AER_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm) - ,PAER_AER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT) & !O [-] optical depth of aerosols at wvl=550nm - ,KSWB_OLD & !I |nbr] number of shortwave bands - ,ZIR(IIB:IIE,IJB:IJE,:,:) & !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm) - ,ZII(IIB:IIE,IJB:IJE,:,:) & !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm) - ) - ENDIF - IF(LDUST) THEN - CALL DUSTOPT_GET( & - PSVT(IIB:IIE,IJB:IJE,:,NSV_DSTBEG:NSV_DSTEND) & !I [ppv] Dust scalar concentration - ,PZZ(IIB:IIE,IJB:IJE,:) & !I [m] height of layers - ,PRHODREF(IIB:IIE,IJB:IJE,:) & !I [kg/m3] density of air - ,ZPIZA_DST_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] single scattering albedo of dust - ,ZCGA_DST_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] assymetry factor for dust - ,ZTAUREL_DST_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm) - ,PAER_DST(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT) & !O [-] optical depth of dust at wvl=550nm - ,KSWB_OLD & !I |nbr] number of shortwave bands - ) - DO WVL_IDX=1,KSWB_OLD - PDST_WL(:,:,:,WVL_IDX) = ZTAUREL_DST_TMP(:,:,:,WVL_IDX)* PAER(:,:,:,3) - ENDDO - ENDIF - IF(LSALT) THEN - CALL SALTOPT_GET( & - PSVT(IIB:IIE,IJB:IJE,:,NSV_SLTBEG:NSV_SLTEND) & !I [ppv] sea salt scalar concentration - ,PZZ(IIB:IIE,IJB:IJE,:) & !I [m] height of layers - ,PRHODREF(IIB:IIE,IJB:IJE,:) & !I [kg/m3] density of air - ,PTHT(IIB:IIE,IJB:IJE,:) & !I [K] potential temperature - ,PPABST(IIB:IIE,IJB:IJE,:) & !I [hPa] pressure - ,PRT(IIB:IIE,IJB:IJE,:,:) & !I [kg/kg] water mixing ratio - ,ZPIZA_SLT_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] single scattering albedo of sea salt - ,ZCGA_SLT_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] assymetry factor for sea salt - ,ZTAUREL_SLT_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm) - ,PAER_SLT(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT) & !O [-] optical depth of sea salt at wvl=550nm - ,KSWB_OLD & !I |nbr] number of shortwave bands - ) - ENDIF - - ZTAUREL_EQ_TMP(:,:,:,:)=ZTAUREL_DST_TMP(:,:,:,:)+ZTAUREL_AER_TMP(:,:,:,:)+ZTAUREL_SLT_TMP(:,:,:,:) - - PAER(:,:,:,2)=PAER_SLT(:,:,:) - PAER(:,:,:,3)=PAER_DST(:,:,:) - PAER(:,:,:,4)=PAER_AER(:,:,:) - - - WHERE (ZTAUREL_EQ_TMP(:,:,:,:).GT.0.0) - ZPIZA_EQ_TMP(:,:,:,:)=(ZPIZA_DST_TMP(:,:,:,:)*ZTAUREL_DST_TMP(:,:,:,:)+& - ZPIZA_AER_TMP(:,:,:,:)*ZTAUREL_AER_TMP(:,:,:,:)+& - ZPIZA_SLT_TMP(:,:,:,:)*ZTAUREL_SLT_TMP(:,:,:,:))/& - ZTAUREL_EQ_TMP(:,:,:,:) - END WHERE - WHERE ((ZTAUREL_EQ_TMP(:,:,:,:).GT.0.0).AND.(ZPIZA_EQ_TMP(:,:,:,:).GT.0.0)) - ZCGA_EQ_TMP(:,:,:,:)=(ZPIZA_DST_TMP(:,:,:,:)*ZTAUREL_DST_TMP(:,:,:,:)*ZCGA_DST_TMP(:,:,:,:)+& - ZPIZA_AER_TMP(:,:,:,:)*ZTAUREL_AER_TMP(:,:,:,:)*ZCGA_AER_TMP(:,:,:,:)+& - ZPIZA_SLT_TMP(:,:,:,:)*ZTAUREL_SLT_TMP(:,:,:,:)*ZCGA_SLT_TMP(:,:,:,:))/& - (ZTAUREL_EQ_TMP(:,:,:,:)*ZPIZA_EQ_TMP(:,:,:,:)) - END WHERE - - ZTAUREL_EQ_TMP(:,:,:,:)=max(1.E-8,ZTAUREL_EQ_TMP(:,:,:,:)) - ZCGA_EQ_TMP(:,:,:,:)=max(1.E-8,ZCGA_EQ_TMP(:,:,:,:)) - ZPIZA_EQ_TMP(:,:,:,:)=max(1.E-8,ZPIZA_EQ_TMP(:,:,:,:)) - PAER(:,:,:,3)=max(1.E-8,PAER(:,:,:,3)) - ZPIZA_EQ_TMP(:,:,:,:)=min(0.99,ZPIZA_EQ_TMP(:,:,:,:)) - - -ENDIF -! -! Computes SSA, optical depth and assymetry factor for clear sky (aerosols) -ZTAUAZ(:,:,:,:) = 0. -ZPIZAZ(:,:,:,:) = 0. -ZCGAZ(:,:,:,:) = 0. -DO WVL_IDX=1,KSWB_OLD - DO JAE=1,KAER - !Special optical properties for dust - IF (CAOP=='EXPL'.AND.(JAE==3)) THEN - !Ponderation of aerosol optical in case of explicit optical factor - !ti - ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)= ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) + & - PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) * & - ZTAUREL_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) - !wi*ti - ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)= ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) + & - PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) * & - ZTAUREL_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) * & - ZPIZA_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) - !wi*ti*gi - ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) = ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) + & - PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) * & - ZTAUREL_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) * & - ZPIZA_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) * & - ZCGA_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) - ELSE - - !Ponderation of aerosol optical properties - !ti - ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)=ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)+& - PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) * RTAUA(WVL_IDX,JAE) - !wi*ti - ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)=ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)+& - PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) *& - RTAUA(WVL_IDX,JAE)*RPIZA(WVL_IDX,JAE) - !wi*ti*gi - ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) = ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) +& - PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) *& - RTAUA(WVL_IDX,JAE)*RPIZA(WVL_IDX,JAE)*RCGA(WVL_IDX,JAE) - ENDIF - ENDDO -! assymetry factor: - -ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) = ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) / & - ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) -! SSA: -ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) = ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) / & - ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) -ENDDO -! - -! -ALLOCATE(ZAER(KDLON,KFLEV,KAER)) -! Aerosol classes -! 1=Continental 2=Maritime 3=Desert 4=Urban 5=Volcanic 6=Stratos.Bckgnd -! Loaded from climatology -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZAER (IIJ,:,:) = PAER_CLIM (JI,JJ,:,:) - END DO -END DO -IF ((CAOP=='EXPL') .AND. LDUST ) THEN - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZAER (IIJ,:,3) = PAER (JI,JJ,:,3) - END DO - END DO -END IF -IF ((CAOP=='EXPL') .AND. LSALT ) THEN - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZAER (IIJ,:,2) = PAER (JI,JJ,:,2) - END DO - END DO -END IF -IF ((CAOP=='EXPL') .AND. LORILAM ) THEN - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZAER (IIJ,:,4) = PAER (JI,JJ,:,4) - END DO - END DO -END IF -! -ALLOCATE(ZPIZA_EQ(KDLON,KFLEV,KSWB_OLD)) -ALLOCATE(ZCGA_EQ(KDLON,KFLEV,KSWB_OLD)) -ALLOCATE(ZTAUREL_EQ(KDLON,KFLEV,KSWB_OLD)) -IF(CAOP=='EXPL')THEN - !Transform from vector of type #lon #lat #lev #wvl - !to vectors of type #points, #levs, #wavelengths - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZPIZA_EQ(IIJ,:,:) = ZPIZA_EQ_TMP(JI,JJ,:,:) - ZCGA_EQ(IIJ,:,:)= ZCGA_EQ_TMP(JI,JJ,:,:) - ZTAUREL_EQ(IIJ,:,:)=ZTAUREL_EQ_TMP(JI,JJ,:,:) - END DO - END DO - DEALLOCATE(ZPIZA_EQ_TMP) - DEALLOCATE(ZCGA_EQ_TMP) - DEALLOCATE(ZTAUREL_EQ_TMP) - DEALLOCATE(ZPIZA_DST_TMP) - DEALLOCATE(ZCGA_DST_TMP) - DEALLOCATE(ZTAUREL_DST_TMP) - DEALLOCATE(ZPIZA_AER_TMP) - DEALLOCATE(ZCGA_AER_TMP) - DEALLOCATE(ZTAUREL_AER_TMP) - DEALLOCATE(ZPIZA_SLT_TMP) - DEALLOCATE(ZCGA_SLT_TMP) - DEALLOCATE(ZTAUREL_SLT_TMP) - DEALLOCATE(PAER_DST) - DEALLOCATE(PAER_AER) - DEALLOCATE(PAER_SLT) - DEALLOCATE(ZIR) - DEALLOCATE(ZII) -END IF - - -! -! 4.2 OZONE content -! -ALLOCATE(ZO3AVE(KDLON,KFLEV)) -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZO3AVE(IIJ,:) = POZON (JI,JJ,:) - END DO -END DO -#ifdef MNH_ECRAD -#if ( VER_ECRAD == 140 ) -POZON = POZON -#endif -#endif -! -!------------------------------------------------------------------------------- -! -!* 5. CALLS THE E.C.M.W.F. RADIATION CODE -! ----------------------------------- -! -! -!* 5.1 INITIALIZES 2D AND SURFACE FIELDS -! -ALLOCATE(ZRMU0(KDLON)) -ALLOCATE(ZLSM(KDLON)) -! -ALLOCATE(ZALBP(KDLON,KSWB_MNH)) -ALLOCATE(ZALBD(KDLON,KSWB_MNH)) -! -ALLOCATE(ZEMIS(KDLON,KLWB_MNH)) -ALLOCATE(ZEMIW(KDLON,KLWB_MNH)) -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZEMIS(IIJ,:) = PEMIS(JI,JJ,:) - ZRMU0(IIJ) = PCOSZEN(JI,JJ) - ZLSM(IIJ) = 1.0 - PSEA(JI,JJ) - END DO -END DO -! -! spectral albedo -! -IF ( SIZE(PDIR_ALB,3)==1 ) THEN - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ! sw direct and diffuse albedos - ZALBP(IIJ,:) = PDIR_ALB(JI,JJ,1) - ZALBD(IIJ,:) = PSCA_ALB(JI,JJ,1) - ! - END DO - END DO -ELSE - DO JK=1, SIZE(PDIR_ALB,3) - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ! sw direct and diffuse albedos - ZALBP(IIJ,JK) = PDIR_ALB(JI,JJ,JK) - ZALBD(IIJ,JK) = PSCA_ALB(JI,JJ,JK) - ENDDO - END DO - ENDDO -END IF -! -! -! LW emissivity -ZEMIW(:,:)= ZEMIS(:,:) -! -!solar constant -ZRII0= PCORSOL*XI0 ! solar constant multiplied by seasonal variations due to Earth-Sun distance -! -! -!* 5.2 ACCOUNTS FOR THE CLEAR-SKY APPROXIMATION -! -! Performs the horizontal average of the fields when no cloud -! -ZCLOUD(:) = SUM( ZCFAVE(:,:),DIM=2 ) ! one where no cloud on the vertical -! -! MODIF option CLLY -ALLOCATE ( ICLEAR_2D_TM1(KDLON) ) -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ICLEAR_2D_TM1(IIJ) = KCLEARCOL_TM1(JI,JJ) - END DO -END DO -! -IF(OCLOUD_ONLY .OR. OCLEAR_SKY) THEN - ! - GCLEAR_2D(:) = .TRUE. - WHERE( (ZCLOUD(:) > 0.0) .OR. (ICLEAR_2D_TM1(:)==0) ) ! FALSE on cloudy columns - GCLEAR_2D(:) = .FALSE. - END WHERE - ! - ICLEAR_COL = COUNT( GCLEAR_2D(:) ) ! number of clear sky columns - ! - ALLOCATE(INDEX_ICLEAR_COL(ICLEAR_COL)) - IIJ = 0 - DO JI=1,KDLON - IF ( GCLEAR_2D(JI) ) THEN - IIJ = IIJ + 1 - INDEX_ICLEAR_COL(IIJ) = JI - END IF - END DO - - IF( ICLEAR_COL == KDLON ) THEN ! No cloud case so only the mean clear-sky -!!$ GCLEAR_2D(1) = .FALSE. ! column is selected -!!$ ICLEAR_COL = KDLON-1 - GNOCL = .TRUE. ! TRUE if no cloud at all - ELSE - GNOCL = .FALSE. - END IF - - GCLEAR(:,:) = SPREAD( GCLEAR_2D(:),DIM=2,NCOPIES=KFLEV ) ! vertical extension of clear columns 2D map - ICLOUD_COL = KDLON - ICLEAR_COL ! number of cloudy columns -! - ZCLEAR_COL_ll = REAL(ICLEAR_COL) - CALL REDUCESUM_ll(ZCLEAR_COL_ll,IINFO_ll) - !ZDLON_ll = KDLON - !CALL REDUCESUM_ll(ZDLON_ll,IINFO_ll) - - !IF (IP == 1 ) - !print*,",RADIATIOn COULD_ONLY=OCLOUD_ONLY,OCLEAR_SKY,ZCLEAR_COL_ll,ICLEAR_COL,ICLOUD_COL,KDON,ZDLON_ll,GNOCL=", & - ! OCLOUD_ONLY,OCLEAR_SKY,ZCLEAR_COL_ll,ICLEAR_COL,ICLOUD_COL,KDLON,ZDLON_ll,GNOCL -! -!!$ IF( ICLEAR_COL /=0 ) THEN ! at least one clear-sky column exists -> average profiles on clear columns - IF( ZCLEAR_COL_ll /= 0.0 ) THEN ! at least one clear-sky column exists -> average profiles on clear columns - ZT_CLEAR(:) = SUM_DD_R2_R1_ll(ZTAVE(INDEX_ICLEAR_COL(:),:)) / ZCLEAR_COL_ll - ZP_CLEAR(:) = SUM_DD_R2_R1_ll(ZPAVE(INDEX_ICLEAR_COL(:),:)) / ZCLEAR_COL_ll - ZQV_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZQVAVE(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll - ZOZ_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZO3AVE(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll - ZDP_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZDPRES(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll - - DO JK1=1,KAER - ZAER_CLEAR(:,JK1) = SUM_DD_R2_R1_ll(REAL(ZAER(INDEX_ICLEAR_COL(:),:,JK1))) / ZCLEAR_COL_ll - END DO - !Get an average value for the clear column - IF(CAOP=='EXPL')THEN - DO WVL_IDX=1,KSWB_OLD - ZPIZA_EQ_CLEAR(:,WVL_IDX) = SUM_DD_R2_R1_ll(REAL(ZPIZA_EQ( INDEX_ICLEAR_COL(:),:,WVL_IDX))) / ZCLEAR_COL_ll - ZCGA_EQ_CLEAR(:,WVL_IDX) = SUM_DD_R2_R1_ll(REAL(ZCGA_EQ( INDEX_ICLEAR_COL(:),:,WVL_IDX))) / ZCLEAR_COL_ll - ZTAUREL_EQ_CLEAR(:,WVL_IDX) = SUM_DD_R2_R1_ll(REAL(ZTAUREL_EQ(INDEX_ICLEAR_COL(:),:,WVL_IDX))) / ZCLEAR_COL_ll - ENDDO - ENDIF - ! - ZHP_CLEAR(1:KFLEV) = SUM_DD_R2_R1_ll(REAL(ZPRES_HL(INDEX_ICLEAR_COL(:),1:KFLEV))) / ZCLEAR_COL_ll - ZHT_CLEAR(1:KFLEV) = SUM_DD_R2_R1_ll(REAL(ZT_HL (INDEX_ICLEAR_COL(:),1:KFLEV))) / ZCLEAR_COL_ll - ! - ZALBP_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZALBP(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll - ZALBD_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZALBD(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll - ! - ZEMIS_CLEAR = SUM_DD_R1_ll(REAL(ZEMIS(INDEX_ICLEAR_COL(:),1))) / ZCLEAR_COL_ll - ZEMIW_CLEAR = SUM_DD_R1_ll(REAL(ZEMIW(INDEX_ICLEAR_COL(:),1))) / ZCLEAR_COL_ll - ZRMU0_CLEAR = SUM_DD_R1_ll(REAL(ZRMU0(INDEX_ICLEAR_COL(:)))) / ZCLEAR_COL_ll - ZTS_CLEAR = SUM_DD_R1_ll(REAL(ZTS(INDEX_ICLEAR_COL(:)))) / ZCLEAR_COL_ll - ZLSM_CLEAR = SUM_DD_R1_ll(REAL(ZLSM(INDEX_ICLEAR_COL(:)))) / ZCLEAR_COL_ll - ZLAT_CLEAR = SUM_DD_R1_ll(REAL(ZLAT(INDEX_ICLEAR_COL(:)))) / ZCLEAR_COL_ll - ZLON_CLEAR = SUM_DD_R1_ll(REAL(ZLON(INDEX_ICLEAR_COL(:)))) / ZCLEAR_COL_ll -! - ELSE ! no clear columns -> the first column is chosen, without physical meaning: it will not be - ! unpacked after the call to the radiation ecmwf routine - ZT_CLEAR(:) = ZTAVE(1,:) - ZP_CLEAR(:) = ZPAVE(1,:) - ZQV_CLEAR(:) = ZQVAVE(1,:) - ZOZ_CLEAR(:) = ZO3AVE(1,:) - ZDP_CLEAR(:) = ZDPRES(1,:) - ZAER_CLEAR(:,:) = ZAER(1,:,:) - IF(CAOP=='EXPL')THEN - ZPIZA_EQ_CLEAR(:,:)=ZPIZA_EQ(1,:,:) - ZCGA_EQ_CLEAR(:,:)=ZCGA_EQ(1,:,:) - ZTAUREL_EQ_CLEAR(:,:)=ZTAUREL_EQ(1,:,:) - ENDIF -! - ZHP_CLEAR(1:KFLEV) = ZPRES_HL(1,1:KFLEV) - ZHT_CLEAR(1:KFLEV) = ZT_HL(1,1:KFLEV) - ZALBP_CLEAR(:) = ZALBP(1,:) - ZALBD_CLEAR(:) = ZALBD(1,:) -! - ZEMIS_CLEAR = ZEMIS(1,1) - ZEMIW_CLEAR = ZEMIW(1,1) - ZRMU0_CLEAR = ZRMU0(1) - ZTS_CLEAR = ZTS(1) - ZLSM_CLEAR = ZLSM(1) - ZLAT_CLEAR = ZLAT(1) - ZLON_CLEAR = ZLON(1) - END IF - ! - GCLOUD(:,:) = .NOT.GCLEAR(:,:) ! .true. where the column is cloudy - GCLOUDT(:,:)=TRANSPOSE(GCLOUD(:,:)) - ICLOUD = ICLOUD_COL*KFLEV ! total number of voxels in cloudy columns - ALLOCATE(ZWORK1(ICLOUD)) - ALLOCATE(ZWORK2(ICLOUD+KFLEV)) ! allocation for the KFLEV levels of - ! the ICLOUD cloudy columns - ! and of the KFLEV levels of the clear sky one - ! - ! temperature profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZTAVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= ZT_CLEAR(1:) ! and the single clear_sky one - DEALLOCATE(ZTAVE) - ALLOCATE(ZTAVE(ICLOUD_COL+1,KFLEV)) - ZTAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! vapor mixing ratio profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZQVAVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= ZQV_CLEAR(1:) ! and the single clear_sky one - DEALLOCATE(ZQVAVE) - ALLOCATE(ZQVAVE(ICLOUD_COL+1,KFLEV)) - ZQVAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! mesh size - ! - ZWORK1(:) = PACK( TRANSPOSE(ZDZ(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZDZ) - ALLOCATE(ZDZ(ICLOUD_COL+1,KFLEV)) - ZDZ(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! - ! liquid water mixing ratio profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZQLAVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZQLAVE) - ALLOCATE(ZQLAVE(ICLOUD_COL+1,KFLEV)) - ZQLAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - !rain - ! - ZWORK1(:) = PACK( TRANSPOSE(ZQRAVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZQRAVE) - ALLOCATE(ZQRAVE(ICLOUD_COL+1,KFLEV)) - ZQRAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! ice water mixing ratio profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZQIAVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZQIAVE) - ALLOCATE(ZQIAVE(ICLOUD_COL+1,KFLEV)) - ZQIAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! - ! liquid water mixing ratio profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZQLWC(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZQLWC) - ALLOCATE(ZQLWC(ICLOUD_COL+1,KFLEV)) - ZQLWC(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - !rain - ! - ZWORK1(:) = PACK( TRANSPOSE(ZQRWC(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZQRWC) - ALLOCATE(ZQRWC(ICLOUD_COL+1,KFLEV)) - ZQRWC(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! ice water mixing ratio profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZQIWC(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZQIWC) - ALLOCATE(ZQIWC(ICLOUD_COL+1,KFLEV)) - ZQIWC(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! - ! cloud fraction profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZCFAVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZCFAVE) - ALLOCATE(ZCFAVE(ICLOUD_COL+1,KFLEV)) - ZCFAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ! C2R2 water particle concentration - ! - IF ( SIZE(ZCCT_C2R2) > 0 ) THEN - ZWORK1(:) = PACK( TRANSPOSE(ZCCT_C2R2(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZCCT_C2R2) - ALLOCATE(ZCCT_C2R2(ICLOUD_COL+1,KFLEV)) - ZCCT_C2R2 (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ENDIF - IF ( SIZE (ZCRT_C2R2) > 0 ) THEN - ZWORK1(:) = PACK( TRANSPOSE(ZCRT_C2R2(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZCRT_C2R2) - ALLOCATE(ZCRT_C2R2(ICLOUD_COL+1,KFLEV)) - ZCRT_C2R2 (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ENDIF - IF ( SIZE (ZCIT_C1R3) > 0) THEN - ZWORK1(:) = PACK( TRANSPOSE(ZCIT_C1R3(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZCIT_C1R3) - ALLOCATE(ZCIT_C1R3(ICLOUD_COL+1,KFLEV)) - ZCIT_C1R3 (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ENDIF - ! - ! LIMA water particle concentration - ! - IF( CCLOUD == 'LIMA' ) THEN - ZWORK1(:) = PACK( TRANSPOSE(ZCCT_LIMA(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZCCT_LIMA) - ALLOCATE(ZCCT_LIMA(ICLOUD_COL+1,KFLEV)) - ZCCT_LIMA (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) -! - ZWORK1(:) = PACK( TRANSPOSE(ZCRT_LIMA(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZCRT_LIMA) - ALLOCATE(ZCRT_LIMA(ICLOUD_COL+1,KFLEV)) - ZCRT_LIMA (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) -! - ZWORK1(:) = PACK( TRANSPOSE(ZCIT_LIMA(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= 0.0 ! and the single clear_sky one - DEALLOCATE(ZCIT_LIMA) - ALLOCATE(ZCIT_LIMA(ICLOUD_COL+1,KFLEV)) - ZCIT_LIMA (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ENDIF - ! - ! ozone content profiles - ! - ZWORK1(:) = PACK( TRANSPOSE(ZO3AVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= ZOZ_CLEAR(1:) ! and the single clear_sky one - DEALLOCATE(ZO3AVE) - ALLOCATE(ZO3AVE(ICLOUD_COL+1,KFLEV)) - ZO3AVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - ZWORK1(:) = PACK( TRANSPOSE(ZPAVE(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= ZP_CLEAR(1:) ! and the single clear_sky one - DEALLOCATE(ZPAVE) - ALLOCATE(ZPAVE(ICLOUD_COL+1,KFLEV)) - ZPAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - !pressure thickness - ! - ZWORK1(:) = PACK( TRANSPOSE(ZDPRES(:,:)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= ZDP_CLEAR(1:) ! and the single clear_sky one - DEALLOCATE(ZDPRES) - ALLOCATE(ZDPRES(ICLOUD_COL+1,KFLEV)) - ZDPRES(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ! - !aerosols - ! - ALLOCATE(ZWORK1AER(ICLOUD,KAER)) - ALLOCATE(ZWORK2AER(ICLOUD+KFLEV,KAER)) - DO JK=1,KAER - ZWORK1AER(:,JK) = PACK( TRANSPOSE(ZAER(:,:,JK)),MASK=GCLOUDT(:,:) ) - ZWORK2AER(1:ICLOUD,JK)=ZWORK1AER(:,JK) - ZWORK2AER(ICLOUD+1:,JK)=ZAER_CLEAR(:,JK) - END DO - DEALLOCATE(ZAER) - ALLOCATE(ZAER(ICLOUD_COL+1,KFLEV,KAER)) - DO JK=1,KAER - ZAER(:,:,JK) = TRANSPOSE( RESHAPE( ZWORK2AER(:,JK),(/KFLEV,ICLOUD_COL+1/) ) ) - END DO - DEALLOCATE (ZWORK1AER) - DEALLOCATE (ZWORK2AER) - ! - IF(CAOP=='EXPL')THEN - ALLOCATE(ZWORK1AER(ICLOUD,KSWB_OLD)) !New vector with value for all cld. points - ALLOCATE(ZWORK2AER(ICLOUD+KFLEV,KSWB_OLD)) !New vector with value for all cld.points + 1 clr column - !Single scattering albedo - DO WVL_IDX=1,KSWB_OLD - ZWORK1AER(:,WVL_IDX) = PACK( TRANSPOSE(ZPIZA_EQ(:,:,WVL_IDX)),MASK=GCLOUDT(:,:) ) - ZWORK2AER(1:ICLOUD,WVL_IDX) = ZWORK1AER(:,WVL_IDX) - ZWORK2AER(ICLOUD+1:,WVL_IDX) = ZPIZA_EQ_CLEAR(:,WVL_IDX) - ENDDO - DEALLOCATE(ZPIZA_EQ) - ALLOCATE(ZPIZA_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD)) - DO WVL_IDX=1,KSWB_OLD - ZPIZA_EQ(:,:,WVL_IDX) = TRANSPOSE( RESHAPE( ZWORK2AER(:,WVL_IDX),(/KFLEV,ICLOUD_COL+1/) ) ) - ENDDO - !Assymetry factor - DO WVL_IDX=1,KSWB_OLD - ZWORK1AER(:,WVL_IDX) = PACK(TRANSPOSE(ZCGA_EQ(:,:,WVL_IDX)), MASK=GCLOUDT(:,:)) - ZWORK2AER(1:ICLOUD,WVL_IDX) = ZWORK1AER(:,WVL_IDX) - ZWORK2AER(ICLOUD+1:,WVL_IDX) = ZCGA_EQ_CLEAR(:,WVL_IDX) - ENDDO - DEALLOCATE(ZCGA_EQ) - ALLOCATE(ZCGA_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD)) - DO WVL_IDX=1,KSWB_OLD - ZCGA_EQ(:,:,WVL_IDX) = TRANSPOSE(RESHAPE(ZWORK2AER(:,WVL_IDX),(/KFLEV,ICLOUD_COL+1/))) - ENDDO - !Relative wavelength-distributed optical depth - DO WVL_IDX=1,KSWB_OLD - ZWORK1AER(:,WVL_IDX) = PACK(TRANSPOSE(ZTAUREL_EQ(:,:,WVL_IDX)), MASK=GCLOUDT(:,:)) - ZWORK2AER(1:ICLOUD,WVL_IDX) = ZWORK1AER(:,WVL_IDX) - ZWORK2AER(ICLOUD+1:,WVL_IDX) = ZTAUREL_EQ_CLEAR(:,WVL_IDX) - ENDDO - DEALLOCATE(ZTAUREL_EQ) - ALLOCATE(ZTAUREL_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD)) - DO WVL_IDX=1,KSWB_OLD - ZTAUREL_EQ(:,:,WVL_IDX) = TRANSPOSE(RESHAPE(ZWORK2AER(:,WVL_IDX),(/KFLEV,ICLOUD_COL+1/))) - ENDDO - DEALLOCATE(ZWORK1AER) - DEALLOCATE(ZWORK2AER) - ELSE - DEALLOCATE(ZPIZA_EQ) - ALLOCATE(ZPIZA_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD)) - DEALLOCATE(ZCGA_EQ) - ALLOCATE(ZCGA_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD)) - DEALLOCATE(ZTAUREL_EQ) - ALLOCATE(ZTAUREL_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD)) - ENDIF !Check on LDUST - - ! half-level variables - ! - ZWORK1(:) = PACK( TRANSPOSE(ZPRES_HL(:,1:KFLEV)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= ZHP_CLEAR(1:) ! and the single clear_sky one - DEALLOCATE(ZPRES_HL) - ALLOCATE(ZPRES_HL(ICLOUD_COL+1,KFLEV+1)) - ZPRES_HL(:,1:KFLEV) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ZPRES_HL(:,KFLEV+1) = PSTATM(IKSTAE,2)*100.0 - ! - ZWORK1(:) = PACK( TRANSPOSE(ZT_HL(:,1:KFLEV)),MASK=GCLOUDT(:,:) ) - ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns - ZWORK2(ICLOUD+1:)= ZHT_CLEAR(1:) ! and the single clear_sky one - DEALLOCATE(ZT_HL) - ALLOCATE(ZT_HL(ICLOUD_COL+1,KFLEV+1)) - ZT_HL(:,1:KFLEV) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) ) - ZT_HL(:,KFLEV+1) = PSTATM(IKSTAE,3) - ! - ! surface fields - ! - ALLOCATE(ZWORK3(ICLOUD_COL)) - ALLOCATE(ZWORK4(ICLOUD_COL,KSWB_MNH)) - ALLOCATE(ZWORK(KDLON)) - DO JALBS=1,KSWB_MNH - ZWORK(:) = ZALBP(:,JALBS) - ZWORK3(:) = PACK( ZWORK(:),MASK=.NOT.GCLEAR_2D(:) ) - ZWORK4(:,JALBS) = ZWORK3(:) - END DO - DEALLOCATE(ZALBP) - ALLOCATE(ZALBP(ICLOUD_COL+1,KSWB_MNH)) - ZALBP(1:ICLOUD_COL,:) = ZWORK4(1:ICLOUD_COL,:) - ZALBP(ICLOUD_COL+1,:) = ZALBP_CLEAR(:) - ! - DO JALBS=1,KSWB_MNH - ZWORK(:) = ZALBD(:,JALBS) - ZWORK3(:) = PACK( ZWORK(:),MASK=.NOT.GCLEAR_2D(:) ) - ZWORK4(:,JALBS) = ZWORK3(:) - END DO - DEALLOCATE(ZALBD) - ALLOCATE(ZALBD(ICLOUD_COL+1,KSWB_MNH)) - ZALBD(1:ICLOUD_COL,:) = ZWORK4(1:ICLOUD_COL,:) - ZALBD(ICLOUD_COL+1,:) = ZALBD_CLEAR(:) - ! - DEALLOCATE(ZWORK4) - ! - ZWORK3(:) = PACK( ZEMIS(:,1),MASK=.NOT.GCLEAR_2D(:) ) - DEALLOCATE(ZEMIS) - ALLOCATE(ZEMIS(ICLOUD_COL+1,1)) - ZEMIS(1:ICLOUD_COL,1) = ZWORK3(1:ICLOUD_COL) - ZEMIS(ICLOUD_COL+1,1) = ZEMIS_CLEAR - ! - ! - ZWORK3(:) = PACK( ZEMIW(:,1),MASK=.NOT.GCLEAR_2D(:) ) - DEALLOCATE(ZEMIW) - ALLOCATE(ZEMIW(ICLOUD_COL+1,1)) - ZEMIW(1:ICLOUD_COL,1) = ZWORK3(1:ICLOUD_COL) - ZEMIW(ICLOUD_COL+1,1) = ZEMIW_CLEAR - ! - ! - ZWORK3(:) = PACK( ZRMU0(:),MASK=.NOT.GCLEAR_2D(:) ) - DEALLOCATE(ZRMU0) - ALLOCATE(ZRMU0(ICLOUD_COL+1)) - ZRMU0(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL) - ZRMU0(ICLOUD_COL+1) = ZRMU0_CLEAR - ! - ZWORK3(:) = PACK( ZLSM(:),MASK=.NOT.GCLEAR_2D(:) ) - DEALLOCATE(ZLSM) - ALLOCATE(ZLSM(ICLOUD_COL+1)) - ZLSM(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL) - ZLSM (ICLOUD_COL+1)= ZLSM_CLEAR - ! - ZWORK3(:) = PACK( ZLAT(:),MASK=.NOT.GCLEAR_2D(:) ) - DEALLOCATE(ZLAT) - ALLOCATE(ZLAT(ICLOUD_COL+1)) - ZLAT(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL) - ZLAT (ICLOUD_COL+1)= ZLAT_CLEAR - ! - ZWORK3(:) = PACK( ZLON(:),MASK=.NOT.GCLEAR_2D(:) ) - DEALLOCATE(ZLON) - ALLOCATE(ZLON(ICLOUD_COL+1)) - ZLON(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL) - ZLON (ICLOUD_COL+1)= ZLON_CLEAR - ! - ZWORK3(:) = PACK( ZTS(:),MASK=.NOT.GCLEAR_2D(:) ) - DEALLOCATE(ZTS) - ALLOCATE(ZTS(ICLOUD_COL+1)) - ZTS(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL) - ZTS(ICLOUD_COL+1) = ZTS_CLEAR - ! - DEALLOCATE(ZWORK1) - DEALLOCATE(ZWORK2) - DEALLOCATE(ZWORK3) - DEALLOCATE(ZWORK) - ! - IDIM = ICLOUD_COL +1 ! Number of columns where RT is computed -! -ELSE - ! - !* 5.3 RADIATION COMPUTATIONS FOR THE FULL COLUMN NUMBER (KDLON) - ! - IDIM = KDLON -END IF -! -! initialisation of cloud trace for the next radiation time step -! (if unchanged columns are not recomputed) -WHERE ( ZCLOUD(:) <= 0.0 ) - ICLEAR_2D_TM1(:) = 1 -ELSEWHERE - ICLEAR_2D_TM1(:) = 0 -END WHERE -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - KCLEARCOL_TM1(JI,JJ) = ICLEAR_2D_TM1(IIJ) ! output to be saved for next time step - END DO -END DO -! -! -!* 5.4 VERTICAL grid modification(up-down) for compatibility with ECMWF -! radiation vertical grid. ALLOCATION of the outputs. -! -! -ALLOCATE (ZWORK_GRID(SIZE(ZPRES_HL,1),KFLEV+1)) -! -!half level pressure -ZWORK_GRID(:,:)=ZPRES_HL(:,:) -DO JKRAD=1, KFLEV+1 - JK1=(KFLEV+1)+1-JKRAD - ZPRES_HL(:,JKRAD) = ZWORK_GRID(:,JK1) -END DO -! -!half level temperature -ZWORK_GRID(:,:)=ZT_HL(:,:) -DO JKRAD=1, KFLEV+1 - JK1=(KFLEV+1)+1-JKRAD - ZT_HL(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -DEALLOCATE(ZWORK_GRID) -! -!mean layer variables -!------------------------------------- -ALLOCATE(ZWORK_GRID(SIZE(ZTAVE,1),KFLEV)) -! -!mean layer temperature -ZWORK_GRID(:,:)=ZTAVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZTAVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!mean layer pressure -ZWORK_GRID(:,:)=ZPAVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZPAVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!mean layer pressure thickness -ZWORK_GRID(:,:)=ZDPRES(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZDPRES(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!mesh size -ZWORK_GRID(:,:)=ZDZ(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZDZ(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO - -!mean layer cloud fraction -ZWORK_GRID(:,:)=ZCFAVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZCFAVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!mean layer water vapor mixing ratio -ZWORK_GRID(:,:)=ZQVAVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZQVAVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!ice -ZWORK_GRID(:,:)=ZQIAVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZQIAVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!liquid water -ZWORK_GRID(:,:)=ZQLAVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZQLAVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO - - -!rain water -ZWORK_GRID(:,:)=ZQRAVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZQRAVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!ice water content -ZWORK_GRID(:,:)=ZQIWC(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZQIWC(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!liquid water content -ZWORK_GRID(:,:)=ZQLWC(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZQLWC(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO - - -!rain water content -ZWORK_GRID(:,:)=ZQRWC(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZQRWC(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO - - -!C2R2 water particle concentration -! -IF (SIZE(ZCCT_C2R2) > 0) THEN - ZWORK_GRID(:,:)=ZCCT_C2R2(:,:) - DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZCCT_C2R2(:,JKRAD)=ZWORK_GRID(:,JK1) - END DO -END IF -IF (SIZE(ZCRT_C2R2) > 0) THEN - ZWORK_GRID(:,:)=ZCRT_C2R2(:,:) - DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZCRT_C2R2(:,JKRAD)=ZWORK_GRID(:,JK1) - END DO -END IF -IF (SIZE(ZCIT_C1R3) > 0) THEN - ZWORK_GRID(:,:)=ZCIT_C1R3(:,:) - DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZCIT_C1R3(:,JKRAD)=ZWORK_GRID(:,JK1) - END DO -END IF -! -!LIMA water particle concentration -! -IF( CCLOUD == 'LIMA' ) THEN - ZWORK_GRID(:,:)=ZCCT_LIMA(:,:) - DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZCCT_LIMA(:,JKRAD)=ZWORK_GRID(:,JK1) - END DO -! - ZWORK_GRID(:,:)=ZCRT_LIMA(:,:) - DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZCRT_LIMA(:,JKRAD)=ZWORK_GRID(:,JK1) - END DO -! - ZWORK_GRID(:,:)=ZCIT_LIMA(:,:) - DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZCIT_LIMA(:,JKRAD)=ZWORK_GRID(:,JK1) - END DO -END IF -! -!ozone content -ZWORK_GRID(:,:)=ZO3AVE(:,:) -DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZO3AVE(:,JKRAD)=ZWORK_GRID(:,JK1) -END DO -! -!aerosol optical depth -DO JI=1,KAER - ZWORK_GRID(:,:)=ZAER(:,:,JI) - DO JKRAD=1, KFLEV - JK1=KFLEV+1-JKRAD - ZAER(:,JKRAD,JI)=ZWORK_GRID(:,JK1) - END DO -END DO -IF (CAOP=='EXPL') THEN -!TURN MORE FIELDS UPSIDE DOWN... -!Dust single scattering albedo -DO JI=1,KSWB_OLD - ZWORK_GRID(:,:)=ZPIZA_EQ(:,:,JI) - DO JKRAD=1,KFLEV - JK1=KFLEV+1-JKRAD - ZPIZA_EQ(:,JKRAD,JI)=ZWORK_GRID(:,JK1) - ENDDO -ENDDO -!Dust asymmetry factor -DO JI=1,KSWB_OLD - ZWORK_GRID(:,:)=ZCGA_EQ(:,:,JI) - DO JKRAD=1,KFLEV - JK1=KFLEV+1-JKRAD - ZCGA_EQ(:,JKRAD,JI)=ZWORK_GRID(:,JK1) - ENDDO -ENDDO -DO JI=1,KSWB_OLD - ZWORK_GRID(:,:)=ZTAUREL_EQ(:,:,JI) - DO JKRAD=1,KFLEV - JK1=KFLEV+1-JKRAD - ZTAUREL_EQ(:,JKRAD,JI)=ZWORK_GRID(:,JK1) - ENDDO -ENDDO - -END IF - -! -DEALLOCATE(ZWORK_GRID) -! -!mean layer saturation specific humidity -! -ALLOCATE(ZQSAVE(SIZE(ZTAVE,1),SIZE(ZTAVE,2))) -! -WHERE (ZTAVE(:,:) > XTT) - ZQSAVE(:,:) = QSAT(ZTAVE, ZPAVE) -ELSEWHERE - ZQSAVE(:,:) = QSATI(ZTAVE, ZPAVE) -END WHERE -! -! allocations for the radiation code outputs -! -ALLOCATE(ZDTLW(IDIM,KFLEV)) -ALLOCATE(ZDTSW(IDIM,KFLEV)) -ALLOCATE(ZFLUX_TOP_GND_IRVISNIR(IDIM,KFLUX)) -ALLOCATE(ZSFSWDIR(IDIM,ISWB)) -ALLOCATE(ZSFSWDIF(IDIM,ISWB)) -ALLOCATE(ZDTLW_CS(IDIM,KFLEV)) -ALLOCATE(ZDTSW_CS(IDIM,KFLEV)) -ALLOCATE(ZFLUX_TOP_GND_IRVISNIR_CS(IDIM,KFLUX)) -! -! -ALLOCATE(ZFLUX_LW(IDIM,2,KFLEV+1)) -ALLOCATE(ZFLUX_SW_DOWN(IDIM,KFLEV+1)) -ALLOCATE(ZFLUX_SW_UP(IDIM,KFLEV+1)) -ALLOCATE(ZRADLP(IDIM,KFLEV)) -IF( KRAD_DIAG >= 1) THEN - ALLOCATE(ZNFLW(IDIM,KFLEV+1)) - ALLOCATE(ZNFSW(IDIM,KFLEV+1)) -ELSE - ALLOCATE(ZNFLW(0,0)) - ALLOCATE(ZNFSW(0,0)) -END IF -! -IF( KRAD_DIAG >= 2) THEN - ALLOCATE(ZFLUX_SW_DOWN_CS(IDIM,KFLEV+1)) - ALLOCATE(ZFLUX_SW_UP_CS(IDIM,KFLEV+1)) - ALLOCATE(ZFLUX_LW_CS(IDIM,2,KFLEV+1)) - ALLOCATE(ZNFLW_CS(IDIM,KFLEV+1)) - ALLOCATE(ZNFSW_CS(IDIM,KFLEV+1)) -ELSE - ALLOCATE(ZFLUX_SW_DOWN_CS(0,0)) - ALLOCATE(ZFLUX_SW_UP_CS(0,0)) - ALLOCATE(ZFLUX_LW_CS(0,0,0)) - ALLOCATE(ZNFSW_CS(0,0)) - ALLOCATE(ZNFLW_CS(0,0)) -END IF -! -IF( KRAD_DIAG >= 3) THEN - ALLOCATE(ZPLAN_ALB_VIS(IDIM)) - ALLOCATE(ZPLAN_ALB_NIR(IDIM)) - ALLOCATE(ZPLAN_TRA_VIS(IDIM)) - ALLOCATE(ZPLAN_TRA_NIR(IDIM)) - ALLOCATE(ZPLAN_ABS_VIS(IDIM)) - ALLOCATE(ZPLAN_ABS_NIR(IDIM)) -ELSE - ALLOCATE(ZPLAN_ALB_VIS(0)) - ALLOCATE(ZPLAN_ALB_NIR(0)) - ALLOCATE(ZPLAN_TRA_VIS(0)) - ALLOCATE(ZPLAN_TRA_NIR(0)) - ALLOCATE(ZPLAN_ABS_VIS(0)) - ALLOCATE(ZPLAN_ABS_NIR(0)) -END IF -! -IF( KRAD_DIAG >= 4) THEN - ALLOCATE(ZEFCL_RRTM(IDIM,KFLEV)) - ALLOCATE(ZCLSW_TOTAL(IDIM,KFLEV)) - ALLOCATE(ZTAU_TOTAL(IDIM,KSWB_OLD,KFLEV)) - ALLOCATE(ZOMEGA_TOTAL(IDIM,KSWB_OLD,KFLEV)) - ALLOCATE(ZCG_TOTAL(IDIM,KSWB_OLD,KFLEV)) - ALLOCATE(ZEFCL_LWD(IDIM,KFLEV)) - ALLOCATE(ZEFCL_LWU(IDIM,KFLEV)) - ALLOCATE(ZFLWP(IDIM,KFLEV)) - ALLOCATE(ZFIWP(IDIM,KFLEV)) - ALLOCATE(ZRADIP(IDIM,KFLEV)) -ELSE - ALLOCATE(ZEFCL_RRTM(0,0)) - ALLOCATE(ZCLSW_TOTAL(0,0)) - ALLOCATE(ZTAU_TOTAL(0,0,0)) - ALLOCATE(ZOMEGA_TOTAL(0,0,0)) - ALLOCATE(ZCG_TOTAL(0,0,0)) - ALLOCATE(ZEFCL_LWD(0,0)) - ALLOCATE(ZEFCL_LWU(0,0)) - ALLOCATE(ZFLWP(0,0)) - ALLOCATE(ZFIWP(0,0)) - ALLOCATE(ZRADIP(0,0)) -END IF -! -!* 5.6 CALLS THE ECMWF_RADIATION ROUTINES -! -! mixing ratio -> specific humidity conversion (for ECMWF routine) -! mixing ratio = mv/md ; specific humidity = mv/(mv+md) - -ZQVAVE(:,:) = ZQVAVE(:,:) / (1.+ZQVAVE(:,:)) ! Because -! ZAER = 1e-5*ZAER -! ZO3AVE = 1e-5*ZO3AVE! -IF( IDIM <= KRAD_COLNBR ) THEN -! -! there is less than KRAD_COLNBR columns to be considered therefore -! no split of the arrays is performed -! Note that radiation scheme only takes scalar emissivities so only fist value of the spectral emissivity is taken - ALLOCATE(ZTAVE_RAD(SIZE(ZTAVE,1),SIZE(ZTAVE,2))) - ALLOCATE(ZPAVE_RAD(SIZE(ZPAVE,1),SIZE(ZPAVE,2))) - ZTAVE_RAD = ZTAVE - ZPAVE_RAD = ZPAVE - IF (CCLOUD == 'LIMA') THEN - IF (CRAD == "ECMW") THEN - CALL ECMWF_RADIATION_VERS2 ( IDIM ,KFLEV, KRAD_DIAG, KAER, & - ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER , ZALBD, ZALBP, ZPRES_HL, ZPAVE_RAD, & - PCCO2, ZCFAVE, ZDPRES, ZEMIS(:,1), ZEMIW(:,1), ZLSM, ZRMU0, & - ZO3AVE , ZQVAVE, ZQIAVE ,ZQIWC,ZQLAVE,ZQLWC, ZQSAVE, ZQRAVE, ZQRWC, & - ZT_HL,ZTAVE_RAD, ZTS, ZCCT_LIMA, ZCRT_LIMA, ZCIT_LIMA, & - ZNFLW_CS, ZNFLW, ZNFSW_CS,ZNFSW, & - ZDTLW, ZDTSW, ZFLUX_TOP_GND_IRVISNIR, & - ZSFSWDIR, ZSFSWDIF, & - ZFLUX_SW_DOWN, ZFLUX_SW_UP, ZFLUX_LW , & - ZDTLW_CS, ZDTSW_CS, ZFLUX_TOP_GND_IRVISNIR_CS, & - ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS, ZFLUX_LW_CS, & - ZPLAN_ALB_VIS,ZPLAN_ALB_NIR, ZPLAN_TRA_VIS, ZPLAN_TRA_NIR, & - ZPLAN_ABS_VIS, ZPLAN_ABS_NIR,ZEFCL_LWD, ZEFCL_LWU, & - ZFLWP, ZFIWP,ZRADLP, ZRADIP,ZEFCL_RRTM, ZCLSW_TOTAL, ZTAU_TOTAL, & - ZOMEGA_TOTAL,ZCG_TOTAL, & - GAOP, ZPIZA_EQ,ZCGA_EQ,ZTAUREL_EQ ) - - - ELSE IF (CRAD == "ECRA") THEN - CALL ECRAD_INTERFACE ( IDIM ,KFLEV, KRAD_DIAG, KAER, & - ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER , ZALBD, ZALBP, ZPRES_HL, ZPAVE_RAD, & - PCCO2, ZCFAVE, ZDPRES, ZEMIS(:,1), ZEMIW(:,1), ZLSM, ZRMU0, & - ZO3AVE , ZQVAVE, ZQIAVE ,ZQIWC,ZQLAVE,ZQLWC, ZQSAVE, ZQRAVE, ZQRWC, & - ZT_HL,ZTAVE_RAD, ZTS, ZCCT_LIMA, ZCRT_LIMA, ZCIT_LIMA, & - ZNFLW, ZNFSW, ZNFLW_CS, ZNFSW_CS, & - ZDTLW, ZDTSW, ZFLUX_TOP_GND_IRVISNIR, & - ZSFSWDIR, ZSFSWDIF, & - ZFLUX_SW_DOWN, ZFLUX_SW_UP, ZFLUX_LW , & - ZDTLW_CS, ZDTSW_CS, ZFLUX_TOP_GND_IRVISNIR_CS, & - ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS, ZFLUX_LW_CS, & - ZPLAN_ALB_VIS,ZPLAN_ALB_NIR, ZPLAN_TRA_VIS, ZPLAN_TRA_NIR, & - ZPLAN_ABS_VIS, ZPLAN_ABS_NIR,ZEFCL_LWD, ZEFCL_LWU, & - ZFLWP, ZFIWP,ZRADLP, ZRADIP,ZEFCL_RRTM, ZCLSW_TOTAL, ZTAU_TOTAL, & - ZOMEGA_TOTAL,ZCG_TOTAL, & - GAOP, ZPIZA_EQ,ZCGA_EQ,ZTAUREL_EQ,ZLAT,ZLON ) - ENDIF - - ELSE - IF (CRAD == "ECMW") THEN - CALL ECMWF_RADIATION_VERS2 ( IDIM ,KFLEV, KRAD_DIAG, KAER, & - ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER , ZALBD, ZALBP, ZPRES_HL, ZPAVE_RAD, & - PCCO2, ZCFAVE, ZDPRES, ZEMIS(:,1), ZEMIW(:,1), ZLSM, ZRMU0, & - ZO3AVE , ZQVAVE, ZQIAVE ,ZQIWC,ZQLAVE,ZQLWC, ZQSAVE, ZQRAVE, ZQRWC, & - ZT_HL,ZTAVE_RAD, ZTS, ZCCT_C2R2, ZCRT_C2R2, ZCIT_C1R3, & - ZNFLW_CS, ZNFLW, ZNFSW_CS,ZNFSW, & - ZDTLW, ZDTSW, ZFLUX_TOP_GND_IRVISNIR, & - ZSFSWDIR, ZSFSWDIF, & - ZFLUX_SW_DOWN, ZFLUX_SW_UP, ZFLUX_LW , & - ZDTLW_CS, ZDTSW_CS, ZFLUX_TOP_GND_IRVISNIR_CS, & - ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS, ZFLUX_LW_CS, & - ZPLAN_ALB_VIS,ZPLAN_ALB_NIR, ZPLAN_TRA_VIS, ZPLAN_TRA_NIR, & - ZPLAN_ABS_VIS, ZPLAN_ABS_NIR,ZEFCL_LWD, ZEFCL_LWU, & - ZFLWP, ZFIWP,ZRADLP, ZRADIP,ZEFCL_RRTM, ZCLSW_TOTAL, ZTAU_TOTAL, & - ZOMEGA_TOTAL,ZCG_TOTAL, & - GAOP, ZPIZA_EQ,ZCGA_EQ,ZTAUREL_EQ ) - - ELSE IF (CRAD == "ECRA") THEN - CALL ECRAD_INTERFACE ( IDIM ,KFLEV, KRAD_DIAG, KAER, & - ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER , ZALBD, ZALBP, ZPRES_HL, ZPAVE_RAD, & - PCCO2, ZCFAVE, ZDPRES, ZEMIS(:,1), ZEMIW(:,1), ZLSM, ZRMU0, & - ZO3AVE , ZQVAVE, ZQIAVE ,ZQIWC,ZQLAVE,ZQLWC, ZQSAVE, ZQRAVE, ZQRWC, & - ZT_HL,ZTAVE_RAD, ZTS, ZCCT_C2R2, ZCRT_C2R2, ZCIT_C1R3, & - ZNFLW, ZNFSW, ZNFLW_CS, ZNFSW_CS, & - ZDTLW, ZDTSW, ZFLUX_TOP_GND_IRVISNIR, & - ZSFSWDIR, ZSFSWDIF, & - ZFLUX_SW_DOWN, ZFLUX_SW_UP, ZFLUX_LW , & - ZDTLW_CS, ZDTSW_CS, ZFLUX_TOP_GND_IRVISNIR_CS, & - ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS, ZFLUX_LW_CS, & - ZPLAN_ALB_VIS,ZPLAN_ALB_NIR, ZPLAN_TRA_VIS, ZPLAN_TRA_NIR, & - ZPLAN_ABS_VIS, ZPLAN_ABS_NIR,ZEFCL_LWD, ZEFCL_LWU, & - ZFLWP, ZFIWP,ZRADLP, ZRADIP,ZEFCL_RRTM, ZCLSW_TOTAL, ZTAU_TOTAL, & - ZOMEGA_TOTAL,ZCG_TOTAL, & - GAOP, ZPIZA_EQ,ZCGA_EQ,ZTAUREL_EQ ,ZLAT,ZLON ) - END IF - - - END IF - DEALLOCATE(ZTAVE_RAD,ZPAVE_RAD) -! -ELSE -! -! the splitting of the arrays will be performed -! - INUM_CALL = CEILING( REAL( IDIM ) / REAL( KRAD_COLNBR ) ) - IDIM_RESIDUE = IDIM -! - DO JI_SPLIT = 1 , INUM_CALL - IDIM_EFF = MIN( IDIM_RESIDUE,KRAD_COLNBR ) - ! - IF( JI_SPLIT == 1 .OR. JI_SPLIT == INUM_CALL ) THEN - ALLOCATE( ZALBP_SPLIT(IDIM_EFF,KSWB_MNH)) - ALLOCATE( ZALBD_SPLIT(IDIM_EFF,KSWB_MNH)) - ALLOCATE( ZEMIS_SPLIT(IDIM_EFF)) - ALLOCATE( ZEMIW_SPLIT(IDIM_EFF)) - ALLOCATE( ZRMU0_SPLIT(IDIM_EFF)) - ALLOCATE( ZLAT_SPLIT(IDIM_EFF)) - ALLOCATE( ZLON_SPLIT(IDIM_EFF)) - ALLOCATE( ZCFAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZO3AVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZT_HL_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZPRES_HL_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZDZ_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZQLAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZQIAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZQRAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZQLWC_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZQIWC_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZQRWC_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZQVAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZTAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZPAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZAER_SPLIT( IDIM_EFF,KFLEV,KAER)) - ALLOCATE( ZPIZA_EQ_SPLIT(IDIM_EFF,KFLEV,KSWB_OLD)) - ALLOCATE( ZCGA_EQ_SPLIT(IDIM_EFF,KFLEV,KSWB_OLD)) - ALLOCATE( ZTAUREL_EQ_SPLIT(IDIM_EFF,KFLEV,KSWB_OLD)) - ALLOCATE( ZDPRES_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZLSM_SPLIT(IDIM_EFF)) - ALLOCATE( ZQSAVE_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZTS_SPLIT(IDIM_EFF)) - ! output pronostic - ALLOCATE( ZDTLW_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZDTSW_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZFLUX_TOP_GND_IRVISNIR_SPLIT(IDIM_EFF,KFLUX)) - ALLOCATE( ZSFSWDIR_SPLIT(IDIM_EFF,ISWB)) - ALLOCATE( ZSFSWDIF_SPLIT(IDIM_EFF,ISWB)) - ALLOCATE( ZDTLW_CS_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZDTSW_CS_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT(IDIM_EFF,KFLUX)) -! - ALLOCATE( ZFLUX_LW_SPLIT(IDIM_EFF,2,KFLEV+1)) - ALLOCATE( ZFLUX_SW_DOWN_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZFLUX_SW_UP_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZRADLP_SPLIT(IDIM_EFF,KFLEV)) - IF(KRAD_DIAG >=1) THEN - ALLOCATE( ZNFSW_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZNFLW_SPLIT(IDIM_EFF,KFLEV+1)) - ELSE - ALLOCATE( ZNFSW_SPLIT(0,0)) - ALLOCATE( ZNFLW_SPLIT(0,0)) - END IF -! - IF( KRAD_DIAG >= 2) THEN - ALLOCATE( ZFLUX_SW_DOWN_CS_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZFLUX_SW_UP_CS_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZFLUX_LW_CS_SPLIT(IDIM_EFF,2,KFLEV+1)) - ALLOCATE( ZNFSW_CS_SPLIT(IDIM_EFF,KFLEV+1)) - ALLOCATE( ZNFLW_CS_SPLIT(IDIM_EFF,KFLEV+1)) - ELSE - ALLOCATE( ZFLUX_SW_DOWN_CS_SPLIT(0,0)) - ALLOCATE( ZFLUX_SW_UP_CS_SPLIT(0,0)) - ALLOCATE( ZFLUX_LW_CS_SPLIT(0,0,0)) - ALLOCATE( ZNFSW_CS_SPLIT(0,0)) - ALLOCATE( ZNFLW_CS_SPLIT(0,0)) - END IF -! - IF( KRAD_DIAG >= 3) THEN - ALLOCATE( ZPLAN_ALB_VIS_SPLIT(IDIM_EFF)) - ALLOCATE( ZPLAN_ALB_NIR_SPLIT(IDIM_EFF)) - ALLOCATE( ZPLAN_TRA_VIS_SPLIT(IDIM_EFF)) - ALLOCATE( ZPLAN_TRA_NIR_SPLIT(IDIM_EFF)) - ALLOCATE( ZPLAN_ABS_VIS_SPLIT(IDIM_EFF)) - ALLOCATE( ZPLAN_ABS_NIR_SPLIT(IDIM_EFF)) - ELSE - ALLOCATE( ZPLAN_ALB_VIS_SPLIT(0)) - ALLOCATE( ZPLAN_ALB_NIR_SPLIT(0)) - ALLOCATE( ZPLAN_TRA_VIS_SPLIT(0)) - ALLOCATE( ZPLAN_TRA_NIR_SPLIT(0)) - ALLOCATE( ZPLAN_ABS_VIS_SPLIT(0)) - ALLOCATE( ZPLAN_ABS_NIR_SPLIT(0)) - END IF -! - IF( KRAD_DIAG >= 4) THEN - ALLOCATE( ZEFCL_RRTM_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZCLSW_TOTAL_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZTAU_TOTAL_SPLIT(IDIM_EFF,KSWB_OLD,KFLEV)) - ALLOCATE( ZOMEGA_TOTAL_SPLIT(IDIM_EFF,KSWB_OLD,KFLEV)) - ALLOCATE( ZCG_TOTAL_SPLIT(IDIM_EFF,KSWB_OLD,KFLEV)) - ALLOCATE( ZEFCL_LWD_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZEFCL_LWU_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZFLWP_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZFIWP_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE( ZRADIP_SPLIT(IDIM_EFF,KFLEV)) - ELSE - ALLOCATE( ZEFCL_RRTM_SPLIT(0,0)) - ALLOCATE( ZCLSW_TOTAL_SPLIT(0,0)) - ALLOCATE( ZTAU_TOTAL_SPLIT(0,0,0)) - ALLOCATE( ZOMEGA_TOTAL_SPLIT(0,0,0)) - ALLOCATE( ZCG_TOTAL_SPLIT(0,0,0)) - ALLOCATE( ZEFCL_LWD_SPLIT(0,0)) - ALLOCATE( ZEFCL_LWU_SPLIT(0,0)) - ALLOCATE( ZFLWP_SPLIT(0,0)) - ALLOCATE( ZFIWP_SPLIT(0,0)) - ALLOCATE( ZRADIP_SPLIT(0,0)) - END IF -! -! C2R2 coupling -! - IF (SIZE (ZCCT_C2R2) > 0) THEN - ALLOCATE (ZCCT_C2R2_SPLIT(IDIM_EFF,KFLEV)) - ELSE - ALLOCATE (ZCCT_C2R2_SPLIT(0,0)) - END IF -! - IF (SIZE (ZCRT_C2R2) > 0) THEN - ALLOCATE (ZCRT_C2R2_SPLIT(IDIM_EFF,KFLEV)) - ELSE - ALLOCATE (ZCRT_C2R2_SPLIT(0,0)) - END IF -! - IF (SIZE (ZCIT_C1R3) > 0) THEN - ALLOCATE (ZCIT_C1R3_SPLIT(IDIM_EFF,KFLEV)) - ELSE - ALLOCATE (ZCIT_C1R3_SPLIT(0,0)) - END IF -! -! LIMA coupling -! - IF( CCLOUD == 'LIMA' ) THEN - ALLOCATE (ZCCT_LIMA_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE (ZCRT_LIMA_SPLIT(IDIM_EFF,KFLEV)) - ALLOCATE (ZCIT_LIMA_SPLIT(IDIM_EFF,KFLEV)) - END IF - END IF -! -! fill the split arrays with their values taken from the full arrays -! - IBEG = IDIM-IDIM_RESIDUE+1 - IEND = IBEG+IDIM_EFF-1 -! - ZALBP_SPLIT(:,:) = ZALBP( IBEG:IEND ,:) - ZALBD_SPLIT(:,:) = ZALBD( IBEG:IEND ,:) - ZEMIS_SPLIT(:) = ZEMIS ( IBEG:IEND,1 ) - ZEMIW_SPLIT(:) = ZEMIW ( IBEG:IEND,1 ) - ZRMU0_SPLIT(:) = ZRMU0 ( IBEG:IEND ) - ZLAT_SPLIT(:) = ZLAT ( IBEG:IEND ) - ZLON_SPLIT(:) = ZLON ( IBEG:IEND ) - ZCFAVE_SPLIT(:,:) = ZCFAVE( IBEG:IEND ,:) - ZO3AVE_SPLIT(:,:) = ZO3AVE( IBEG:IEND ,:) - ZT_HL_SPLIT(:,:) = ZT_HL( IBEG:IEND ,:) - ZPRES_HL_SPLIT(:,:) = ZPRES_HL( IBEG:IEND ,:) - ZQLAVE_SPLIT(:,:) = ZQLAVE( IBEG:IEND , :) - ZDZ_SPLIT(:,:) = ZDZ( IBEG:IEND , :) - ZQIAVE_SPLIT(:,:) = ZQIAVE( IBEG:IEND ,:) - ZQRAVE_SPLIT (:,:) = ZQRAVE (IBEG:IEND ,:) - ZQLWC_SPLIT(:,:) = ZQLWC( IBEG:IEND , :) - ZQIWC_SPLIT(:,:) = ZQIWC( IBEG:IEND ,:) - ZQRWC_SPLIT(:,:) = ZQRWC (IBEG:IEND ,:) - ZQVAVE_SPLIT(:,:) = ZQVAVE( IBEG:IEND ,:) - ZTAVE_SPLIT(:,:) = ZTAVE ( IBEG:IEND ,:) - ZPAVE_SPLIT(:,:) = ZPAVE ( IBEG:IEND ,:) - ZAER_SPLIT (:,:,:) = ZAER ( IBEG:IEND ,:,:) - IF(CAOP=='EXPL')THEN - ZPIZA_EQ_SPLIT(:,:,:)=ZPIZA_EQ(IBEG:IEND,:,:) - ZCGA_EQ_SPLIT(:,:,:)=ZCGA_EQ(IBEG:IEND,:,:) - ZTAUREL_EQ_SPLIT(:,:,:)=ZTAUREL_EQ(IBEG:IEND,:,:) - ENDIF - ZDPRES_SPLIT(:,:) = ZDPRES (IBEG:IEND ,:) - ZLSM_SPLIT (:) = ZLSM (IBEG:IEND) - ZQSAVE_SPLIT (:,:) = ZQSAVE (IBEG:IEND ,:) - ZTS_SPLIT (:) = ZTS (IBEG:IEND) -! -! CALL the ECMWF radiation with the split array -! - IF (CCLOUD == 'LIMA') THEN -! LIMA concentrations - ZCCT_LIMA_SPLIT(:,:) = ZCCT_LIMA (IBEG:IEND ,:) - ZCRT_LIMA_SPLIT(:,:) = ZCRT_LIMA (IBEG:IEND ,:) - ZCIT_LIMA_SPLIT(:,:) = ZCIT_LIMA (IBEG:IEND ,:) - - IF (CRAD == "ECMW") THEN -! - CALL ECMWF_RADIATION_VERS2 ( IDIM_EFF , KFLEV, KRAD_DIAG, KAER, & - ZDZ_SPLIT,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER_SPLIT , ZALBD_SPLIT, ZALBP_SPLIT, ZPRES_HL_SPLIT, & - ZPAVE_SPLIT,PCCO2, ZCFAVE_SPLIT, ZDPRES_SPLIT, ZEMIS_SPLIT, ZEMIW_SPLIT, & - ZLSM_SPLIT, ZRMU0_SPLIT,ZO3AVE_SPLIT , ZQVAVE_SPLIT, ZQIAVE_SPLIT ,ZQIWC_SPLIT, & - ZQLAVE_SPLIT,ZQLWC_SPLIT,ZQSAVE_SPLIT, ZQRAVE_SPLIT,ZQRWC_SPLIT, ZT_HL_SPLIT, & - ZTAVE_SPLIT, ZTS_SPLIT, ZCCT_LIMA_SPLIT,ZCRT_LIMA_SPLIT,ZCIT_LIMA_SPLIT, & - ZNFLW_CS_SPLIT, ZNFLW_SPLIT, ZNFSW_CS_SPLIT,ZNFSW_SPLIT, & - ZDTLW_SPLIT, ZDTSW_SPLIT, ZFLUX_TOP_GND_IRVISNIR_SPLIT, & - ZSFSWDIR_SPLIT, ZSFSWDIF_SPLIT, & - ZFLUX_SW_DOWN_SPLIT, ZFLUX_SW_UP_SPLIT, ZFLUX_LW_SPLIT , & - ZDTLW_CS_SPLIT, ZDTSW_CS_SPLIT, ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT, & - ZFLUX_SW_DOWN_CS_SPLIT, ZFLUX_SW_UP_CS_SPLIT, ZFLUX_LW_CS_SPLIT, & - ZPLAN_ALB_VIS_SPLIT,ZPLAN_ALB_NIR_SPLIT, ZPLAN_TRA_VIS_SPLIT, & - ZPLAN_TRA_NIR_SPLIT, ZPLAN_ABS_VIS_SPLIT, ZPLAN_ABS_NIR_SPLIT, & - ZEFCL_LWD_SPLIT, ZEFCL_LWU_SPLIT, ZFLWP_SPLIT,ZFIWP_SPLIT, & - ZRADLP_SPLIT,ZRADIP_SPLIT,ZEFCL_RRTM_SPLIT, ZCLSW_TOTAL_SPLIT, & - ZTAU_TOTAL_SPLIT,ZOMEGA_TOTAL_SPLIT, ZCG_TOTAL_SPLIT, & - GAOP,ZPIZA_EQ_SPLIT,ZCGA_EQ_SPLIT,ZTAUREL_EQ_SPLIT ) - - ELSE IF (CRAD == "ECRA") THEN - CALL ECRAD_INTERFACE ( IDIM_EFF ,KFLEV, KRAD_DIAG, KAER, & - ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER_SPLIT , ZALBD_SPLIT, ZALBP_SPLIT, ZPRES_HL_SPLIT, ZPAVE_SPLIT, & - PCCO2, ZCFAVE_SPLIT, ZDPRES_SPLIT, ZEMIS_SPLIT, ZEMIW_SPLIT, ZLSM_SPLIT, ZRMU0_SPLIT, & - ZO3AVE_SPLIT , ZQVAVE_SPLIT, ZQIAVE_SPLIT ,ZQIWC_SPLIT,ZQLAVE_SPLIT,ZQLWC_SPLIT, & - ZQSAVE_SPLIT, ZQRAVE_SPLIT, ZQRWC_SPLIT, & - ZT_HL_SPLIT,ZTAVE_SPLIT, ZTS_SPLIT, ZCCT_LIMA_SPLIT, & - ZCRT_LIMA_SPLIT, ZCIT_LIMA_SPLIT, & - ZNFLW_SPLIT, ZNFSW_SPLIT, ZNFLW_CS_SPLIT, ZNFSW_CS_SPLIT, & - ZDTLW_SPLIT, ZDTSW_SPLIT, ZFLUX_TOP_GND_IRVISNIR_SPLIT, & - ZSFSWDIR_SPLIT, ZSFSWDIF_SPLIT, & - ZFLUX_SW_DOWN_SPLIT, ZFLUX_SW_UP_SPLIT, ZFLUX_LW_SPLIT , & - ZDTLW_CS_SPLIT, ZDTSW_CS_SPLIT, ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT, & - ZFLUX_SW_DOWN_CS_SPLIT, ZFLUX_SW_UP_CS_SPLIT, ZFLUX_LW_CS_SPLIT, & - ZPLAN_ALB_VIS_SPLIT,ZPLAN_ALB_NIR_SPLIT, ZPLAN_TRA_VIS_SPLIT, ZPLAN_TRA_NIR_SPLIT, & - ZPLAN_ABS_VIS_SPLIT, ZPLAN_ABS_NIR_SPLIT,ZEFCL_LWD_SPLIT, ZEFCL_LWU_SPLIT, & - ZFLWP_SPLIT, ZFIWP_SPLIT,ZRADLP_SPLIT, ZRADIP_SPLIT, & - ZEFCL_RRTM_SPLIT, ZCLSW_TOTAL_SPLIT, ZTAU_TOTAL_SPLIT, & - ZOMEGA_TOTAL_SPLIT,ZCG_TOTAL_SPLIT, & - GAOP, ZPIZA_EQ_SPLIT,ZCGA_EQ_SPLIT,ZTAUREL_EQ_SPLIT,ZLAT_SPLIT,ZLON_SPLIT ) - END IF - ELSE -! C2R2 concentrations - IF (SIZE (ZCCT_C2R2) > 0) ZCCT_C2R2_SPLIT(:,:) = ZCCT_C2R2 (IBEG:IEND ,:) - IF (SIZE (ZCRT_C2R2) > 0) ZCRT_C2R2_SPLIT(:,:) = ZCRT_C2R2 (IBEG:IEND ,:) - IF (SIZE (ZCIT_C1R3) > 0) ZCIT_C1R3_SPLIT(:,:) = ZCIT_C1R3 (IBEG:IEND ,:) - IF (CRAD == "ECMW") THEN - CALL ECMWF_RADIATION_VERS2 ( IDIM_EFF , KFLEV, KRAD_DIAG, KAER, & - ZDZ_SPLIT,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER_SPLIT , ZALBD_SPLIT, ZALBP_SPLIT, ZPRES_HL_SPLIT, & - ZPAVE_SPLIT,PCCO2, ZCFAVE_SPLIT, ZDPRES_SPLIT, ZEMIS_SPLIT, ZEMIW_SPLIT, & - ZLSM_SPLIT, ZRMU0_SPLIT,ZO3AVE_SPLIT , ZQVAVE_SPLIT, ZQIAVE_SPLIT ,ZQIWC_SPLIT, & - ZQLAVE_SPLIT,ZQLWC_SPLIT,ZQSAVE_SPLIT, ZQRAVE_SPLIT,ZQRWC_SPLIT, ZT_HL_SPLIT, & - ZTAVE_SPLIT, ZTS_SPLIT, ZCCT_C2R2_SPLIT,ZCRT_C2R2_SPLIT,ZCIT_C1R3_SPLIT, & - ZNFLW_CS_SPLIT, ZNFLW_SPLIT, ZNFSW_CS_SPLIT,ZNFSW_SPLIT, & - ZDTLW_SPLIT, ZDTSW_SPLIT, ZFLUX_TOP_GND_IRVISNIR_SPLIT, & - ZSFSWDIR_SPLIT, ZSFSWDIF_SPLIT, & - ZFLUX_SW_DOWN_SPLIT, ZFLUX_SW_UP_SPLIT, ZFLUX_LW_SPLIT , & - ZDTLW_CS_SPLIT, ZDTSW_CS_SPLIT, ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT, & - ZFLUX_SW_DOWN_CS_SPLIT, ZFLUX_SW_UP_CS_SPLIT, ZFLUX_LW_CS_SPLIT, & - ZPLAN_ALB_VIS_SPLIT,ZPLAN_ALB_NIR_SPLIT, ZPLAN_TRA_VIS_SPLIT, & - ZPLAN_TRA_NIR_SPLIT, ZPLAN_ABS_VIS_SPLIT, ZPLAN_ABS_NIR_SPLIT, & - ZEFCL_LWD_SPLIT, ZEFCL_LWU_SPLIT, ZFLWP_SPLIT,ZFIWP_SPLIT, & - ZRADLP_SPLIT,ZRADIP_SPLIT,ZEFCL_RRTM_SPLIT, ZCLSW_TOTAL_SPLIT, & - ZTAU_TOTAL_SPLIT,ZOMEGA_TOTAL_SPLIT, ZCG_TOTAL_SPLIT, & - GAOP,ZPIZA_EQ_SPLIT,ZCGA_EQ_SPLIT,ZTAUREL_EQ_SPLIT ) - - ELSE IF (CRAD == "ECRA") THEN - CALL ECRAD_INTERFACE ( IDIM_EFF ,KFLEV, KRAD_DIAG, KAER, & - ZDZ_SPLIT,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG, & - ZRII0, ZAER_SPLIT , ZALBD_SPLIT, ZALBP_SPLIT, ZPRES_HL_SPLIT, ZPAVE_SPLIT, & - PCCO2, ZCFAVE_SPLIT, ZDPRES_SPLIT, ZEMIS_SPLIT, ZEMIW_SPLIT, ZLSM_SPLIT, ZRMU0_SPLIT, & - ZO3AVE_SPLIT , ZQVAVE_SPLIT, ZQIAVE_SPLIT ,ZQIWC_SPLIT,ZQLAVE_SPLIT,ZQLWC_SPLIT, & - ZQSAVE_SPLIT, ZQRAVE_SPLIT, ZQRWC_SPLIT, & - ZT_HL_SPLIT,ZTAVE_SPLIT, ZTS_SPLIT, ZCCT_C2R2_SPLIT, & - ZCRT_C2R2_SPLIT, ZCIT_C1R3_SPLIT, & - ZNFLW_SPLIT, ZNFSW_SPLIT, ZNFLW_CS_SPLIT, ZNFSW_CS_SPLIT, & - ZDTLW_SPLIT, ZDTSW_SPLIT, ZFLUX_TOP_GND_IRVISNIR_SPLIT, & - ZSFSWDIR_SPLIT, ZSFSWDIF_SPLIT, & - ZFLUX_SW_DOWN_SPLIT, ZFLUX_SW_UP_SPLIT, ZFLUX_LW_SPLIT , & - ZDTLW_CS_SPLIT, ZDTSW_CS_SPLIT, ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT, & - ZFLUX_SW_DOWN_CS_SPLIT, ZFLUX_SW_UP_CS_SPLIT, ZFLUX_LW_CS_SPLIT, & - ZPLAN_ALB_VIS_SPLIT,ZPLAN_ALB_NIR_SPLIT, ZPLAN_TRA_VIS_SPLIT, ZPLAN_TRA_NIR_SPLIT, & - ZPLAN_ABS_VIS_SPLIT, ZPLAN_ABS_NIR_SPLIT,ZEFCL_LWD_SPLIT, ZEFCL_LWU_SPLIT, & - ZFLWP_SPLIT, ZFIWP_SPLIT,ZRADLP_SPLIT, ZRADIP_SPLIT, & - ZEFCL_RRTM_SPLIT, ZCLSW_TOTAL_SPLIT, ZTAU_TOTAL_SPLIT, & - ZOMEGA_TOTAL_SPLIT,ZCG_TOTAL_SPLIT, & - GAOP, ZPIZA_EQ_SPLIT,ZCGA_EQ_SPLIT,ZTAUREL_EQ_SPLIT,ZLAT_SPLIT,ZLON_SPLIT ) - END IF - END IF -! -! fill the full output arrays with the split arrays -! - ZDTLW( IBEG:IEND ,:) = ZDTLW_SPLIT(:,:) - ZDTSW( IBEG:IEND ,:) = ZDTSW_SPLIT(:,:) - ZFLUX_TOP_GND_IRVISNIR( IBEG:IEND ,:)= ZFLUX_TOP_GND_IRVISNIR_SPLIT(:,:) - ZSFSWDIR (IBEG:IEND,:) = ZSFSWDIR_SPLIT(:,:) - ZSFSWDIF (IBEG:IEND,:) = ZSFSWDIF_SPLIT(:,:) -! - ZDTLW_CS( IBEG:IEND ,:) = ZDTLW_CS_SPLIT(:,:) - ZDTSW_CS( IBEG:IEND ,:) = ZDTSW_CS_SPLIT(:,:) - ZFLUX_TOP_GND_IRVISNIR_CS( IBEG:IEND ,:) = & - ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT(:,:) - ZFLUX_LW( IBEG:IEND ,:,:) = ZFLUX_LW_SPLIT(:,:,:) - ZFLUX_SW_DOWN( IBEG:IEND ,:) = ZFLUX_SW_DOWN_SPLIT(:,:) - ZFLUX_SW_UP( IBEG:IEND ,:) = ZFLUX_SW_UP_SPLIT(:,:) - ZRADLP( IBEG:IEND ,:) = ZRADLP_SPLIT(:,:) - IF ( tpfile%lopened ) THEN - IF( KRAD_DIAG >= 1) THEN - ZNFLW(IBEG:IEND ,:)= ZNFLW_SPLIT(:,:) - ZNFSW(IBEG:IEND ,:)= ZNFSW_SPLIT(:,:) - IF( KRAD_DIAG >= 2) THEN - ZFLUX_SW_DOWN_CS( IBEG:IEND ,:) = ZFLUX_SW_DOWN_CS_SPLIT(:,:) - ZFLUX_SW_UP_CS( IBEG:IEND ,:) = ZFLUX_SW_UP_CS_SPLIT(:,:) - ZFLUX_LW_CS( IBEG:IEND ,:,:) = ZFLUX_LW_CS_SPLIT(:,:,:) - ZNFLW_CS(IBEG:IEND ,:)= ZNFLW_CS_SPLIT(:,:) - ZNFSW_CS(IBEG:IEND ,:)= ZNFSW_CS_SPLIT(:,:) - IF( KRAD_DIAG >= 3) THEN - ZPLAN_ALB_VIS( IBEG:IEND ) = ZPLAN_ALB_VIS_SPLIT(:) - ZPLAN_ALB_NIR( IBEG:IEND ) = ZPLAN_ALB_NIR_SPLIT(:) - ZPLAN_TRA_VIS( IBEG:IEND ) = ZPLAN_TRA_VIS_SPLIT(:) - ZPLAN_TRA_NIR( IBEG:IEND ) = ZPLAN_TRA_NIR_SPLIT(:) - ZPLAN_ABS_VIS( IBEG:IEND ) = ZPLAN_ABS_VIS_SPLIT(:) - ZPLAN_ABS_NIR( IBEG:IEND ) = ZPLAN_ABS_NIR_SPLIT(:) - IF( KRAD_DIAG >= 4) THEN - ZEFCL_LWD( IBEG:IEND ,:) = ZEFCL_LWD_SPLIT(:,:) - ZEFCL_LWU( IBEG:IEND ,:) = ZEFCL_LWU_SPLIT(:,:) - ZFLWP( IBEG:IEND ,:) = ZFLWP_SPLIT(:,:) - ZFIWP( IBEG:IEND ,:) = ZFIWP_SPLIT(:,:) - ZRADIP( IBEG:IEND ,:) = ZRADIP_SPLIT(:,:) - ZEFCL_RRTM( IBEG:IEND ,:) = ZEFCL_RRTM_SPLIT(:,:) - ZCLSW_TOTAL( IBEG:IEND ,:) = ZCLSW_TOTAL_SPLIT(:,:) - ZTAU_TOTAL( IBEG:IEND ,:,:) = ZTAU_TOTAL_SPLIT(:,:,:) - ZOMEGA_TOTAL( IBEG:IEND ,:,:)= ZOMEGA_TOTAL_SPLIT(:,:,:) - ZCG_TOTAL( IBEG:IEND ,:,:) = ZCG_TOTAL_SPLIT(:,:,:) - END IF - END IF - END IF - END IF - END IF -! - IDIM_RESIDUE = IDIM_RESIDUE - IDIM_EFF -! -! desallocation of the split arrays -! - IF( JI_SPLIT >= INUM_CALL-1 ) THEN - DEALLOCATE( ZALBP_SPLIT ) - DEALLOCATE( ZALBD_SPLIT ) - DEALLOCATE( ZEMIS_SPLIT ) - DEALLOCATE( ZEMIW_SPLIT ) - DEALLOCATE( ZLAT_SPLIT ) - DEALLOCATE( ZLON_SPLIT ) - DEALLOCATE( ZRMU0_SPLIT ) - DEALLOCATE( ZCFAVE_SPLIT ) - DEALLOCATE( ZO3AVE_SPLIT ) - DEALLOCATE( ZT_HL_SPLIT ) - DEALLOCATE( ZPRES_HL_SPLIT ) - DEALLOCATE( ZDZ_SPLIT ) - DEALLOCATE( ZQLAVE_SPLIT ) - DEALLOCATE( ZQIAVE_SPLIT ) - DEALLOCATE( ZQVAVE_SPLIT ) - DEALLOCATE( ZTAVE_SPLIT ) - DEALLOCATE( ZPAVE_SPLIT ) - DEALLOCATE( ZAER_SPLIT ) - DEALLOCATE( ZDPRES_SPLIT ) - DEALLOCATE( ZLSM_SPLIT ) - DEALLOCATE( ZQSAVE_SPLIT ) - DEALLOCATE( ZQRAVE_SPLIT ) - DEALLOCATE( ZQLWC_SPLIT ) - DEALLOCATE( ZQRWC_SPLIT ) - DEALLOCATE( ZQIWC_SPLIT ) - IF ( ALLOCATED( ZCCT_C2R2_SPLIT ) ) DEALLOCATE( ZCCT_C2R2_SPLIT ) - IF ( ALLOCATED( ZCRT_C2R2_SPLIT ) ) DEALLOCATE( ZCRT_C2R2_SPLIT ) - IF ( ALLOCATED( ZCIT_C1R3_SPLIT ) ) DEALLOCATE( ZCIT_C1R3_SPLIT ) - IF ( ALLOCATED( ZCCT_LIMA_SPLIT ) ) DEALLOCATE( ZCCT_LIMA_SPLIT ) - IF ( ALLOCATED( ZCRT_LIMA_SPLIT ) ) DEALLOCATE( ZCRT_LIMA_SPLIT ) - IF ( ALLOCATED( ZCIT_LIMA_SPLIT ) ) DEALLOCATE( ZCIT_LIMA_SPLIT ) - DEALLOCATE( ZTS_SPLIT ) - DEALLOCATE( ZNFLW_CS_SPLIT) - DEALLOCATE( ZNFLW_SPLIT) - DEALLOCATE( ZNFSW_CS_SPLIT) - DEALLOCATE( ZNFSW_SPLIT) - DEALLOCATE(ZDTLW_SPLIT) - DEALLOCATE(ZDTSW_SPLIT) - DEALLOCATE(ZFLUX_TOP_GND_IRVISNIR_SPLIT) - DEALLOCATE(ZSFSWDIR_SPLIT) - DEALLOCATE(ZSFSWDIF_SPLIT) - DEALLOCATE(ZFLUX_SW_DOWN_SPLIT) - DEALLOCATE(ZFLUX_SW_UP_SPLIT) - DEALLOCATE(ZFLUX_LW_SPLIT) - DEALLOCATE(ZDTLW_CS_SPLIT) - DEALLOCATE(ZDTSW_CS_SPLIT) - DEALLOCATE(ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT) - DEALLOCATE(ZPLAN_ALB_VIS_SPLIT) - DEALLOCATE(ZPLAN_ALB_NIR_SPLIT) - DEALLOCATE(ZPLAN_TRA_VIS_SPLIT) - DEALLOCATE(ZPLAN_TRA_NIR_SPLIT) - DEALLOCATE(ZPLAN_ABS_VIS_SPLIT) - DEALLOCATE(ZPLAN_ABS_NIR_SPLIT) - DEALLOCATE(ZEFCL_LWD_SPLIT) - DEALLOCATE(ZEFCL_LWU_SPLIT) - DEALLOCATE(ZFLWP_SPLIT) - DEALLOCATE(ZRADLP_SPLIT) - DEALLOCATE(ZRADIP_SPLIT) - DEALLOCATE(ZFIWP_SPLIT) - DEALLOCATE(ZEFCL_RRTM_SPLIT) - DEALLOCATE(ZCLSW_TOTAL_SPLIT) - DEALLOCATE(ZTAU_TOTAL_SPLIT) - DEALLOCATE(ZOMEGA_TOTAL_SPLIT) - DEALLOCATE(ZCG_TOTAL_SPLIT) - DEALLOCATE(ZFLUX_SW_DOWN_CS_SPLIT) - DEALLOCATE(ZFLUX_SW_UP_CS_SPLIT) - DEALLOCATE(ZFLUX_LW_CS_SPLIT) - DEALLOCATE(ZPIZA_EQ_SPLIT) - DEALLOCATE(ZCGA_EQ_SPLIT) - DEALLOCATE(ZTAUREL_EQ_SPLIT) - END IF - END DO -END IF - -! -DEALLOCATE(ZTAVE) -DEALLOCATE(ZPAVE) -DEALLOCATE(ZQVAVE) -DEALLOCATE(ZQLAVE) -DEALLOCATE(ZDZ) -DEALLOCATE(ZQIAVE) -DEALLOCATE(ZCFAVE) -DEALLOCATE(ZPRES_HL) -DEALLOCATE(ZT_HL) -DEALLOCATE(ZRMU0) -DEALLOCATE(ZLSM) -DEALLOCATE(ZQSAVE) -DEALLOCATE(ZAER) -DEALLOCATE(ZPIZA_EQ) -DEALLOCATE(ZCGA_EQ) -DEALLOCATE(ZTAUREL_EQ) -DEALLOCATE(ZDPRES) -DEALLOCATE(ZCCT_C2R2) -DEALLOCATE(ZCRT_C2R2) -DEALLOCATE(ZCIT_C1R3) -DEALLOCATE(ZLAT) -DEALLOCATE(ZLON) -IF (CCLOUD == 'LIMA') THEN - DEALLOCATE(ZCCT_LIMA) - DEALLOCATE(ZCRT_LIMA) - DEALLOCATE(ZCIT_LIMA) -END IF -! -DEALLOCATE(ZTS) -DEALLOCATE(ZALBP) -DEALLOCATE(ZALBD) -DEALLOCATE(ZEMIS) -DEALLOCATE(ZEMIW) -DEALLOCATE(ZQRAVE) -DEALLOCATE(ZQLWC) -DEALLOCATE(ZQIWC) -DEALLOCATE(ZQRWC) -DEALLOCATE(ICLEAR_2D_TM1) -! -!* 5.6 UNCOMPRESSES THE OUTPUT FIELD IN CASE OF -! CLEAR-SKY APPROXIMATION -! -IF(OCLEAR_SKY .OR. OCLOUD_ONLY) THEN - ALLOCATE(ZWORK1(ICLOUD)) - ALLOCATE(ZWORK2(ICLOUD+KFLEV)) ! allocation for the KFLEV levels of - ALLOCATE(ZWORK4(KFLEV,KDLON)) - ZWORK2(:) = PACK( TRANSPOSE(ZDTLW(:,:)),MASK=.TRUE. ) -! - DO JK=1,KFLEV - ZWORK4(JK,:) = ZWORK2(ICLOUD+JK) - END DO - ZWORK1(1:ICLOUD) = ZWORK2(1:ICLOUD) - ZZDTLW(:,:) = TRANSPOSE( UNPACK( ZWORK1(:),MASK=GCLOUDT(:,:) & - ,FIELD=ZWORK4(:,:) ) ) - ! - ZWORK2(:) = PACK( TRANSPOSE(ZDTSW(:,:)),MASK=.TRUE. ) - DO JK=1,KFLEV - ZWORK4(JK,:) = ZWORK2(ICLOUD+JK) - END DO - ZWORK1(1:ICLOUD) = ZWORK2(1:ICLOUD) - ZZDTSW(:,:) = TRANSPOSE( UNPACK( ZWORK1(:),MASK=GCLOUDT(:,:) & - ,FIELD=ZWORK4(:,:) ) ) - ! - DEALLOCATE(ZWORK1) - DEALLOCATE(ZWORK2) - DEALLOCATE(ZWORK4) - ! - ZZTGVISC = ZFLUX_TOP_GND_IRVISNIR(ICLOUD_COL+1,5) - ! - ZZTGVIS(:) = UNPACK( ZFLUX_TOP_GND_IRVISNIR(:,5),MASK=.NOT.GCLEAR_2D(:), & - FIELD=ZZTGVISC ) - ZZTGNIRC = ZFLUX_TOP_GND_IRVISNIR(ICLOUD_COL+1,6) - ! - ZZTGNIR(:) = UNPACK( ZFLUX_TOP_GND_IRVISNIR(:,6),MASK=.NOT.GCLEAR_2D(:), & - FIELD=ZZTGNIRC ) - ZZTGIRC = ZFLUX_TOP_GND_IRVISNIR(ICLOUD_COL+1,4) - ! - ZZTGIR (:) = UNPACK( ZFLUX_TOP_GND_IRVISNIR(:,4),MASK=.NOT.GCLEAR_2D(:), & - FIELD=ZZTGIRC ) - ! - DO JSWB=1,ISWB - ZZSFSWDIRC(JSWB) = ZSFSWDIR (ICLOUD_COL+1,JSWB) - ! - ZZSFSWDIR(:,JSWB) = UNPACK(ZSFSWDIR (:,JSWB),MASK=.NOT.GCLEAR_2D(:), & - FIELD= ZZSFSWDIRC(JSWB) ) - ! - ZZSFSWDIFC(JSWB) = ZSFSWDIF (ICLOUD_COL+1,JSWB) - ! - ZZSFSWDIF(:,JSWB) = UNPACK(ZSFSWDIF (:,JSWB),MASK=.NOT.GCLEAR_2D(:), & - FIELD= ZZSFSWDIFC(JSWB) ) - END DO -! -! No cloud case -! - IF( GNOCL ) THEN - IF (SIZE(ZZDTLW,1)>1) THEN - ZZDTLW(1,:)= ZZDTLW(2,:) - ENDIF - IF (SIZE(ZZDTSW,1)>1) THEN - ZZDTSW(1,:)= ZZDTSW(2,:) - ENDIF - ZZTGVIS(1) = ZZTGVISC - ZZTGNIR(1) = ZZTGNIRC - ZZTGIR(1) = ZZTGIRC - ZZSFSWDIR(1,:) = ZZSFSWDIRC(:) - ZZSFSWDIF(1,:) = ZZSFSWDIFC(:) - END IF -ELSE - ZZDTLW(:,:) = ZDTLW(:,:) - ZZDTSW(:,:) = ZDTSW(:,:) - ZZTGVIS(:) = ZFLUX_TOP_GND_IRVISNIR(:,5) - ZZTGNIR(:) = ZFLUX_TOP_GND_IRVISNIR(:,6) - ZZTGIR(:) = ZFLUX_TOP_GND_IRVISNIR(:,4) - ZZSFSWDIR(:,:) = ZSFSWDIR(:,:) - ZZSFSWDIF(:,:) = ZSFSWDIF(:,:) -END IF -! -DEALLOCATE(ZDTLW) -DEALLOCATE(ZDTSW) -DEALLOCATE(ZSFSWDIR) -DEALLOCATE(ZSFSWDIF) -! -!-------------------------------------------------------------------------------------------- -! -!* 6. COMPUTES THE RADIATIVE SOURCES AND THE DOWNWARD SURFACE FLUXES in 2D horizontal -! ------------------------------------------------------------------------------ -! -! Computes the SW and LW radiative tendencies -! note : tendencies in K/s for MNH (from K/day) -! -ZDTRAD_LW(:,:,:)=0.0 -ZDTRAD_SW(:,:,:)=0.0 -DO JK=IKB,IKE - JKRAD= JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZDTRAD_LW(JI,JJ,JK) = ZZDTLW(IIJ,JKRAD)/XDAY ! XDAY from modd_cst (day duration in s) - ZDTRAD_SW(JI,JJ,JK) = ZZDTSW(IIJ,JKRAD)/XDAY - END DO - END DO -END DO -! -! Computes the downward SW and LW surface fluxes + diffuse and direct contribution -! -ZLWD(:,:)=0. -ZSWDDIR(:,:,:)=0. -ZSWDDIF(:,:,:)=0. -! -DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZLWD(JI,JJ) = ZZTGIR(IIJ) - ZSWDDIR(JI,JJ,:) = ZZSFSWDIR (IIJ,:) - ZSWDDIF(JI,JJ,:) = ZZSFSWDIF (IIJ,:) - END DO -END DO -! -!final THETA_radiative tendency and surface fluxes -! -IF(OCLOUD_ONLY) THEN - - GCLOUD_SURF(:,:) = .FALSE. - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - GCLOUD_SURF(JI,JJ) = GCLOUD(IIJ,1) - END DO - END DO - - ZWORKL(:,:) = GCLOUD_SURF(:,:) - - DO JK = IKB,IKE - WHERE( ZWORKL(:,:) ) - PDTHRAD(:,:,JK) = (ZDTRAD_LW(:,:,JK)+ZDTRAD_SW(:,:,JK))/ZEXNT(:,:,JK) - ENDWHERE - END DO - ! - WHERE( ZWORKL(:,:) ) - PSRFLWD(:,:) = ZLWD(:,:) - ENDWHERE - DO JSWB=1,ISWB - WHERE( ZWORKL(:,:) ) - PSRFSWD_DIR (:,:,JSWB) = ZSWDDIR(:,:,JSWB) - PSRFSWD_DIF (:,:,JSWB) = ZSWDDIF(:,:,JSWB) - END WHERE - END DO -ELSE - PDTHRAD(:,:,:) = (ZDTRAD_LW(:,:,:)+ZDTRAD_SW(:,:,:))/ZEXNT(:,:,:) ! tendency in potential temperature - PDTHRADSW(:,:,:) = ZDTRAD_SW(:,:,:)/ZEXNT(:,:,:) - PDTHRADLW(:,:,:) = ZDTRAD_LW(:,:,:)/ZEXNT(:,:,:) - PSRFLWD(:,:) = ZLWD(:,:) - DO JSWB=1,ISWB - PSRFSWD_DIR (:,:,JSWB) = ZSWDDIR(:,:,JSWB) - PSRFSWD_DIF (:,:,JSWB) = ZSWDDIF(:,:,JSWB) - END DO -! -!sw and lw fluxes -! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - PSWU(JI,JJ,JK) = ZFLUX_SW_UP(IIJ,JKRAD) - PSWD(JI,JJ,JK) = ZFLUX_SW_DOWN(IIJ,JKRAD) - PLWU(JI,JJ,JK) = ZFLUX_LW(IIJ,1,JKRAD) - PLWD(JI,JJ,JK) = -ZFLUX_LW(IIJ,2,JKRAD) ! in ECMWF all fluxes are upward - END DO - END DO - END DO -!!!effective radius - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - PRADEFF(JI,JJ,JK) = ZRADLP(IIJ,JKRAD) - END DO - END DO - END DO -END IF -! -! -!------------------------------------------------------------------------------- -! -!* 7. STORE SOME ADDITIONNAL RADIATIVE FIELDS -! --------------------------------------- -! -IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN - ZSTORE_3D(:,:,:) = 0.0 - ZSTORE_3D2(:,:,:) = 0.0 - ZSTORE_2D(:,:) = 0.0 - ! - TZFIELD2D = TFIELDMETADATA( & - CMNHNAME = 'generic 2D for radiations', & !Temporary name to ease identification - CSTDNAME = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - - TZFIELD3D = TFIELDMETADATA( & - CMNHNAME = 'generic 3D for radiations', & !Temporary name to ease identification - CSTDNAME = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - - IF( KRAD_DIAG >= 1) THEN - ! - ILUOUT = TLUOUT%NLU - WRITE(UNIT=ILUOUT,FMT='(/," STORE ADDITIONNAL RADIATIVE FIELDS:", & - & " KRAD_DIAG=",I1,/)') KRAD_DIAG - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFLUX_SW_DOWN(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SWF_DOWN' - TZFIELD3D%CLONGNAME = 'SWF_DOWN' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_DOWN' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFLUX_SW_UP(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SWF_UP' - TZFIELD3D%CLONGNAME = 'SWF_UP' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_UP' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = -ZFLUX_LW(IIJ,2,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'LWF_DOWN' - TZFIELD3D%CLONGNAME = 'LWF_DOWN' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_DOWN' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFLUX_LW(IIJ,1,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'LWF_UP' - TZFIELD3D%CLONGNAME = 'LWF_UP' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_UP' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZNFLW(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'LWF_NET' - TZFIELD3D%CLONGNAME = 'LWF_NET' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_NET' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZNFSW(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SWF_NET' - TZFIELD3D%CLONGNAME = 'SWF_NET' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_NET' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JK=IKB,IKE - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = ZDTRAD_LW (JI,JJ,JK)*XDAY - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'DTRAD_LW' - TZFIELD3D%CLONGNAME = 'DTRAD_LW' - TZFIELD3D%CUNITS = 'K day-1' - TZFIELD3D%CCOMMENT = 'X_Y_Z_DTRAD_LW' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JK=IKB,IKE - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = ZDTRAD_SW (JI,JJ,JK)*XDAY - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'DTRAD_SW' - TZFIELD3D%CLONGNAME = 'DTRAD_SW' - TZFIELD3D%CUNITS = 'K day-1' - TZFIELD3D%CCOMMENT = 'X_Y_Z_DTRAD_SW' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,5) - END DO - END DO - TZFIELD2D%CMNHNAME = 'RADSWD_VIS' - TZFIELD2D%CLONGNAME = 'RADSWD_VIS' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_RADSWD_VIS' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) -! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,6) - END DO - END DO - TZFIELD2D%CMNHNAME = 'RADSWD_NIR' - TZFIELD2D%CLONGNAME = 'RADSWD_NIR' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_RADSWD_NIR' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,4) - END DO - END DO - TZFIELD2D%CMNHNAME = 'RADLWD' - TZFIELD2D%CLONGNAME = 'RADLWD' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_RADLWD' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - END IF - ! - ! - IF( KRAD_DIAG >= 2) THEN - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFLUX_SW_DOWN_CS(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SWF_DOWN_CS' - TZFIELD3D%CLONGNAME = 'SWF_DOWN_CS' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_DOWN_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFLUX_SW_UP_CS(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SWF_UP_CS' - TZFIELD3D%CLONGNAME = 'SWF_UP_CS' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_UP_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = -ZFLUX_LW_CS(IIJ,2,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'LWF_DOWN_CS' - TZFIELD3D%CLONGNAME = 'LWF_DOWN_CS' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_DOWN_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFLUX_LW_CS(IIJ,1,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'LWF_UP_CS' - TZFIELD3D%CLONGNAME = 'LWF_UP_CS' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_UP_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZNFLW_CS(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'LWF_NET_CS' - TZFIELD3D%CLONGNAME = 'LWF_NET_CS' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_NET_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZNFSW_CS(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SWF_NET_CS' - TZFIELD3D%CLONGNAME = 'SWF_NET_CS' - TZFIELD3D%CUNITS = 'W m-2' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_NET_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZDTSW_CS(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'DTRAD_SW_CS' - TZFIELD3D%CLONGNAME = 'DTRAD_SW_CS' - TZFIELD3D%CUNITS = 'K day-1' - TZFIELD3D%CCOMMENT = 'X_Y_Z_DTRAD_SW_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK-JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZDTLW_CS(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'DTRAD_LW_CS' - TZFIELD3D%CLONGNAME = 'DTRAD_LW_CS' - TZFIELD3D%CUNITS = 'K day-1' - TZFIELD3D%CCOMMENT = 'X_Y_Z_DTRAD_LW_CS' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,5) - END DO - END DO - TZFIELD2D%CMNHNAME = 'RADSWD_VIS_CS' - TZFIELD2D%CLONGNAME = 'RADSWD_VIS_CS' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_RADSWD_VIS_CS' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,6) - END DO - END DO - TZFIELD2D%CMNHNAME = 'RADSWD_NIR_CS' - TZFIELD2D%CLONGNAME = 'RADSWD_NIR_CS' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_RADSWD_NIR_CS' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,4) - END DO - END DO - TZFIELD2D%CMNHNAME = 'RADLWD_CS' - TZFIELD2D%CLONGNAME = 'RADLWD_CS' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_RADLWD_CS' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - END IF - ! - ! - IF( KRAD_DIAG >= 3) THEN - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZPLAN_ALB_VIS(IIJ) - END DO - END DO - TZFIELD2D%CMNHNAME = 'PLAN_ALB_VIS' - TZFIELD2D%CLONGNAME = 'PLAN_ALB_VIS' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_PLAN_ALB_VIS' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZPLAN_ALB_NIR(IIJ) - END DO - END DO - TZFIELD2D%CMNHNAME = 'PLAN_ALB_NIR' - TZFIELD2D%CLONGNAME = 'PLAN_ALB_NIR' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_PLAN_ALB_NIR' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZPLAN_TRA_VIS(IIJ) - END DO - END DO - TZFIELD2D%CMNHNAME = 'PLAN_TRA_VIS' - TZFIELD2D%CLONGNAME = 'PLAN_TRA_VIS' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_PLAN_TRA_VIS' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZPLAN_TRA_NIR(IIJ) - END DO - END DO - TZFIELD2D%CMNHNAME = 'PLAN_TRA_NIR' - TZFIELD2D%CLONGNAME = 'PLAN_TRA_NIR' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_PLAN_TRA_NIR' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZPLAN_ABS_VIS(IIJ) - END DO - END DO - TZFIELD2D%CMNHNAME = 'PLAN_ABS_VIS' - TZFIELD2D%CLONGNAME = 'PLAN_ABS_VIS' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_PLAN_ABS_VIS' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_2D(JI,JJ) = ZPLAN_ABS_NIR(IIJ) - END DO - END DO - TZFIELD2D%CMNHNAME = 'PLAN_ABS_NIR' - TZFIELD2D%CLONGNAME = 'PLAN_ABS_NIR' - TZFIELD2D%CUNITS = '' - TZFIELD2D%CCOMMENT = 'X_Y_PLAN_ABS_NIR' - CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) - ! - ! - END IF -! -! - IF( KRAD_DIAG >= 4) THEN - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZEFCL_LWD(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'EFNEB_DOWN' - TZFIELD3D%CLONGNAME = 'EFNEB_DOWN' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_EFNEB_DOWN' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZEFCL_LWU(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'EFNEB_UP' - TZFIELD3D%CLONGNAME = 'EFNEB_UP' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_EFNEB_UP' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFLWP(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'FLWP' - TZFIELD3D%CLONGNAME = 'FLWP' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_FLWP' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZFIWP(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'FIWP' - TZFIELD3D%CLONGNAME = 'FIWP' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_FIWP' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZRADLP(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'EFRADL' - TZFIELD3D%CLONGNAME = 'EFRADL' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_RAD_microm' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZRADIP(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'EFRADI' - TZFIELD3D%CLONGNAME = 'EFRADI' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_RAD_microm' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZCLSW_TOTAL(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SW_NEB' - TZFIELD3D%CLONGNAME = 'SW_NEB' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SW_NEB' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZEFCL_RRTM(IIJ,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'RRTM_LW_NEB' - TZFIELD3D%CLONGNAME = 'RRTM_LW_NEB' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_LW_NEB' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - ! spectral bands - IF (KSWB_OLD==6) THEN - INIR = 4 - ELSE - INIR = 2 - END IF - - DO JBAND=1,INIR-1 - WRITE(YBAND_NAME(JBAND),'(A3,I1)') 'VIS', JBAND - END DO - DO JBAND= INIR, KSWB_OLD - WRITE(YBAND_NAME(JBAND),'(A3,I1)') 'NIR', JBAND - END DO -! - DO JBAND=1,KSWB_OLD - TZFIELD3D%CMNHNAME = 'ODAER_'//YBAND_NAME(JBAND) - TZFIELD3D%CLONGNAME = 'ODAER_'//YBAND_NAME(JBAND) - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_OD_'//YBAND_NAME(JBAND) - CALL IO_Field_write(TPFILE,TZFIELD3D,ZTAUAZ(:,:,:,JBAND)) - ! - TZFIELD3D%CMNHNAME = 'SSAAER_'//YBAND_NAME(JBAND) - TZFIELD3D%CLONGNAME = 'SSAAER_'//YBAND_NAME(JBAND) - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND) - CALL IO_Field_write(TPFILE,TZFIELD3D,ZPIZAZ(:,:,:,JBAND)) - ! - TZFIELD3D%CMNHNAME = 'GAER_'//YBAND_NAME(JBAND) - TZFIELD3D%CLONGNAME = 'GAER_'//YBAND_NAME(JBAND) - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_G_'//YBAND_NAME(JBAND) - CALL IO_Field_write(TPFILE,TZFIELD3D,ZCGAZ(:,:,:,JBAND)) - ENDDO - - DO JBAND=1,KSWB_OLD - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZTAU_TOTAL(IIJ,JBAND,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'OTH_'//YBAND_NAME(JBAND) - TZFIELD3D%CLONGNAME = 'OTH_'//YBAND_NAME(JBAND) - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_OTH_'//YBAND_NAME(JBAND) - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZOMEGA_TOTAL(IIJ,JBAND,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'SSA_'//YBAND_NAME(JBAND) - TZFIELD3D%CLONGNAME = 'SSA_'//YBAND_NAME(JBAND) - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND) - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - ! - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZCG_TOTAL(IIJ,JBAND,JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'ASF_'//YBAND_NAME(JBAND) - TZFIELD3D%CLONGNAME = 'ASF_'//YBAND_NAME(JBAND) - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_ASF_'//YBAND_NAME(JBAND) - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) - END DO - END IF - ! - ! - IF (KRAD_DIAG >= 5) THEN -! -! OZONE and AER optical thickness climato entering the ecmwf_radiation_vers2 -! note the vertical grid is re-inversed for graphic ! - DO JK=IKB,IKE - JKRAD = KFLEV+1 - JK + JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) - ZSTORE_3D(JI,JJ,JK) = ZO3AVE(IIJ, JKRAD) - END DO - END DO - END DO - TZFIELD3D%CMNHNAME = 'O3CLIM' - TZFIELD3D%CLONGNAME = 'O3CLIM' - TZFIELD3D%CUNITS = 'Pa Pa-1' - TZFIELD3D%CCOMMENT = 'X_Y_Z_O3' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) -! -!cumulated optical thickness of aerosols -!cumul begin from the top of the domain, not from the TOA ! -! -!land - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,1) - END DO - END DO - END DO -! - ZSTORE_2D (:,:) = 0. - DO JK=IKB,IKE - JK1=IKE-JK+IKB - ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1) - ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) - END DO - TZFIELD3D%CMNHNAME = 'CUM_AER_LAND' - TZFIELD3D%CLONGNAME = 'CUM_AER_LAND' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) -! -! sea - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,2) - END DO - END DO - END DO -!sum - ZSTORE_2D (:,:) = 0. - DO JK=IKB,IKE - JK1=IKE-JK+IKB - ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1) - ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) - END DO -! - TZFIELD3D%CMNHNAME = 'CUM_AER_SEA' - TZFIELD3D%CLONGNAME = 'CUM_AER_SEA' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) -! -! desert - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,3) - END DO - END DO - END DO -!sum - ZSTORE_2D (:,:) = 0. - DO JK=IKB,IKE - JK1=IKE-JK+IKB - ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1) - ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) - END DO -! - TZFIELD3D%CMNHNAME = 'CUM_AER_DES' - TZFIELD3D%CLONGNAME = 'CUM_AER_DES' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) -! -! urban - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,4) - END DO - END DO - END DO -!sum - ZSTORE_2D (:,:) = 0. - DO JK=IKB,IKE - JK1=IKE-JK+IKB - ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1) - ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) - END DO -! - TZFIELD3D%CMNHNAME = 'CUM_AER_URB' - TZFIELD3D%CLONGNAME = 'CUM_AER_URB' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) -! -! Volcanoes - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,5) - END DO - END DO - END DO -!sum - ZSTORE_2D (:,:) = 0. - DO JK=IKB,IKE - JK1=IKE-JK+IKB - ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1) - ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) - END DO -! - TZFIELD3D%CMNHNAME = 'CUM_AER_VOL' - TZFIELD3D%CLONGNAME = 'CUM_AER_VOL' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) -! -! stratospheric background - DO JK=IKB,IKE - JKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,6) - END DO - END DO - END DO -!sum - ZSTORE_2D (:,:) = 0. - DO JK=IKB,IKE - JK1=IKE-JK+IKB - ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1) - ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) - END DO -! - TZFIELD3D%CMNHNAME = 'CUM_AER_STRB' - TZFIELD3D%CLONGNAME = 'CUM_AER_STRB' - TZFIELD3D%CUNITS = '' - TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) - ENDIF -END IF -! -DEALLOCATE(ZNFLW_CS) -DEALLOCATE(ZNFLW) -DEALLOCATE(ZNFSW_CS) -DEALLOCATE(ZNFSW) -DEALLOCATE(ZFLUX_TOP_GND_IRVISNIR) -DEALLOCATE(ZFLUX_SW_DOWN) -DEALLOCATE(ZFLUX_SW_UP) -DEALLOCATE(ZFLUX_LW) -DEALLOCATE(ZDTLW_CS) -DEALLOCATE(ZDTSW_CS) -DEALLOCATE(ZFLUX_TOP_GND_IRVISNIR_CS) -DEALLOCATE(ZPLAN_ALB_VIS) -DEALLOCATE(ZPLAN_ALB_NIR) -DEALLOCATE(ZPLAN_TRA_VIS) -DEALLOCATE(ZPLAN_TRA_NIR) -DEALLOCATE(ZPLAN_ABS_VIS) -DEALLOCATE(ZPLAN_ABS_NIR) -DEALLOCATE(ZEFCL_LWD) -DEALLOCATE(ZEFCL_LWU) -DEALLOCATE(ZFLWP) -DEALLOCATE(ZFIWP) -DEALLOCATE(ZRADLP) -DEALLOCATE(ZRADIP) -DEALLOCATE(ZEFCL_RRTM) -DEALLOCATE(ZCLSW_TOTAL) -DEALLOCATE(ZTAU_TOTAL) -DEALLOCATE(ZOMEGA_TOTAL) -DEALLOCATE(ZCG_TOTAL) -DEALLOCATE(ZFLUX_SW_DOWN_CS) -DEALLOCATE(ZFLUX_SW_UP_CS) -DEALLOCATE(ZFLUX_LW_CS) -DEALLOCATE(ZO3AVE) -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE RADIATIONS -! -END MODULE MODI_RADIATIONS diff --git a/src/PHYEX/ext/read_all_data_grib_case.f90 b/src/PHYEX/ext/read_all_data_grib_case.f90 deleted file mode 100644 index af2db5f9e..000000000 --- a/src/PHYEX/ext/read_all_data_grib_case.f90 +++ /dev/null @@ -1,2615 +0,0 @@ -!MNH_LIC Copyright 1998-2022 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ################################# - MODULE MODI_READ_ALL_DATA_GRIB_CASE -! ################################# -INTERFACE -SUBROUTINE READ_ALL_DATA_GRIB_CASE(HFILE,TPPRE_REAL1,HGRIB,TPPGDFILE, & - PTIME_HORI,KVERB,ODUMMY_REAL ) -! -USE MODD_IO, ONLY: TFILEDATA -! -CHARACTER(LEN=4), INTENT(IN) :: HFILE ! which file ('ATM0','ATM1' or 'CHEM') -TYPE(TFILEDATA),POINTER,INTENT(INOUT) :: TPPRE_REAL1 ! PRE_REAL1 file -CHARACTER(LEN=28), INTENT(IN) :: HGRIB ! name of the GRIB file -TYPE(TFILEDATA), INTENT(IN) :: TPPGDFILE ! physiographic data file -INTEGER, INTENT(IN) :: KVERB ! verbosity level -LOGICAL, INTENT(IN) :: ODUMMY_REAL ! flag to interpolate dummy fields -REAL, INTENT(INOUT) :: PTIME_HORI ! time spent in hor. interpolations -! -END SUBROUTINE READ_ALL_DATA_GRIB_CASE -! -END INTERFACE -END MODULE MODI_READ_ALL_DATA_GRIB_CASE -! ########################################################################## - SUBROUTINE READ_ALL_DATA_GRIB_CASE(HFILE,TPPRE_REAL1,HGRIB,TPPGDFILE, & - PTIME_HORI,KVERB,ODUMMY_REAL ) -! ########################################################################## -! -!!**** *READ_ALL_DATA_GRIB_CASE* - reads data for the initialization of real cases. -!! -!! PURPOSE -!! ------- -! This routine reads the two input files : -! The PGD which is closed after reading -! The GRIB file -! Projection is read in READ_LFIFM_PGD (MODD_GRID). -! Grid and definition of large domain are read in PGD file and Grib files. -! The PGD files are also read in READ_LFIFM_PGD. -! The PGD file is closed. -! The MESO-NH domain is defined from PRE_REAL1.nam inputs in SET_SUBDOMAIN_CEP. -! Vertical grid is defined in READ_VER_GRID. -! PGD fields are stored on MESO-NH domain (in TRUNC_PGD). -!! -!!** METHOD -!! ------ -!! 0. Declarations -!! 1. Declaration of arguments -!! 2. Declaration of local variables -!! 1. Read PGD file -!! 1. Domain restriction -!! 2. Coordinate conversion to lat,lon system -!! 2. Read Grib fields -!! 3. Vertical grid -!! 4. Free all temporary allocations -!! -!! EXTERNAL -!! -------- -!! subroutine READ_LFIFM_PGD : to read PGD file -!! subroutine SET_SUBDOMAIN : to define the horizontal MESO-NH domain. -!! subroutine READ_VER_GRID : to read the vertical grid in namelist file. -!! subroutine HORIBL : horizontal bilinear interpolation -!! subroutine XYTOLATLON : projection from conformal to lat,lon -!! -!! Module MODI_SET_SUBDOMAIN : interface for subroutine SET_SUBDOMAIN -!! Module MODI_READ_VER_GRID : interface for subroutine READ_VER_GRID -!! Module MODI_HORIBL : interface for subroutine HORIBL -!! Module MODI_XYTOLATLON : interface for subroutine XYTOLATLON -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! Module MODD_CONF : contains configuration variables for all models. -!! NVERB : verbosity level for output-listing -!! Module MODD_LUNIT : contains logical unit names for all models -!! TLUOUT0 : name of output-listing -!! Module MODD_PGDDIM : contains dimension of PGD fields -!! NPGDIMAX: dimension along x (no external point) -!! NPGDJMAX: dimension along y (no external point) -!! Module MODD_PARAMETERS -!! JPHEXT -!! -!! REFERENCE -!! --------- -!! -!! Book 1 : Informations on ISBA model (soil moisture) -!! "Encoding and decoding Grib data", John D.Chambers, ECMWF, October 95 -!! "A guide to Grib", John D.Stackpole, National weather service, March 94 -!! -!! AUTHOR -!! ------ -!! -!! J. Pettre and V. Bousquet -!! -!! MODIFICATIONS -!! ------------- -!! Original 20/11/98 -!! 15/03/99 (V. Masson) phasing with new PGD fields -!! 21/04/99 (V. Masson) bug in mask definitions for max Y index -!! 22/04/99 (V. Masson) optimizer bug in u,v loop -!! --> splitting of the loop -!! and splitting of the routine in more -!! contains -!! 28/05/99 (V. Bousquet) bug in wind interpolated variable for -!! Arpege -!! 31/05/99 (V. Masson) set pressure points (given on a regular grid at ECMWF) -!! on orography points (assuming the last are included in the former) -!! pressure computation from parameters A and B -!! (instead of interpolation from grib grid) -!! 20/07/00 (V. Masson) increase the threshold for land_sea index -!! 22/11/00 (P. Tulet) add INTERPOL_SV to initialize SV fields -!! (I. Mallet) from MOCAGE model (IMODE=3) -!! 01/02/01 (D. Gazen) add INI_NSV -!! 18/05/01 (P. Jabouille) problem with 129 grib code -!! 05/12/01 (I. Mallet) add Aladin reunion model -!! 02/10/02 (I. Mallet) 2 orography fields for CEP (SFC, ML=1) -!! 01/12/03 (D. Gazen) change Chemical scheme interface -!! 01/2004 (V. Masson) removes surface (externalization) -!! 01/06/02 (O.Nuissier) filtering of tropical cyclone -!! 01/05/04 (P. Tulet) add INTERPOL_SV to initialize SV dust -!! and aerosol fields -!! 08/06/2010 (G. Tanguy) replace GRIBEX by GRIB_API : change -!! of all the subroutine -!! 05/12/2016 (G.Delautier) length of HGRID for grib_api > 1.14 -!! 08/03/2018 (P.Wautelet) replace ADD_FORECAST_TO_DATE by DATETIME_CORRECTDATE -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! Pergaud : 2018 add GFS -!! 01/2019 (G.Delautier via Q.Rodier) for GRIB2 ARPEGE and AROME from EPYGRAM -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 14/03/2019: correct ZWS when variable not present in file -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! Q. Rodier 16/09/2019: switch of GRIB number ID for orography in ARPEGE/AROME in EPyGrAM -! Q. Rodier 27/01/2020: switch of GRIB number ID for orography and hydrometeors in ARPEGE/AROME in EPyGrAM v1.3.7 -! Q. Rodier 21/04/2020: correction GFS u and v wind component written in the right vertical order -! Q. Rodier 02/09/2020: Read and interpol geopotential height for interpolation on isobaric surface Grid of NCEP -! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv -!JP Chaboureau 02/08/2021: add ERA5 reanalysis in pressure levels -!JP Chaboureau 18/10/2022: correction on vertical level for GFS and ERA5 reanalyses in pressure levels -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -!------------ -! -USE MODE_DATETIME -USE MODE_IO_FILE, ONLY: IO_File_close -USE MODE_MSG -USE MODE_TIME -USE MODE_THERMO -USE MODE_TOOLS, ONLY: UPCASE -use mode_tools_ll, only: GET_DIM_EXT_ll -! -USE MODI_READ_HGRID_n -USE MODI_READ_VER_GRID -USE MODI_XYTOLATLON -USE MODI_HORIBL -USE MODI_INI_NSV -USE MODI_REMOVAL_VORTEX -USE MODI_CH_OPEN_INPUT -! -USE MODD_IO, ONLY: TFILEDATA -USE MODD_FIELD_n, ONLY: XZWS, XZWS_DEFAULT -USE MODD_CONF -USE MODD_CONF_n -USE MODD_CST -USE MODD_LUNIT -USE MODD_PARAMETERS -USE MODD_GRID -USE MODD_GRID_n -USE MODD_DIM_n -USE MODD_PARAM_n, ONLY : CTURB -USE MODD_TIME -USE MODD_TIME_n -USE MODD_CH_MNHC_n, ONLY : LUSECHEM,LUSECHAQ,LUSECHIC,LCH_PH -USE MODD_CH_M9_n, ONLY : NEQ , CNAMES -USE MODD_CH_AEROSOL, ONLY: CORGANIC, NCARB, NSOA, NSP, LORILAM,& - JPMODE, LVARSIGI, LVARSIGJ -USE MODD_NSV , ONLY : NSV -USE MODD_HURR_CONF, ONLY : LFILTERING,CFILTERING -USE MODD_PREP_REAL -USE MODE_MODELN_HANDLER -!JUAN REALZ -USE MODE_MPPDB -!JUAN REALZ -! -USE GRIB_API -! -IMPLICIT NONE -! -!* 0.1. Declaration of arguments -! ------------------------ -! -CHARACTER(LEN=4), INTENT(IN) :: HFILE ! which file ('ATM0','ATM1' or 'CHEM') -TYPE(TFILEDATA),POINTER,INTENT(INOUT) :: TPPRE_REAL1! PRE_REAL1 file -CHARACTER(LEN=28), INTENT(IN) :: HGRIB ! name of the GRIB file -TYPE(TFILEDATA), INTENT(IN) :: TPPGDFILE ! physiographic data file -INTEGER, INTENT(IN) :: KVERB ! verbosity level -LOGICAL, INTENT(IN) :: ODUMMY_REAL ! flag to interpolate dummy fields -REAL, INTENT(INOUT) :: PTIME_HORI ! time spent in hor. interpolations -! -!* 0.2 Declaration of local variables -! ------------------------------ -! General purpose variables -INTEGER :: ILUOUT0 ! Unit used for output msg. -INTEGER :: IRESP ! Return code of FM-routines -INTEGER :: IRET ! Return code from subroutines -INTEGER(KIND=kindOfInt) :: IRET_GRIB ! Return code from subroutines -INTEGER, PARAMETER :: JP_GFS=31 ! number of pressure levels for GFS model -INTEGER, PARAMETER :: JP_ERA=37 ! number of pressure levels for ERA5 reanalysis -REAL :: ZA,ZB,ZC ! Dummy variables -REAL :: ZD,ZE,ZF ! | -REAL :: ZTEMP ! | -INTEGER :: JI,JJ ! Dummy counters -INTEGER :: JLOOP1,JLOOP2 ! | -INTEGER :: JLOOP3,JLOOP4 ! | -INTEGER :: JLOOP ! | -! Variables used by the PGD reader -CHARACTER(LEN=28) :: YPGD_NAME ! not used - dummy argument -CHARACTER(LEN=28) :: YPGD_DAD_NAME ! not used - dummy argument -CHARACTER(LEN=2) :: YPGD_TYPE ! not used - dummy argument -! PGD Grib definition variables -INTEGER :: INO ! Number of points of the grid -INTEGER :: IIU ! Number of points along X -INTEGER :: IJU ! Number of points along Y -REAL, DIMENSION(:), ALLOCATABLE :: ZXOUT ! mapping PGD -> Grib (lon.) -REAL, DIMENSION(:), ALLOCATABLE :: ZYOUT ! mapping PGD -> Grib (lat.) -REAL, DIMENSION(:), ALLOCATABLE :: ZLONOUT ! mapping PGD -> Grib (lon.) -REAL, DIMENSION(:), ALLOCATABLE :: ZLATOUT ! mapping PGD -> Grib (lat.) -REAL, DIMENSION(:,:), ALLOCATABLE :: ZXM ! X of PGD mass points -REAL, DIMENSION(:,:), ALLOCATABLE :: ZYM ! Y of PGD mass points -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLATM ! Lat of PGD mass points -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLONM ! Lon of PGD mass points -! Variable involved in the task of reading the grib file -INTEGER(KIND=kindOfInt) :: IUNIT ! unit of the grib file -CHARACTER(LEN=50) :: HGRID ! type of grid -INTEGER :: IPAR ! Parameter identifier -INTEGER :: ITYP ! type of level (Grib code table 3) -INTEGER :: ILEV1 ! level definition -INTEGER :: ILEV2 ! level definition -INTEGER :: IMODEL ! Type of Grib file : - ! 0 -> ECMWF - ! 1 -> METEO FRANCE - ALADIN/AROME - ! 2 -> METEO FRANCE - ALADIN-REUNION - ! 3 -> METEO FRANCE - ARPEGE - ! 4 -> METEO FRANCE - ARPEGE - ! 5 -> METEO FRANCE - MOCAGE - ! 10 -> NCEP - GFS -INTEGER :: ICENTER ! number of center -INTEGER :: ISIZE ! size of grib message -INTEGER(KIND=kindOfInt) :: ICOUNT ! number of messages in the file -INTEGER(KIND=kindOfInt),DIMENSION(:),ALLOCATABLE :: IGRIB ! number of the grib in memory -INTEGER :: INUM ,INUM_ZS ! number of a grib message -REAL,DIMENSION(:),ALLOCATABLE :: ZPARAM ! parameter of grib grid -INTEGER,DIMENSION(:),ALLOCATABLE :: IINLO ! longitude of grib grid -INTEGER(KIND=kindOfInt),DIMENSION(:),ALLOCATABLE :: IINLO_GRIB ! longitude of grib grid -REAL,DIMENSION(:),ALLOCATABLE :: ZPARAM_ZS ! parameter of grib grid for ZS -INTEGER,DIMENSION(:),ALLOCATABLE :: IINLO_ZS ! longitude of grib grid for ZS -REAL,DIMENSION(:),ALLOCATABLE :: ZVALUE ! Intermediate array -REAL,DIMENSION(:),ALLOCATABLE :: ZOUT ! Intermediate arrays -! Grib grid definition variables -INTEGER :: INI ! Number of points -INTEGER :: INLEVEL ! Number of levels -INTEGER :: ISTARTLEVEL ! First level (0 or 1) -TYPE(DATE_TIME) :: TPTCUR ! Date & time of the grib file data -INTEGER :: ITWOZS -! surface pressure -REAL, DIMENSION(:), ALLOCATABLE :: ZPS_G ! Grib data : Ps -REAL, DIMENSION(:), ALLOCATABLE :: ZLNPS_G ! Grib data : ln(Ps) -REAL, DIMENSION(:), ALLOCATABLE :: ZWORK_LNPS ! Grib data on zs grid: ln(Ps) -INTEGER :: INJ,INJ_ZS -! orography -CHARACTER(LEN=50) :: HGRID_ZS ! type of grid -! -! Reading and projection of the wind vectors u, v -REAL :: ZALPHA ! Angle of rotation -REAL, DIMENSION(:), ALLOCATABLE :: ZTU_LS ! Intermediate array for U -REAL, DIMENSION(:), ALLOCATABLE :: ZTV_LS ! | V -REAL :: ZLATPOLE ! Arpege stretching pole latitude -REAL :: ZLONPOLE ! Arpege stretching pole longitude -REAL :: ZLAT,ZLON ! Lat,lon of current point -REAL :: ZCOS,ZSIN ! cos,sin of rotation matrix -REAL, DIMENSION(:), ALLOCATABLE :: ZTU0_LS ! Arpege temp array for U -REAL, DIMENSION(:), ALLOCATABLE :: ZTV0_LS ! | V -! -! variables for hurricane filtering -REAL, DIMENSION(:,:), ALLOCATABLE :: ZTVF_LS,ZMSLP_LS -REAL :: ZGAMREF ! Standard atmosphere lapse rate (K/m) -! date -INTEGER :: ITIME -INTEGER :: IDATE -INTEGER :: ITIMESTEP -CHARACTER(LEN=10) :: CSTEPUNIT -CHARACTER(LEN=15) :: YVAL -!chemistery field -CHARACTER(LEN=16) :: YPRE_MOC="PRE_MOC1.nam" -INTEGER, DIMENSION(:), ALLOCATABLE :: INUMGRIB, INUMLEV ! grib -INTEGER, DIMENSION(:), ALLOCATABLE :: INUMLEV1, INUMLEV2 !numbers -INTEGER :: IMOC -INTEGER :: IVAR -INTEGER :: ICHANNEL -INTEGER :: INDX -INTEGER :: INACT -CHARACTER(LEN=40) :: YINPLINE ! input line -CHARACTER(LEN=16) :: YFIELD -CHARACTER, PARAMETER :: YPTAB = CHAR(9) ! TAB character is ASCII : 9 -CHARACTER, PARAMETER :: YPCOM = CHAR(44)! COMma character is ASCII : 44 -CHARACTER(LEN=40), DIMENSION(:), ALLOCATABLE :: YMNHNAME ! species names -INTEGER :: JN, JNREAL ! loop control variables -CHARACTER(LEN=40) :: YFORMAT -CHARACTER(LEN=100) :: YMSG -! temperature and humidity -INTEGER :: IT,IQ -REAL, DIMENSION(:,:), ALLOCATABLE :: ZPF_G ! Pressure (flux point) -REAL, DIMENSION(:,:), ALLOCATABLE :: ZPM_G ! Pressure (mass point) -REAL, DIMENSION(:,:), ALLOCATABLE :: ZEXNF_G ! Exner fct. (flux point) -REAL, DIMENSION(:,:), ALLOCATABLE :: ZEXNM_G ! Exner fct. (mass point) -REAL, DIMENSION(:,:), ALLOCATABLE :: ZGH_G ! Geopotential Height -REAL, DIMENSION(:,:), ALLOCATABLE :: ZT_G ! Temperature -REAL, DIMENSION(:,:), ALLOCATABLE :: ZQ_G ! Specific humidity -REAL, DIMENSION(:), ALLOCATABLE :: ZH_G ! Relative humidity -REAL, DIMENSION(:), ALLOCATABLE :: ZTHV_G ! Theta V -REAL, DIMENSION(:), ALLOCATABLE :: ZRV_G ! Vapor mixing ratio -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPF_LS ! Pressure (flux point) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPM_LS ! Pressure (mass point) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXNF_LS ! Exner fct. (flux point) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXNM_LS ! Exner fct. (mass point) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZH_LS ! Relative humidity -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV_LS ! Vapor mixing ratio -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV_LS ! Theta V -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTEV_LS ! T V -REAL, DIMENSION(:), ALLOCATABLE :: ZPV ! vertical level in grib file -INTEGER :: IPVPRESENT ,IPV -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZR_DUM -INTEGER :: IMI -TYPE(TFILEDATA),POINTER :: TZFILE -INTEGER, DIMENSION(JP_GFS) :: IP_GFS ! list of pressure levels for GFS model -INTEGER, DIMENSION(JP_ERA) :: IP_ERA ! list of pressure levels for ERA5 reanalysis -INTEGER :: IVERSION,ILEVTYPE -LOGICAL :: GFIND ! to test if sea wave height is found -!--------------------------------------------------------------------------------------- -IP_GFS=(/1000,975,950,925,900,850,800,750,700,650,600,550,500,450,400,350,300,& - 250,200,150,100,70,50,30,20,10,7,5,3,2,1/) -IP_ERA=(/1000,975,950,925,900,875,850,825,800,775,750,700,650,600,550,500,450,& - 400,350,300,250,225,200,175,150,125,100,70,50,30,20,10,7,5,3,2,1/) -! -TZFILE => NULL() -! -IMI = GET_CURRENT_MODEL_INDEX() -! -!* 1. READ PGD FILE -! ------------- -! -ILUOUT0 = TLUOUT0%NLU -CALL READ_HGRID_n(TPPGDFILE,YPGD_NAME,YPGD_DAD_NAME,YPGD_TYPE) -! -! 1.1 Domain restriction -! -!JUAN REALZ -CALL GET_DIM_EXT_ll('B',IIU,IJU) -!!$IIU=NIMAX + 2*JPHEXT -!!$IJU=NJMAX + 2*JPHEXT -!JUAN REALZ -INO = IIU * IJU -! -! -! 1.2 Coordinate conversion to lat,lon system -! -ALLOCATE (ZXM(IIU,IJU)) -ALLOCATE (ZYM(IIU,IJU)) -ALLOCATE (ZLONM(IIU,IJU)) -ALLOCATE (ZLATM(IIU,IJU)) -ZXM(:,:) = SPREAD(XXHATM(:),2,IJU) -ZYM(:,:) = SPREAD(XYHATM(:),1,IIU) -CALL SM_XYTOLATLON_A (XLAT0,XLON0,XRPK,XLATORI,XLONORI,ZXM,ZYM,ZLATM,ZLONM, & - IIU,IJU) -ALLOCATE (ZLONOUT(INO)) -ALLOCATE (ZLATOUT(INO)) -JLOOP1 = 0 -DO JJ = 1, IJU - ZLONOUT(JLOOP1+1:JLOOP1+IIU) = ZLONM(1:IIU,JJ) - ZLATOUT(JLOOP1+1:JLOOP1+IIU) = ZLATM(1:IIU,JJ) - JLOOP1 = JLOOP1 + IIU -ENDDO -DEALLOCATE (ZLATM) -DEALLOCATE (ZLONM) -DEALLOCATE (ZYM) -DEALLOCATE (ZXM) -! -ALLOCATE (ZXOUT(INO)) -ALLOCATE (ZYOUT(INO)) -! -!--------------------------------------------------------------------------------------- -! -!* 2. READ GRIB FIELDS -! ---------------- -! -IF (HFILE(1:3)=='ATM' .OR. HFILE=='CHEM') THEN - WRITE (ILUOUT0,'(A,A4)') ' -- Grib reader started for ',HFILE -ELSE - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE','bad input argument') -END IF -! -!* 2.1 Charge in memory the grib messages -! -! open grib file -CALL GRIB_OPEN_FILE(IUNIT,HGRIB,'R',IRET_GRIB) -IF (IRET_GRIB /= 0) THEN - WRITE(YMSG,*) 'Error opening the grib file ',TRIM(HGRIB),', error code ', IRET_GRIB - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) -END IF -! count the messages in the file -CALL GRIB_COUNT_IN_FILE(IUNIT,ICOUNT,IRET_GRIB) -IF (IRET_GRIB /= 0) THEN - WRITE(YMSG,*) 'Error in reading the grib file ',TRIM(HGRIB),', error code ', IRET_GRIB - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) -END IF -ALLOCATE(IGRIB(ICOUNT)) -! initialize the tabular with a negativ number -! ( all the IGRIB will be different ) -IGRIB(:)=-12 -!charge all the message in memory -DO JLOOP=1,ICOUNT -CALL GRIB_NEW_FROM_FILE(IUNIT,IGRIB(JLOOP),IRET_GRIB) -IF (IRET_GRIB /= 0) THEN - WRITE(YMSG,*) 'Error in reading the grib file - ILOOP=',JLOOP,' - error code ', IRET_GRIB - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) -END IF -END DO -! close the grib file -CALL GRIB_CLOSE_FILE(IUNIT) -! -! -!--------------------------------------------------------------------------------------- -!* 2.2 Research center with the first message -!--------------------------------------------------------------------------------------- -! -CALL GRIB_GET(IGRIB(1),'centre',ICENTER,IRET_GRIB) -IF (IRET_GRIB /= 0) THEN - WRITE(YMSG,*) 'Error in reading center - error code ', IRET_GRIB - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) -END IF -CALL GRIB_GET(IGRIB(1),'typeOfGrid',HGRID,IRET_GRIB) -IF (IRET_GRIB /= 0) THEN - WRITE(YMSG,*) 'Error in reading type of grid - error code ', IRET_GRIB - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) -END IF -! -IMODEL = -1 -SELECT CASE (ICENTER) - CASE (98) - WRITE (ILUOUT0,'(A)') & - ' | Grib file from European Center for Medium-range Weather Forecast' - IMODEL = 0 - ALLOCATE(ZPARAM(6)) - CASE (85) - SELECT CASE (HGRID) - CASE('lambert') - WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Arome france model' - CALL GRIB_GET(IGRIB(1),'editionNumber',IVERSION,IRET_GRIB) - IF (IVERSION==2) THEN - IMODEL = 6 ! GRIB2 since summer 2018 (epygram) - ELSE - IMODEL = 1 ! GRIB1 befor summer 2018 (lfi2mv) - ENDIF - ALLOCATE(ZPARAM(10)) - CASE('mercator') - WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Aladin reunion model' - IMODEL = 2 - ALLOCATE(ZPARAM(9)) - - CASE('unknown_PLPresent','reduced_stretched_rotated_gg') - WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Arpege model' - ALLOCATE(ZPARAM(10)) - CALL GRIB_GET(IGRIB(1),'editionNumber',IVERSION,IRET_GRIB) - IF (IVERSION==2) THEN - IMODEL = 7 ! GRIB2 since summer 2018 (epygram) - ELSE - IMODEL = 3 ! GRIB1 befor summer 2018 (lfi2mv) - ENDIF - - CASE('regular_gg') - WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Arpege model' - WRITE (ILUOUT0,'(A)') 'but same grid as ECMWF model (unstretched)' - IMODEL = 4 - ALLOCATE(ZPARAM(10)) - CASE('regular_ll') - WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Mocage model' - IMODEL = 5 - ALLOCATE(ZPARAM(6)) - END SELECT - CASE (7) - WRITE (ILUOUT0,'(A)') ' | Grib file from National Center for Environmental Prediction' - IMODEL = 10 - ALLOCATE(ZPARAM(6)) -END SELECT -IF (IMODEL==-1) THEN - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE','unsupported Grib file format') -END IF -! -!--------------------------------------------------------------------------------------- -!* 2.3 Read and interpol orography -!--------------------------------------------------------------------------------------- -! -WRITE (ILUOUT0,'(A)') ' | Searching orography' -SELECT CASE (IMODEL) - CASE(0) ! ECMWF - CALL SEARCH_FIELD(IGRIB,INUM_ZS,KPARAM=129) - IF(INUM_ZS < 0) THEN - WRITE (ILUOUT0,'(A)')'Orography is missing - abort' - END IF - CASE(3,4,5) ! arpege et mocage - CALL SEARCH_FIELD(IGRIB,INUM_ZS,KPARAM=8) - IF(INUM_ZS < 0) THEN - WRITE (ILUOUT0,'(A)')'Orography is missing - abort' - ENDIF - CASE(1,2) ! aladin et aladin reunion - CALL SEARCH_FIELD(IGRIB,INUM_ZS,KPARAM=6) - IF(INUM_ZS < 0) THEN - WRITE (ILUOUT0,'(A)')'Orography is missing - abort' - ENDIF - CASE(6,7) ! arpege and arome GRIB2 - CALL SEARCH_FIELD(IGRIB,INUM_ZS,KDIS=0,KCAT=3,KNUMBER=4) - IF(INUM_ZS < 0) THEN - CALL SEARCH_FIELD(IGRIB,INUM_ZS,KDIS=0,KCAT=193,KNUMBER=5) - IF(INUM_ZS < 0) THEN - WRITE (ILUOUT0,'(A)')'Orography is missing - abort' - END IF - ENDIF - CASE(10) ! NCEP - CALL SEARCH_FIELD(IGRIB,INUM_ZS,KDIS=0,KCAT=3,KNUMBER=5,KTFFS=1) - IF(INUM_ZS < 0) THEN - WRITE (ILUOUT0,'(A)')'Orography is missing - abort' - ENDIF -END SELECT -ZPARAM(:)=-999. -CALL GRIB_GET(IGRIB(INUM_ZS),'Nj',INJ,IRET_GRIB) -ALLOCATE(IINLO(INJ)) -CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM_ZS),IIU,IJU,ZLONOUT,ZLATOUT,& - ZXOUT,ZYOUT,INI,ZPARAM,IINLO) -ALLOCATE(ZPARAM_ZS(SIZE(ZPARAM))) -ZPARAM_ZS=ZPARAM -ALLOCATE(IINLO_ZS(SIZE(IINLO))) -IINLO_ZS=IINLO -CALL GRIB_GET_SIZE(IGRIB(INUM_ZS),'values',ISIZE) -ALLOCATE(ZVALUE(ISIZE)) -CALL GRIB_GET(IGRIB(INUM_ZS),'values',ZVALUE) -ALLOCATE(ZOUT(INO)) -CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) -DEALLOCATE(IINLO) -DEALLOCATE(ZVALUE) -! -IF (IMODEL/=10) THEN ! others than NCEP - ! Data given in archives are multiplied by the gravity acceleration - ZOUT = ZOUT / XG -END IF -! -! Stores the field in a 2 dimension array -IF (HFILE(1:3)=='ATM') THEN - ALLOCATE (XZS_LS(IIU,IJU)) - ALLOCATE (XZSMT_LS(IIU,IJU)) - CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,XZS_LS) - XZSMT_LS = XZS_LS ! no smooth orography in this case -ELSE IF (HFILE=='CHEM') THEN - ALLOCATE (XZS_SV_LS(IIU,IJU)) - CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,XZS_SV_LS) -END IF -DEALLOCATE (ZOUT) -! -!--------------------------------------------------------------------------------------- -!* 2.3 bis Read and interpol Sea Wave significant height -!--------------------------------------------------------------------------------------- -WRITE (ILUOUT0,'(A)') ' | Searching sea wave significant height' -SELECT CASE (IMODEL) - CASE(0) ! ECMWF - ALLOCATE (XZWS(IIU,IJU)) - GFIND=.FALSE. - ! - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=140229) - IF(INUM < 0) THEN - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=229) - ! - IF(INUM < 0) THEN - WRITE (YVAL,'( E15.8 )') XZWS_DEFAULT - WRITE (ILUOUT0,'(A)')' | !!! WARNING !!! Sea wave height is missing in '// & - 'the GRIB file - the default value of '//TRIM(YVAL)//' meters is used' - XZWS = XZWS_DEFAULT - ELSE - GFIND=.TRUE. - END IF - ELSE - GFIND=.TRUE. - END IF - ! - IF (GFIND) THEN - !!!!!!!!!!! Faire en sorte de le faire que pour le CASE(0) - ! Sea wave significant height disponible uniquement pour ECMWF - ! recuperation du tableau de valeurs - CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) - ALLOCATE(IINLO(INJ)) - CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,& - ZXOUT,ZYOUT,INI,ZPARAM,IINLO) - ALLOCATE(ZVALUE(ISIZE)) - CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE) - ! Change 9999 value to -1 - WHERE(ZVALUE.EQ.9999.) ZVALUE=0. - ALLOCATE(ZOUT(INO)) - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) - DEALLOCATE(IINLO) - DEALLOCATE(ZVALUE) - ! Stores the field in a 2 dimension array - CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,XZWS) - DEALLOCATE (ZOUT) - END IF -END SELECT -! -!--------------------------------------------------------------------------------------- -!* 2.4 Interpolation surface pressure -!--------------------------------------------------------------------------------------- -! -!* 2.4.1 Read pressure -! -WRITE (ILUOUT0,'(A)') ' | Searching pressure' - -SELECT CASE (IMODEL) - CASE(0) ! ECMWF - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=152) - IF( INUM < 0 ) THEN - WRITE (ILUOUT0,'(A)') ' | Logarithm of surface pressure is missing. It is then supposed that' - WRITE (ILUOUT0,'(A)') ' | this ECMWF file has atmospheric fields on pressure levels (e.g. ERA5)' - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=134) - IMODEL = 11 - END IF - CASE(1,2,3,4,5) ! arpege mocage aladin et aladin reunion - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=1) - CASE(6,7) ! NEW AROME,ARPEGE - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=3,KNUMBER=0) - CASE(10) ! NCEP - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=134) -END SELECT -IF( INUM < 0 ) call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', 'surface pressure is missing' ) -! recuperation du tableau de valeurs -CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) -ALLOCATE(ZVALUE(ISIZE)) -CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE) -! determination des tableaux ZPS_G et ZLNPS_G -SELECT CASE (IMODEL) - CASE(0,6,7) ! ECMWF - ALLOCATE (ZPS_G (ISIZE)) - ALLOCATE (ZLNPS_G(ISIZE)) - ZLNPS_G(:) = ZVALUE(1:ISIZE) - ZPS_G (:) = EXP(ZVALUE(1:ISIZE)) - CASE(1,2,3,4,5,10,11) ! arpege mocage aladin aladin-reunion NCEP ERA5 - ALLOCATE (ZPS_G (ISIZE)) - ALLOCATE (ZLNPS_G(ISIZE)) - ZPS_G (:) = ZVALUE(1:ISIZE) - ZLNPS_G(:) = LOG(ZVALUE(1:ISIZE)) -END SELECT -DEALLOCATE (ZVALUE) -! -!* 2.4.2 Removes pressure points not on orography points -! (if pressure is on a regular grid) -CALL GRIB_GET(IGRIB(INUM),'typeOfGrid',HGRID) -CALL GRIB_GET(IGRIB(INUM_ZS),'typeOfGrid',HGRID_ZS) -CALL GRIB_GET(IGRIB(INUM),'Nj',INJ) -CALL GRIB_GET(IGRIB(INUM_ZS),'Nj',INJ_ZS) -! -IF ( HGRID(1:7)=='regular' .AND. HGRID_ZS(1:7)=='reduced' .AND.& - INJ == INJ_ZS) THEN - call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', & - 'HGRID(1:7)==regular .AND. HGRID_ZS(1:7)==reduced .AND. INJ == INJ_ZS' ) -ELSE - ALLOCATE(ZWORK_LNPS(SIZE(ZLNPS_G))) - ZWORK_LNPS(:) = ZLNPS_G(:) -ENDIF -! -IF (HFILE(1:3)=='ATM') THEN - ALLOCATE (XPS_LS(IIU,IJU)) -ELSE IF (HFILE=='CHEM') THEN - ALLOCATE (XPS_SV_LS(IIU,IJU)) -END IF -! -ALLOCATE(IINLO(INJ)) -CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,& - ZXOUT,ZYOUT,INI,ZPARAM,IINLO) -ALLOCATE(ZOUT(INO)) -CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI,& - ZWORK_LNPS,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE. ) -DEALLOCATE(ZWORK_LNPS) -DEALLOCATE(IINLO) -! -!* 2.4.3 conversion to surface pressure -! -ZOUT=EXP(ZOUT) -IF (HFILE(1:3)=='ATM') THEN - CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,XPS_LS(:,:)) -ELSE IF (HFILE=='CHEM') THEN - CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,XPS_SV_LS(:,:)) -END IF -!JUAN REALZ -CALL MPPDB_CHECK2D(XZS_LS,"XZS_LS",PRECISION) -!JUAN REALZ -DEALLOCATE (ZOUT) -DEALLOCATE (ZLNPS_G) -! -!--------------------------------------------------------------------------------------- -!* 2.5 Interpolation temperature and humidity -!--------------------------------------------------------------------------------------- -! -!* 2.5.1 Read T and Q on each level -! -WRITE (ILUOUT0,'(A)') ' | Reading T and Q fields' -! -IF (IMODEL==11) THEN - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=130,KLEV1=1000) !look for air temperature at pressure level 1000hPa - IF (INUM < 0) IMODEL = 0 ! This change is for handling IFS model level grib file obtained by python API -END IF -IF (IMODEL/=10.AND.IMODEL/=11) THEN - SELECT CASE (IMODEL) - CASE(0) ! ECMWF - ISTARTLEVEL=1 - IT=130 - IQ=133 - CASE(1,2,3,4,5) ! arpege mocage aladin et aladin reunion - IT=11 - IQ=51 - ISTARTLEVEL=1 - CASE(6,7) !GRIB2 AROME AND ARPEGE - IT=130 - IQ=133 - ISTARTLEVEL=1 - END SELECT - - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IT,KLEV1=ISTARTLEVEL) - IF(INUM < 0) THEN - ISTARTLEVEL=0 - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IT,KLEV1=ISTARTLEVEL) - ENDIF - IF(INUM < 0) call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', 'air temperature is missing' ) - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IQ,KLEV1=ISTARTLEVEL) - IF(INUM < 0) call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', 'atmospheric specific humidity is missing' ) -ELSEIF (IMODEL==10) THEN ! NCEP - ISTARTLEVEL=1000 - IT=130 - IQ=157 - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IT,KLEV1=ISTARTLEVEL) - IF(INUM < 0) call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', 'air temperature is missing' ) - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IQ,KLEV1=ISTARTLEVEL) - IF(INUM < 0) call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', 'atmospheric relative humidity is missing' ) -ELSE ! ERA5 - ISTARTLEVEL=1000 - IT=130 - IQ=133 - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IT,KLEV1=ISTARTLEVEL) - IF(INUM < 0) call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', 'air temperature is missing' ) - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IQ,KLEV1=ISTARTLEVEL) - IF(INUM < 0) call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', 'atmospheric specific humidity is missing' ) -ENDIF -! -IF (IMODEL/=10.AND.IMODEL/=11) THEN ! others than NCEP AND ERA5 - CALL GRIB_GET(IGRIB(INUM),'NV',INLEVEL) - INLEVEL = NINT(INLEVEL / 2.) - 1 - CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) -ELSE - IF (IMODEL==10) THEN - INLEVEL=JP_GFS - ELSE - INLEVEL=JP_ERA - END IF -END IF -! -ALLOCATE (ZT_G(ISIZE,INLEVEL)) -ALLOCATE (ZQ_G(ISIZE,INLEVEL)) -! -IF (IMODEL/=10.AND.IMODEL/=11) THEN ! others than NCEP AND ERA5 - DO JLOOP1=1, INLEVEL - ILEV1 = JLOOP1-1+ISTARTLEVEL - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IQ,KLEV1=ILEV1) - IF (INUM< 0) THEN - WRITE(YMSG,*) 'atmospheric humidity level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET(IGRIB(INUM),'values',ZQ_G(:,INLEVEL-JLOOP1+1)) - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IT,KLEV1=ILEV1) - IF (INUM< 0) THEN - WRITE(YMSG,*) 'atmospheric temperature level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET(IGRIB(INUM),'values',ZT_G(:,INLEVEL-JLOOP1+1)) - CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB) - END DO -ELSEIF (IMODEL==10) THEN ! NCEP - DO JLOOP1=1, INLEVEL - ILEV1 = IP_GFS(JLOOP1) - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IQ,KLEV1=ILEV1) - IF (INUM< 0) THEN - WRITE(YMSG,*) 'atmospheric humidity level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET(IGRIB(INUM),'values',ZQ_G(:,JLOOP1),IRET_GRIB) - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=0,KNUMBER=0,KLEV1=ILEV1,KTFFS=100) - IF (INUM< 0) THEN - WRITE(YMSG,*) 'atmospheric temperature level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET(IGRIB(INUM),'values',ZT_G(:,JLOOP1),IRET_GRIB) - CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB) - END DO -ELSE ! ERA5 - DO JLOOP1=1, INLEVEL - ILEV1 = IP_ERA(JLOOP1) - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IQ,KLEV1=ILEV1) - IF (INUM< 0) THEN - WRITE(YMSG,*) 'atmospheric humidity level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET(IGRIB(INUM),'values',ZQ_G(:,JLOOP1),IRET_GRIB) - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IT,KLEV1=ILEV1) - IF (INUM< 0) THEN - WRITE(YMSG,*) 'atmospheric temperature level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET(IGRIB(INUM),'values',ZT_G(:,JLOOP1),IRET_GRIB) - CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB) - END DO -END IF - -ALLOCATE(IINLO(INJ)) -CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,& - ZXOUT,ZYOUT,INI,ZPARAM,IINLO) -! -!* 2.5.2 Load level definition parameters A and B -! -IF (IMODEL/=10.AND.IMODEL/=11) THEN ! others than NCEP AND ERA5 - - IF (HFILE(1:3)=='ATM') THEN - XP00_LS = 101325. - ELSE IF (HFILE=='CHEM') THEN - XP00_SV_LS = 101325. - END IF -! - IF (INLEVEL > 0) THEN - IF (HFILE(1:3)=='ATM') THEN - ALLOCATE (XA_LS(INLEVEL)) - ALLOCATE (XB_LS(INLEVEL)) - ELSE IF (HFILE=='CHEM') THEN - ALLOCATE (XA_SV_LS(INLEVEL)) - ALLOCATE (XB_SV_LS(INLEVEL)) - END IF -! - CALL GRIB_GET(IGRIB(INUM),'PVPresent',IPVPRESENT) - IF (IPVPRESENT==1) THEN - CALL GRIB_GET_SIZE(IGRIB(INUM),'pv',IPV) - ALLOCATE(ZPV(IPV)) - CALL GRIB_GET(IGRIB(INUM),'pv',ZPV) - ELSE - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE','there is no PV value in this message') - ENDIF - SELECT CASE (IMODEL) - CASE (0,3,4,6,7) - DO JLOOP1 = 1, INLEVEL - XA_LS(1 + INLEVEL - JLOOP1) = ZPV(1+JLOOP1) / XP00_LS - XB_LS(1 + INLEVEL - JLOOP1) = ZPV(2+INLEVEL+JLOOP1) - END DO - CASE (1,2) - JLOOP2 = 2 - DO JLOOP1 = 1, INLEVEL - JLOOP2 = JLOOP2 + 1 - XA_LS(1 + INLEVEL - JLOOP1) = ZPV(JLOOP2) - JLOOP2 = JLOOP2 + 1 - XB_LS(1 + INLEVEL - JLOOP1) = ZPV(JLOOP2) - END DO - CASE (5) - DO JLOOP1 = 1, INLEVEL - IF (HFILE(1:3)=='ATM') THEN - XA_LS(1 + INLEVEL - JLOOP1) = ZPV(1+ JLOOP1) / XP00_LS**2 - XB_LS(1 + INLEVEL - JLOOP1) = ZPV(2+INLEVEL+JLOOP1) - ELSE IF (HFILE=='CHEM') THEN - XA_SV_LS(1 + INLEVEL - JLOOP1) = ZPV(1+ JLOOP1) / XP00_LS**2 - XB_SV_LS(1 + INLEVEL - JLOOP1) = ZPV(2+INLEVEL+JLOOP1) - END IF - END DO - END SELECT - ELSE - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE','level definition section is missing') - END IF -ELSE - ALLOCATE (XA_LS(INLEVEL)) - ALLOCATE (XB_LS(0)) - IF (IMODEL==10) THEN - XA_LS = 100.*IP_GFS - ELSE - XA_LS = 100.*IP_ERA - END IF -END IF -! -!* 2.5.3 Compute atmospheric pressure on grib grid -! -WRITE (ILUOUT0,'(A)') ' | Atmospheric pressure on Grib grid is being computed' - -ALLOCATE (ZPF_G(INI,INLEVEL)) -IF (IMODEL/=10.AND.IMODEL/=11) THEN ! others than NCEP and ERA5 - IF (HFILE(1:3)=='ATM') THEN - ZPF_G(:,:) = SPREAD(XA_LS,1,INI)*XP00_LS + & - SPREAD(XB_LS,1,INI)*SPREAD(ZPS_G(1:INI),2,INLEVEL) - ELSE IF (HFILE=='CHEM') THEN - ZPF_G(:,:) = SPREAD(XA_SV_LS,1,INI)*XP00_SV_LS + & - SPREAD(XB_SV_LS,1,INI)*SPREAD(ZPS_G(1:INI),2,INLEVEL) - END IF -ELSE - IF (IMODEL==10) THEN - ZPF_G(:,:) = 100.*SPREAD(IP_GFS,1,INI) - ELSE - ZPF_G(:,:) = 100.*SPREAD(IP_ERA,1,INI) - END IF -END IF -DEALLOCATE (ZPS_G) -! -ALLOCATE (ZEXNF_G(INI,INLEVEL)) -ZEXNF_G(:,:) = (ZPF_G(:,:)/XP00)**(XRD/XCPD) -! -ALLOCATE (ZEXNM_G(INI,INLEVEL)) -ZEXNM_G(:,1:INLEVEL-1) = (ZEXNF_G(:,1:INLEVEL-1)-ZEXNF_G(:,2:INLEVEL)) / & - (LOG(ZEXNF_G(:,1:INLEVEL-1))-LOG(ZEXNF_G(:,2:INLEVEL))) -ZEXNM_G(:,INLEVEL) = (ZPF_G(:,INLEVEL)/2./XP00)**(XRD/XCPD) -! -IF (IMODEL==10.OR.IMODEL==11) ZEXNM_G(:,:)=ZEXNF_G(:,:) ! for GFS and ERA5 on pressure levels -! -DEALLOCATE (ZEXNF_G) -DEALLOCATE (ZPF_G) -! -ALLOCATE (ZPM_G(INI,INLEVEL)) -ZPM_G(:,:) = XP00*(ZEXNM_G(:,:))**(XCPD/XRD) -! -!* 2.5.4 Compute the relative humidity and the interpolate Thetav, P, Q and H -! -IF (IMODEL==1) THEN - ! search cloud_water in Arome case (forecast) - ISTARTLEVEL = 1 - IPAR=246 - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL) - IF (INUM < 0) THEN - ISTARTLEVEL = 0 - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL) - END IF - IF (INUM > 0) THEN - WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Arome model (forecast)' - LCPL_AROME=.TRUE. - NRR=6 - END IF - ! search also turbulent kinetic energy - ISTARTLEVEL = 1 - IPAR=251 - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL) - IF (INUM < 0) THEN - ISTARTLEVEL = 0 - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL) - END IF - IF (INUM > 0) CTURB='TKEL' -END IF - -IF (IMODEL==6) THEN ! GRIB2 AROME -! search cloud_water in Arome case (forecast) - ISTARTLEVEL = 1 - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=6,KNUMBER=6,KLEV1=ISTARTLEVEL) - IF (INUM < 0) THEN - ISTARTLEVEL = 0 - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=6,KNUMBER=6,KLEV1=ISTARTLEVEL) - END IF - IF (INUM < 0) THEN - ISTARTLEVEL = 1 - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=0,KLEV1=ISTARTLEVEL) - END IF - IF (INUM > 0) THEN - WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Arome model (forecast)' - LCPL_AROME=.TRUE. - NRR=6 - END IF - ! search also turbulent kinetic energy - ISTARTLEVEL = 1 - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=19,KNUMBER=11,KLEV1=ISTARTLEVEL) - IF (INUM < 0) THEN - ISTARTLEVEL = 0 - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=19,KNUMBER=11,KLEV1=ISTARTLEVEL) - END IF - IF (INUM > 0) CTURB='TKEL' -END IF -! -! -WRITE (ILUOUT0,'(A)') ' | Computing relative humidity on each level' -ALLOCATE (ZH_G(INI)) -ALLOCATE (ZH_LS(IIU,IJU,INLEVEL)) -IF (HFILE(1:3)=='ATM') THEN - ALLOCATE (XT_LS(IIU,IJU,INLEVEL)) - ALLOCATE (XQ_LS(IIU,IJU,INLEVEL,NRR)) ; XQ_LS=0. -ELSE IF (HFILE=='CHEM') THEN - ALLOCATE (XT_SV_LS(IIU,IJU,INLEVEL)) - ALLOCATE (XQ_SV_LS(IIU,IJU,INLEVEL,1)) -END IF -IF (CTURB=='TKEL') THEN - IF (ALLOCATED(XTKE_LS)) DEALLOCATE(XTKE_LS) - ALLOCATE(XTKE_LS(IIU,IJU,INLEVEL)) ; XTKE_LS=0. -ELSE - IF (ALLOCATED(XTKE_LS)) DEALLOCATE(XTKE_LS) - ALLOCATE(XTKE_LS(0,0,0)) -END IF -ALLOCATE (ZTHV_LS(IIU,IJU,INLEVEL)) -ALLOCATE (ZTHV_G(INI)) -ALLOCATE (ZRV_G(INI)) -ALLOCATE (ZOUT(INO)) -IF (IMODEL/=10) THEN ! others than NCEP - DO JLOOP1=1, INLEVEL - ! - ! Compute Theta V and relative humidity on grib grid - ! - ! (1/rv) = (1/q) - 1 - ! Thetav = T . (P0/P)^(Rd/Cpd) . ( (1 + (Rv/Rd).rv) / (1 + rv) ) - ! Hu = P / ( ( (Rd/Rv) . ((1/rv) - 1) + 1) . Es(T) ) - ! - ZRV_G(:) = 1. / (1./MAX(ZQ_G(:,JLOOP1),1.E-12) - 1.) - ! - ZTHV_G(:)=ZT_G(:,JLOOP1) * ((XP00/ZPM_G(:,JLOOP1))**(XRD/XCPD)) * & - ((1. + XRV*ZRV_G(:)/XRD) / (1. + ZRV_G(:))) - ! - ZH_G(1:INI) = 100. * ZPM_G(:,JLOOP1) / ( (XRD/XRV)*(1./ZRV_G(:)+1.)*SM_FOES(ZT_G(:,JLOOP1)) ) - ZH_G(:) = MAX(MIN(ZH_G(:),100.),0.) - ! - ! Interpolation : H - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZH_G,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) - CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,ZH_LS(:,:,JLOOP1)) - ZH_LS(:,:,JLOOP1) = MAX(MIN(ZH_LS(:,:,JLOOP1),100.),0.) - ! - ! interpolation : Theta V - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZTHV_G,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) - CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,ZTHV_LS(:,:,JLOOP1)) - ! - END DO -ELSE !GFS and ERA5 on pressure levels - DO JLOOP1=1, INLEVEL - ZH_G(:) =ZQ_G(:,JLOOP1) - ZRV_G(:) = (XRD/XRV)*SM_FOES(ZT_G(:,JLOOP1))*0.01*ZH_G(:) & - /(ZPM_G(:,JLOOP1) -SM_FOES(ZT_G(:,JLOOP1))*0.01*ZH_G(:)) - ZTHV_G(:)=ZT_G(:,JLOOP1) * ((XP00/ZPM_G(:,JLOOP1))**(XRD/XCPD)) * & - ((1. + XRV*ZRV_G(:)/XRD) / (1. + ZRV_G(:))) - ! - ! Interpolation : H - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZH_G,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) - CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,ZH_LS(:,:,JLOOP1)) - ZH_LS(:,:,JLOOP1) = MAX(MIN(ZH_LS(:,:,JLOOP1),100.),0.) - ! - ! interpolation : Theta V - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZTHV_G,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) - CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,ZTHV_LS(:,:,JLOOP1)) - ! - END DO -END IF - -DEALLOCATE (ZOUT) - - -!--------------------------------------------------------------------------------------- -!* 2.5.4.2 Read and interpol geopotential height for interpolation on isobaric surface Grid of NCEP -!--------------------------------------------------------------------------------------- -! -ALLOCATE (ZGH_G(ISIZE,INLEVEL)) -! -IF (IMODEL==10.OR.IMODEL==11) THEN !NCEP or ERA5 with pressure grid only - DO JLOOP1=1, INLEVEL - IF (IMODEL==10) THEN - ILEV1 = IP_GFS(JLOOP1) - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=3,KNUMBER=5,KLEV1=ILEV1) - ELSE - ILEV1 = IP_ERA(JLOOP1) - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=129,KLEV1=ILEV1) - END IF - IF (INUM< 0) THEN - !callabortstop - WRITE(YMSG,*) 'Geopotential height level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - ! - CALL GRIB_GET(IGRIB(INUM),'values',ZGH_G(:,JLOOP1),IRET_GRIB) - CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB) - ! - IF (IMODEL/=10) THEN - ! Data given in archives are multiplied by the gravity acceleration - ZGH_G(:,JLOOP1) = ZGH_G(:,JLOOP1) / XG - END IF - ! - END DO - ! - CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM_ZS),IIU,IJU,ZLONOUT,ZLATOUT,& - ZXOUT,ZYOUT,INI,ZPARAM,IINLO) - ! - ALLOCATE(ZOUT(INO)) - ALLOCATE(XGH_LS(IIU,IJU,INLEVEL)) - ! - DO JLOOP1=1, INLEVEL - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZGH_G(:,JLOOP1),INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) - CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,XGH_LS(:,:,JLOOP1)) - END DO - DEALLOCATE(ZOUT) -END IF -! -!* 2.5.5 Compute atmospheric pressure on MESO-NH grid -! -WRITE (ILUOUT0,'(A)') ' | Atmospheric pressure on the Meso-NH grid is being computed' -ALLOCATE (ZPF_LS(IIU,IJU,INLEVEL)) -IF (IMODEL/=10.AND.IMODEL/=11) THEN ! others than NCEP and ERA5 - IF (HFILE(1:3)=='ATM') THEN - ZPF_LS(:,:,:) = SPREAD(SPREAD(XA_LS,1,IIU),2,IJU)*XP00_LS + & - SPREAD(SPREAD(XB_LS,1,IIU),2,IJU)*SPREAD(XPS_LS,3,INLEVEL) - ELSE IF (HFILE=='CHEM') THEN - ZPF_LS(:,:,:) = SPREAD(SPREAD(XA_SV_LS,1,IIU),2,IJU)*XP00_LS + & - SPREAD(SPREAD(XB_SV_LS,1,IIU),2,IJU)*SPREAD(XPS_SV_LS,3,INLEVEL) - END IF -ELSE - IF(IMODEL==10) THEN - ZPF_LS(:,:,:) = 100.*SPREAD(SPREAD(IP_GFS,1,IIU),2,IJU) - ELSE - ZPF_LS(:,:,:) = 100.*SPREAD(SPREAD(IP_ERA,1,IIU),2,IJU) - END IF -END IF -! -ALLOCATE (ZEXNF_LS(IIU,IJU,INLEVEL)) -ZEXNF_LS(:,:,:) = (ZPF_LS(:,:,:)/XP00)**(XRD/XCPD) -! -ALLOCATE (ZEXNM_LS(IIU,IJU,INLEVEL)) -ZEXNM_LS(:,:,1:INLEVEL-1) = (ZEXNF_LS(:,:,1:INLEVEL-1)-ZEXNF_LS(:,:,2:INLEVEL)) / & - (LOG(ZEXNF_LS(:,:,1:INLEVEL-1))-LOG(ZEXNF_LS(:,:,2:INLEVEL))) -ZEXNM_LS(:,:,INLEVEL) = (ZPF_LS(:,:,INLEVEL)/2./XP00)**(XRD/XCPD) -! -IF (IMODEL==10.OR.IMODEL==11) ZEXNM_LS(:,:,:)=ZEXNF_LS(:,:,:) ! for GFS and ERA5 on pressure levels -! -DEALLOCATE (ZEXNF_LS) -DEALLOCATE (ZPF_LS) -! -ALLOCATE (ZPM_LS(IIU,IJU,INLEVEL)) -ZPM_LS(:,:,:) = XP00*(ZEXNM_LS(:,:,:))**(XCPD/XRD) -! -!* 2.5.6 Compute the vapor mixing ratio and the final specific humdity -! -! The vapor mixing ratio is calculated by an interating process on rv and -! Thetav. Have a look to MODE_THERMO for further informations. -ALLOCATE (ZR_DUM(IIU,IJU,INLEVEL,1)) -ALLOCATE (ZRV_LS(IIU,IJU,INLEVEL)) -ALLOCATE (ZTEV_LS(IIU,IJU,INLEVEL)) -ZTEV_LS(:,:,:) = ZTHV_LS(:,:,:) * ZEXNM_LS(:,:,:) -ZRV_LS(:,:,:) = SM_PMR_HU(ZPM_LS(:,:,:), & -ZTEV_LS(:,:,:),ZH_LS(:,:,:),ZR_DUM(:,:,:,:),KITERMAX=100) -IF (HFILE(1:3)=='ATM') THEN - XQ_LS(:,:,:,1) = ZRV_LS(:,:,:) / (1. + ZRV_LS(:,:,:)) -ELSE IF (HFILE=='CHEM') THEN - XQ_SV_LS(:,:,:,1) = ZRV_LS(:,:,:) / (1. + ZRV_LS(:,:,:)) -ENDIF -!JUAN -CALL MPPDB_CHECK3D(XQ_LS(:,:,:,1),"XQ_LS",PRECISION) -!JUAN -DEALLOCATE (ZTEV_LS) -DEALLOCATE (ZH_LS) -DEALLOCATE (ZR_DUM) -! -!* 2.5.7 Compute T from the interpolated Theta V -! -! T = Thetav . (P/P0)^(Rd/Cpd) . ((1 + rv) / (1 + (Rv/Rd).rv)) -!! -IF (HFILE(1:3)=='ATM') THEN - XT_LS(:,:,:) = ZTHV_LS(:,:,:) * ZEXNM_LS(:,:,:) & - * ((1.+ZRV_LS(:,:,:))/(1.+(XRV/XRD)*ZRV_LS(:,:,:))) - CALL MPPDB_CHECK3D(XT_LS,"XT_LS",PRECISION) -ELSE IF (HFILE=='CHEM') THEN - XT_SV_LS(:,:,:) = ZTHV_LS(:,:,:) * ZEXNM_LS(:,:,:) & - * ((1.+ZRV_LS(:,:,:))/(1.+(XRV/XRD)*ZRV_LS(:,:,:))) - CALL MPPDB_CHECK3D(XT_SV_LS,"XT_SV_LS",PRECISION) -ENDIF -! -DEALLOCATE (ZRV_LS) -DEALLOCATE (ZTHV_LS) -DEALLOCATE (ZPM_LS) -DEALLOCATE (ZEXNM_LS) -! -!* 2.5.8 Read the other specific ratios (if Arome model) -! -IF (NRR >1) THEN - IF (IMODEL==1) THEN - WRITE (ILUOUT0,'(A)') ' | Reading Q fields (except humidity)' - DO JLOOP2=1,NRR-1 - IPAR=246+JLOOP2-1 - DO JLOOP1=1, INLEVEL - ILEV1 = JLOOP1-1+ISTARTLEVEL - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ILEV1) - - IF (INUM < 0) THEN - WRITE(YMSG,*) 'Specific ratio ',IPAR,' at level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) - ALLOCATE(ZVALUE(ISIZE)) - CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE) - ALLOCATE(ZOUT(INO)) - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) - CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XQ_LS(:,:,INLEVEL-JLOOP1+1,1+JLOOP2)) - DEALLOCATE (ZVALUE) - DEALLOCATE (ZOUT) - END DO - END DO - ELSE ! GRIB2 AROME IMODEL =6 - WRITE (ILUOUT0,'(A)') ' | Reading Q fields (except humidity)' - DO JLOOP1=1, INLEVEL - ILEV1 = JLOOP1-1+ISTARTLEVEL - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=83,KLEV1=ILEV1) - - IF (INUM < 0) THEN - WRITE(YMSG,*) 'Specific ratio ',IPAR,' at level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) - ALLOCATE(ZVALUE(ISIZE)) - CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE) - ALLOCATE(ZOUT(INO)) - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) - CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XQ_LS(:,:,INLEVEL-JLOOP1+1,2)) - DEALLOCATE (ZVALUE) - DEALLOCATE (ZOUT) - END DO - - DO JLOOP1=1, INLEVEL - ILEV1 = JLOOP1-1+ISTARTLEVEL - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=85,KLEV1=ILEV1) - - IF (INUM < 0) THEN - WRITE(YMSG,*) 'Specific ratio for rain at level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) - ALLOCATE(ZVALUE(ISIZE)) - CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE) - ALLOCATE(ZOUT(INO)) - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) - CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XQ_LS(:,:,INLEVEL-JLOOP1+1,3)) - DEALLOCATE (ZVALUE) - DEALLOCATE (ZOUT) - END DO - - - DO JLOOP1=1, INLEVEL - ILEV1 = JLOOP1-1+ISTARTLEVEL - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=84,KLEV1=ILEV1) - IF (INUM < 0) THEN - WRITE(YMSG,*) 'Specific ratio for ICE at level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) - ALLOCATE(ZVALUE(ISIZE)) - CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE) - ALLOCATE(ZOUT(INO)) - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) - CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XQ_LS(:,:,INLEVEL-JLOOP1+1,4)) - DEALLOCATE (ZVALUE) - DEALLOCATE (ZOUT) - END DO - - - DO JLOOP1=1, INLEVEL - ILEV1 = JLOOP1-1+ISTARTLEVEL - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=86,KLEV1=ILEV1) - IF (INUM < 0) THEN - WRITE(YMSG,*) 'Specific ratio ',IPAR,' at level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) - ALLOCATE(ZVALUE(ISIZE)) - CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE) - ALLOCATE(ZOUT(INO)) - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) - CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XQ_LS(:,:,INLEVEL-JLOOP1+1,5)) - DEALLOCATE (ZVALUE) - DEALLOCATE (ZOUT) - END DO - - - DO JLOOP1=1, INLEVEL - ILEV1 = JLOOP1-1+ISTARTLEVEL - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=201,KLEV1=ILEV1) - IF (INUM < 0) THEN - WRITE(YMSG,*) 'Specific ratio ',IPAR,' at level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) - ALLOCATE(ZVALUE(ISIZE)) - CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE) - ALLOCATE(ZOUT(INO)) - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) - CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XQ_LS(:,:,INLEVEL-JLOOP1+1,6)) - DEALLOCATE (ZVALUE) - DEALLOCATE (ZOUT) - END DO - END IF -END IF -! -IF (CTURB=='TKEL') THEN - WRITE (ILUOUT0,'(A)') ' | Reading TKE field' - DO JLOOP1=1, INLEVEL - ILEV1 = JLOOP1-1+ISTARTLEVEL - IF (IMODEL==1) THEN - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=251,KLEV1=ILEV1) - ELSE ! case 6 new arome - CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=19,KNUMBER=11,KLEV1=ILEV1) - END IF - IF (INUM < 0) THEN - WRITE(YMSG,*) 'TKE at level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) - ALLOCATE(ZVALUE(ISIZE)) - CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE) - ALLOCATE(ZOUT(INO)) - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.) - CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XTKE_LS(:,:,INLEVEL-JLOOP1+1)) - DEALLOCATE (ZVALUE) - DEALLOCATE (ZOUT) - END DO -END IF -DEALLOCATE(IINLO) -! -!--------------------------------------------------------------------------------------- -!* 2.6 Interpolation of MOCAGE variable -!--------------------------------------------------------------------------------------- - -IF (IMODEL==5) THEN - LUSECHEM = .TRUE. - IF (LORILAM) THEN - CORGANIC = "MPMPO" - LVARSIGI = .TRUE. - LVARSIGJ = .TRUE. - END IF - ! initialise NSV_* variables - CALL INI_NSV(IMI) - IF( HFILE=='ATM0' ) THEN - ALLOCATE (XSV_LS(IIU,IJU,INLEVEL,NSV)) - ELSE IF (HFILE=='CHEM' ) THEN - DEALLOCATE(XSV_LS) - ALLOCATE (XSV_LS(IIU,IJU,INLEVEL,NSV)) - ELSE - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE','Mocage model: Bad input argument in read_all_data_grib_case') - END IF - XSV_LS(:,:,:,:) = 0. - ILEV1=-1 -! - WRITE (ILUOUT0,'(A,A4,A)') ' | Reading Mocage species (ppv) from ',HFILE,' file' -! -!* 2.6.1 read mocage species -! -! open input file - CALL CH_OPEN_INPUT(YPRE_MOC, "MOC2MESONH", TZFILE, ILUOUT0, KVERB) - ICHANNEL = TZFILE%NLU -! -! read number of mocage species to transfer into mesonh - READ(ICHANNEL, *) IMOC - IF (KVERB >= 5) WRITE(ILUOUT0,*) "number of mocage species to transfer into mesonh : ", IMOC -! -! read data input format - READ(ICHANNEL,"(A)") YFORMAT - YFORMAT=UPCASE(YFORMAT) - IF (KVERB >= 5) WRITE(ILUOUT0,*) "input format is: ", YFORMAT -! -! allocate fields - ALLOCATE(YMNHNAME(IMOC)) - ALLOCATE(INUMGRIB(IMOC)) -! -! read variables names and Grib code - IF (INDEX(YFORMAT,'A') < INDEX(YFORMAT,'I')) THEN - DO JI = 1, IMOC - READ(ICHANNEL,YFORMAT) YMNHNAME(JI), INUMGRIB(JI) - WRITE(ILUOUT0,YFORMAT) YMNHNAME(JI), INUMGRIB(JI) - END DO - ELSE - DO JI = 1, IMOC - READ(ICHANNEL,YFORMAT) INUMGRIB(JI), YMNHNAME(JI) - WRITE(ILUOUT0,YFORMAT) INUMGRIB(JI), YMNHNAME(JI) - END DO - ENDIF - ! - ! close file - CALL IO_File_close(TZFILE) - TZFILE => NULL() - ! - !* 2.6.2 exchange mocage values onto prognostic variables XSV_LS - ! - IF (KVERB >= 10) WRITE(ILUOUT0,'(A,I4)') ' NEQ=',NEQ - ! - DO JNREAL = 1, NEQ - INACT = 0 - search_loop2 : DO JN = 1, IMOC - IF (CNAMES(JNREAL) .EQ. YMNHNAME(JN)) THEN - INACT = JN - EXIT search_loop2 - END IF - END DO search_loop2 - IF (INACT .NE. 0) THEN - DO JLOOP1=1, INLEVEL - ILEV1 = JLOOP1 - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=INUMGRIB(JN),KLEV1=ILEV1) - IF (INUM < 0) THEN - WRITE(YMSG,*) 'Atmospheric ',INUMGRIB(JN),' grib chemical species level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB) - ALLOCATE(IINLO(INJ)) - CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,& - ZXOUT,ZYOUT,INI,ZPARAM,IINLO) - CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) - ALLOCATE(ZVALUE(ISIZE)) - CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE) - ALLOCATE(ZOUT(INO)) - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.TRUE. ) - CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU, & - XSV_LS(:,:,INLEVEL-JLOOP1+1,JNREAL)) - DEALLOCATE (ZVALUE) - DEALLOCATE (ZOUT) - DEALLOCATE(IINLO) - END DO - END IF - END DO - XSV_LS(:,:,:,:) = MAX(XSV_LS(:,:,:,:),0.) -ELSE - LORILAM = .FALSE. - LUSECHEM = .FALSE. - ! initialise NSV_* variables - CALL INI_NSV(1) - IF (NSV > 0) THEN - ALLOCATE (XSV_LS(IIU,IJU,INLEVEL,NSV)) - XSV_LS(:,:,:,:) = 0. - ELSE - ALLOCATE(XSV_LS(0,0,0,0)) - END IF -END IF -! -!--------------------------------------------------------------------------------------- -!* 2.7 Search, read, interpolate and project winds -!--------------------------------------------------------------------------------------- -! -! The way winds are processed depends upon the type of archive : -! -! -> ECMWF, NCEP -! Winds are projected from a standard lat,lon grid to MesoNH grid. This correcponds to -! a rotation of an angle : -! Alpha = k.(L-L0) - Beta -! k,L0 and Beta definiiton parameter of MesoNH grid -! L longitude of the point of the tangent coordinate system -! -! -> Aladin -! The grid used by Aladin files is the same than the one of MesoNH. ! -! So we have 2 sets of parameters : -! k L0 Beta for MesoNH -! k' L0' Beta' for Aladin (Beta'=0 for Aladin) -! We applied twice the formula seen for standard lat,lon grid and we get : -! Alpha = k.(L-L0) - Beta - k'.(L-L0') -! -! -> Arpege -! Arpege winds are given on the tangent coordinate system of the stretched grid. -! Therefore they have first to be projected on a standard lat,lon grid. This is done -! before the interpolation. The projection formulas were given by Meteo France. -! After this projection, the file is simil -! -IF (HFILE(1:3)=='ATM') THEN -ISTARTLEVEL = 1 -ALLOCATE (XU_LS(IIU,IJU,INLEVEL)) -ALLOCATE (XV_LS(IIU,IJU,INLEVEL)) -ALLOCATE (ZTU_LS(INO)) -ALLOCATE (ZTV_LS(INO)) -! -SELECT CASE (IMODEL) - CASE (0,6,7) - IPAR = 131 - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL) - IF (INUM< 0) THEN - ISTARTLEVEL = 0 - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL) - END IF - CASE (1,2,3) - IPAR = 33 - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL) - IF (INUM < 0) THEN - ISTARTLEVEL = 0 - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL) - END IF - CASE (10,11) - IPAR = 131 - ISTARTLEVEL = 1 -END SELECT - -DO JLOOP1 = ISTARTLEVEL, ISTARTLEVEL+INLEVEL-1 - IF (IMODEL/=10.AND.IMODEL/=11) THEN ! others than NCEP and ERA5 - ILEV1 = JLOOP1 - ELSE - IF(IMODEL==10) THEN - ILEV1 = IP_GFS(INLEVEL+ISTARTLEVEL-JLOOP1) - ELSE - ILEV1 = IP_ERA(INLEVEL+ISTARTLEVEL-JLOOP1) - END IF - END IF - ! read component u - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ILEV1) - IF (INUM < 0) THEN - WRITE(YMSG,*) 'wind vector component "u" at level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) - ALLOCATE(ZVALUE(ISIZE)) - CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE) - IF (IMODEL==3.OR.(IMODEL==7)) THEN - ALLOCATE(ZTU0_LS(INI)) - ZTU0_LS(:) = ZVALUE(:) - ELSE - CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB) - IF(ALLOCATED(IINLO)) DEALLOCATE (IINLO) - ALLOCATE(IINLO(INJ)) - CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,& - ZXOUT,ZYOUT,INI,ZPARAM,IINLO) - ALLOCATE(ZOUT(INO)) - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.TRUE.,PTIME_HORI,.FALSE. ) - ZTU_LS(:) = ZOUT(:) - DEALLOCATE(IINLO) - DEALLOCATE(ZOUT) - END IF - DEALLOCATE (ZVALUE) - ! read component v and perform interpolation if not Arpege grid - IF (IMODEL/=10.AND.IMODEL/=11) THEN ! others than NCEP and ERA5 - ILEV1 = JLOOP1 - ELSE - IF(IMODEL==10) THEN - ILEV1 = IP_GFS(INLEVEL+ISTARTLEVEL-JLOOP1) - ELSE - ILEV1 = IP_ERA(INLEVEL+ISTARTLEVEL-JLOOP1) - END IF - END IF - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR+1,KLEV1=ILEV1) - IF (INUM < 0) THEN - WRITE(YMSG,*) 'wind vector component "v" at level ',JLOOP1,' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) - ALLOCATE(ZVALUE(ISIZE)) - CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE) - IF ((IMODEL==3).OR.(IMODEL==7)) THEN - CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB) - ALLOCATE(IINLO(INJ)) - CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,& - ZXOUT,ZYOUT,INI,ZPARAM,IINLO) - ALLOCATE(ZTV0_LS(INI)) - ZTV0_LS(:) = ZVALUE(:) - ELSE - CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB) - ALLOCATE(IINLO(INJ)) - CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,& - ZXOUT,ZYOUT,INI,ZPARAM,IINLO) - ALLOCATE(ZOUT(INO)) - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.TRUE.,PTIME_HORI,.FALSE.) - ZTV_LS(:) = ZOUT(:) - DEALLOCATE(ZOUT) - END IF - DEALLOCATE (ZVALUE) - ! interpolations for arpege grid - IF ((IMODEL==3).OR.(IMODEL==7)) THEN - ! Comes back to real winds instead of stretched winds - ! (but still with components according to Arpege grid axes) - ZLATPOLE = ZPARAM(7) * XPI/180. - ZLONPOLE = ZPARAM(8) * XPI/180. - ZC = ZPARAM(9) - ZD = ZC * ZC - JLOOP3 = 0 - JLOOP4 = 1 - ZLAT = ZPARAM(3) * XPI / 180. - DO JLOOP2=1, INI - ZLON = JLOOP3 * 2. * XPI / IINLO(JLOOP4) - ! Compute the scale factor - ZA = ((1.+ZD) - (1.-ZD)*SIN(ZLAT)) / (2. * ZC) - ZTU0_LS(JLOOP2) = ZTU0_LS(JLOOP2) * ZA - ZTV0_LS(JLOOP2) = ZTV0_LS(JLOOP2) * ZA - ! next parallel - JLOOP3 = JLOOP3 + 1 - IF (JLOOP3 == IINLO(JLOOP4)) THEN - JLOOP3 = 0 - ZLAT = ZLAT + (((ZPARAM(5)-ZPARAM(3))/(ZPARAM(2)-1)) * XPI / 180.) - JLOOP4 = JLOOP4 + 1 - END IF - END DO - ! - ! interpolation - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,& - INI,ZTU0_LS,INO,ZXOUT,ZYOUT,ZTU_LS,.TRUE.,PTIME_HORI,.FALSE.) - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,& - INI,ZTV0_LS,INO,ZXOUT,ZYOUT,ZTV_LS,.TRUE.,PTIME_HORI,.FALSE.) - DEALLOCATE(IINLO) - ! - ! Rotation of the components from Arpege grid axes to real sphere axes - ! - DO JLOOP2=1, INO - ZLAT = ZYOUT(JLOOP2) * XPI / 180. - ZLON = ZXOUT(JLOOP2) * XPI / 180. - ! Compute the rotation matrix - ZA = (ZD+1.) + (ZD-1.)*SIN(ZLAT) - ZB = (ZD-1.) + (ZD+1.)*SIN(ZLAT) - ZE = 2.*ZC*COS(ZLATPOLE)*COS(ZLAT)*COS(ZLON) + ZB*SIN(ZLATPOLE) - IF (ABS(ZE) .GE. ABS(ZA)) THEN - ZF = -2.*ZC*COS(ZLATPOLE)/ ( COS(ZLAT)* ((ZD+1.)+(ZD-1.)*SIN(ZLATPOLE)) ) - ZSIN = -ZF*SIN(ZLONPOLE-ZLON) - ZCOS = ZF*COS(ZLONPOLE-ZLON) - ELSE - ZF = 1. / SQRT(ZA*ZA - ZE*ZE) - ZSIN = -COS(ZLATPOLE)*SIN(ZLON)*ZA*ZF - ZCOS = (2.*ZC*SIN(ZLATPOLE)*COS(ZLAT)-ZB*COS(ZLATPOLE)*COS(ZLON))*ZF - ENDIF - ZTEMP = ZTU_LS(JLOOP2) - ZTU_LS(JLOOP2) = ZCOS*ZTEMP - ZSIN*ZTV_LS(JLOOP2) - ZTV_LS(JLOOP2) = ZSIN*ZTEMP + ZCOS*ZTV_LS(JLOOP2) - END DO - END IF - ! - ! Rotation of the components from the real sphere axes (Arpege, CEP) - ! or model axes (Aladin) to MESO-NH axes - ! - JLOOP4=0 - DO JJ=1,IJU - DO JI=1,IIU - JLOOP4=JLOOP4+1 - IF (IMODEL==2 .OR. IMODEL==1 ) THEN - IF (IMODEL==2) THEN ! ALADIN REUNION - ZALPHA=0 - ELSE !ALADIN - ZALPHA = (XRPK*(ZLONOUT(JLOOP4)-XLON0)-XBETA) - & - (SIN(ZPARAM(9)*XPI/180.)*(ZLONOUT(JLOOP4)-ZPARAM(10))) - ENDIF - ELSE ! CEP, ARPEGE (after projection) - ZALPHA = XRPK*(ZLONOUT(JLOOP4)-XLON0)-XBETA - ENDIF - ZALPHA = ZALPHA * XPI / 180. - XU_LS(JI,JJ,INLEVEL+ISTARTLEVEL-JLOOP1)= & - ZTU_LS(JLOOP4)*COS(ZALPHA) - ZTV_LS(JLOOP4)*SIN(ZALPHA) - XV_LS(JI,JJ,INLEVEL+ISTARTLEVEL-JLOOP1)= & - ZTU_LS(JLOOP4)*SIN(ZALPHA) + ZTV_LS(JLOOP4)*COS(ZALPHA) - ENDDO - ENDDO - IF ((IMODEL==3).OR.(IMODEL==7)) THEN ! deallocation of Arpege arrays - DEALLOCATE (ZTU0_LS) - DEALLOCATE (ZTV0_LS) - END IF -END DO -DEALLOCATE (ZTU_LS) -DEALLOCATE (ZTV_LS) -IF(ALLOCATED(IINLO)) DEALLOCATE (IINLO) -END IF -! -!------------------------------------------------------------------------------- -!* 2.8 Filter the characteristics of the large-scale vortex -!------------------------------------------------------------------------------- -IF (HFILE(1:3)=='ATM' .AND. LFILTERING) THEN - WRITE (ILUOUT0,'(A)') ' | Starting the filtering of the fields to remove large-scale vortex' - IF (INDEX(CFILTERING,'Q')/=0) THEN - WRITE (ILUOUT0,'(A)') ' -> Filtering of Q is now available!' - WRITE (ILUOUT0,'(A,A5)') ' CFILTERING= ',CFILTERING - ENDIF - ! - IF (INDEX(CFILTERING,'P')/=0) THEN - ! compute reduced surface pressure - ALLOCATE(ZTVF_LS(IIU,IJU),ZMSLP_LS(IIU,IJU)) - ! compute pressure reduced to first level above mean sea level - ! (rather than above ground level) - ZGAMREF=-6.5E-3 - !virtual temperature at the first level above ground - ZTVF_LS(:,:) = XT_LS(:,:,1)*(1.+XQ_LS(:,:,1,1)*(XRV/XRD-1)) - !virtual temperature averaged between first level above ground - ! and first level above sea level - ZTVF_LS(:,:) = ZTVF_LS(:,:)-0.5*ZGAMREF*XZS_LS(:,:) - ZMSLP_LS(:,:)=XPS_LS(:,:)*EXP(XG*XZS_LS(:,:)/(XRD*ZTVF_LS(:,:))) - ENDIF - ! - IF (INDEX(CFILTERING,'P')==0) THEN - IF (INDEX(CFILTERING,'Q')==0) THEN - CALL REMOVAL_VORTEX(XZS_LS,XU_LS,XV_LS,XT_LS) - ELSE - CALL REMOVAL_VORTEX(XZS_LS,XU_LS,XV_LS,XT_LS,PQ_LS=XQ_LS(:,:,:,1)) - ENDIF - ELSE - IF (INDEX(CFILTERING,'Q')==0) THEN - CALL REMOVAL_VORTEX(XZS_LS,XU_LS,XV_LS,XT_LS,PPS_LS=ZMSLP_LS) - ELSE - CALL REMOVAL_VORTEX(XZS_LS,XU_LS,XV_LS,XT_LS,PQ_LS=XQ_LS(:,:,:,1),PPS_LS=ZMSLP_LS) - ENDIF - XPS_LS(:,:) = ZMSLP_LS(:,:)*EXP(-XG*XZS_LS(:,:)/(XRD*ZTVF_LS(:,:))) - DEALLOCATE(ZTVF_LS,ZMSLP_LS) - ENDIF - ! -END IF -! -!--------------------------------------------------------------------------------------- -!* 2.9 Read date -!--------------------------------------------------------------------------------------- -! -WRITE (ILUOUT0,'(A)') ' | Reading date' -CALL GRIB_GET(IGRIB(INUM),'dataDate',IDATE,IRET_GRIB) -CALL GRIB_GET(IGRIB(INUM),'dataTime',ITIME,IRET_GRIB) -TPTCUR%xtime=ITIME/100*3600+(ITIME-(ITIME/100)*100)*60 -TPTCUR%nyear=IDATE/10000 -TPTCUR%nmonth=INT((IDATE-TPTCUR%nyear*10000)/100) -TPTCUR%nday=IDATE-TPTCUR%nyear*10000-TPTCUR%nmonth*100 -CALL GRIB_GET(IGRIB(INUM),'startStep',ITIMESTEP,IRET_GRIB) -CALL GRIB_GET(IGRIB(INUM),'stepUnits',CSTEPUNIT,IRET_GRIB) -IF (IMODEL==0.OR.IMODEL==11) THEN - ITWOZS=0 - IF ((TPTCUR%nyear ==2000).AND.(TPTCUR%nmonth >11)) ITWOZS=1 - IF ((TPTCUR%nyear ==2000).AND.(TPTCUR%nmonth ==11)) THEN - IF ( (TPTCUR%nday >20 ) .OR. & - ((TPTCUR%nday ==20 ).AND.(TPTCUR%xtime >=64800 ))) ITWOZS=1 - END IF - IF ( TPTCUR%nyear ==2001 ) ITWOZS=1 - IF ((TPTCUR%nyear ==2002).AND.(TPTCUR%nmonth <11)) ITWOZS=1 - IF ((TPTCUR%nyear ==2002).AND.(TPTCUR%nmonth ==11)) THEN - IF ( (TPTCUR%nday <24 ) .OR. & - ((TPTCUR%nday ==25 ).AND.(TPTCUR%xtime <64800 ))) ITWOZS=1 - END IF - IF (ITWOZS==1) & - WRITE(ILUOUT0,*) ' Check that both orography fields on 1st model level and on surface are used.' -END IF - -CALL MPPDB_CHECK3D(XU_LS,"XU_LS",PRECISION) -CALL MPPDB_CHECK3D(XV_LS,"XV_LS",PRECISION) - -SELECT CASE (CSTEPUNIT) ! Time unit indicator - CASE ('h') !hour - TPTCUR%xtime = TPTCUR%xtime + ITIMESTEP*3600. - CASE ('m') !minute - TPTCUR%xtime = TPTCUR%xtime + ITIMESTEP*60. - CASE ('s') !minute - TPTCUR%xtime = TPTCUR%xtime + ITIMESTEP - CASE DEFAULT - WRITE (ILUOUT0,'(A,A,A)') ' | error CSTEPUNIT=',CSTEPUNIT, ' is different of s,m or h' -END SELECT -CALL DATETIME_CORRECTDATE(TPTCUR) -IF (HFILE(1:3)=='ATM') THEN - CALL SM_PRINT_TIME(TPTCUR,TLUOUT0,'MESONH current date') - TDTCUR = TPTCUR - TDTMOD = TPTCUR - TDTSEG = TPTCUR - TDTEXP = TPTCUR -ELSE IF (HFILE=='CHEM') THEN - CALL SM_PRINT_TIME(TPTCUR,TLUOUT0,'current date in MesoNH format') -ENDIF -! -!------------------------------------------------------------------------------- -!* 2.10 Read and interpolate dummy fields listed in free-format part of nml file -!------------------------------------------------------------------------------- -IF (ODUMMY_REAL) THEN - ! - WRITE (ILUOUT0,'(A)') ' | Try to read 2D dummy fields' - ! - !* 2.10.1 read 2D dummy fields - ! - ! close file - CALL IO_File_close(TPPRE_REAL1) - ! open input file - CALL CH_OPEN_INPUT(TPPRE_REAL1%CNAME, "DUMMY_2D", TZFILE, ILUOUT0, KVERB) - ICHANNEL = TZFILE%NLU - ! - ! read number of dummy 2D fields to transfer into mesonh - READ(ICHANNEL, *) IMOC - IF (KVERB >= 5) WRITE(ILUOUT0,*) "number of dummy fields to transfer into Mesonh : ", IMOC - ALLOCATE(XDUMMY_2D(IIU,IJU,IMOC),CDUMMY_2D(IMOC)) - ALLOCATE(INUMGRIB(IMOC),INUMLEV(IMOC),INUMLEV1(IMOC),INUMLEV2(IMOC)) - INUMLEV(:)=-1 ; INUMLEV1(:)=-1 ; INUMLEV2(:)=-1 - ! - IVAR=0 - ! read variables names and Grib codes - DO JI = 1, IMOC - READ(ICHANNEL,'(A)') YINPLINE - YINPLINE= TRIM(ADJUSTL(YINPLINE)) - IF (LEN_TRIM(YINPLINE) == 0) CYCLE ! skip blank line - ! transform tab and comma character into blank - DO JJ=1,LEN_TRIM(YINPLINE) - IF (YINPLINE(JJ:JJ)==YPTAB .OR. YINPLINE(JJ:JJ)==YPCOM) YINPLINE(JJ:JJ)= ' ' - END DO - IF (KVERB >= 10) WRITE(ILUOUT0,*) 'Line read : ', YINPLINE - ! extract field name - INDX= INDEX(YINPLINE,' ') - YFIELD= YINPLINE(1:INDX-1) - IF (KVERB >= 5) WRITE(ILUOUT0,*) 'Field being treated : ', YFIELD - ITYP=105 - ILEV1=-1 - ILEV2=-1 - ! extract the parameter indicator - YINPLINE= ADJUSTL(YINPLINE(INDX:)) - INDX= INDEX(YINPLINE,' ') - IF (INDX == 1) THEN - WRITE(ILUOUT0,*) ' Parameter indicator is missing. ',YFIELD,' not treated.' - CYCLE - END IF - IVAR=IVAR+1 - READ(YINPLINE(1:INDX-1),*) IPAR - IF (NVERB>=5) WRITE(ILUOUT0,*) ' Parameter indicator: ',IPAR - ! extract the level indicator (optional) - YINPLINE= ADJUSTL(YINPLINE(INDX:)) - INDX= INDEX(YINPLINE,' ') - IF (INDX /= 1) THEN - READ(YINPLINE(1:INDX-1),*) ITYP - IF (NVERB>=5) WRITE(ILUOUT0,*) ' Level indicator is indicated: ',ITYP - END IF - ! extract the first level value (optional) - YINPLINE= ADJUSTL(YINPLINE(INDX:)) - INDX= INDEX(YINPLINE,' ') - IF (INDX /= 1) THEN - READ(YINPLINE(1:INDX-1),*) ILEV1 - IF (NVERB>=5) WRITE(ILUOUT0,*) ' Level1 value is indicated: ',ILEV1 - END IF - ! extract the second level value (optional) - YINPLINE= ADJUSTL(YINPLINE(INDX:)) - INDX= INDEX(YINPLINE,' ') - IF (INDX /= 1) THEN - READ(YINPLINE(1:INDX-1),*) ILEV2 - IF (NVERB>=5) WRITE(ILUOUT0,*) ' Level2 value is indicated: ',ILEV2 - END IF - ! - CDUMMY_2D(IVAR)=YFIELD ; INUMGRIB(IVAR)=IPAR - INUMLEV(IVAR)=ITYP ; INUMLEV1(IVAR)=ILEV1 ; INUMLEV2(IVAR)=ILEV2 - ! - END DO - ! - CALL IO_File_close(TZFILE) - TZFILE => NULL() - ! - IF (NVERB>=10) THEN - WRITE(ILUOUT0,*) CDUMMY_2D(1:IVAR) - WRITE(ILUOUT0,*) INUMGRIB(1:IVAR) - WRITE(ILUOUT0,*) INUMLEV(1:IVAR) - WRITE(ILUOUT0,*) INUMLEV1(1:IVAR) - WRITE(ILUOUT0,*) INUMLEV2(1:IVAR) - END IF - ! - IF (IVAR /= IMOC) THEN - WRITE (ILUOUT0,'(A,I3,A,I3,A)') ' -> Number of correct lines (',IVAR,') is different of ',IMOC,' - abort' - WRITE(YMSG,*) 'number of correct lines (',IVAR,') is different of ',IMOC - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - ! - !* 2.10.2 read and interpolate variables onto dummy variables XDUMMY_2D - ! - DO JI = 1, IMOC - WRITE(ILUOUT0,'(A,4(I3,1X))') CDUMMY_2D(JI),INUMGRIB(JI),INUMLEV(JI),INUMLEV1(JI),INUMLEV2(JI) - CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ILEV1) - IF (INUM < 0) THEN - WRITE (ILUOUT0,'(A,I3,A,I2,A)') ' -> 2D field ',INUMGRIB(JI),' is missing - abort' - WRITE(YMSG,*) '2D field ',INUMGRIB(JI),' is missing' - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG) - END IF - CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB) - ALLOCATE(IINLO(INJ)) - CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,& - ZXOUT,ZYOUT,INI,ZPARAM,IINLO) - CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE) - ALLOCATE(ZVALUE(ISIZE)) - CALL GRIB_GET(IGRIB(INUM_ZS),'values',ZVALUE) - ALLOCATE(ZOUT(INO)) - CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, & - ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE. ) - DEALLOCATE(IINLO) - DEALLOCATE(ZVALUE) - CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XDUMMY_2D(:,:,JI)) - DEALLOCATE (ZOUT) - END DO -! -ENDIF -! -!--------------------------------------------------------------------------------------- -! -!* 3. VERTICAL GRID -! -IF (HFILE(1:3)=='ATM') THEN - WRITE (ILUOUT0,'(A)') ' | Reading of vertical grid in progress' - CALL READ_VER_GRID(TPPRE_REAL1) -END IF - -! -!--------------------------------------------------------------------------------------- -! -!* 4. Free all temporary allocations -! -DEALLOCATE (ZLATOUT) -DEALLOCATE (ZLONOUT) -DEALLOCATE (ZXOUT) -DEALLOCATE (ZYOUT) -DEALLOCATE(ZPARAM) -DEALLOCATE(ZPARAM_ZS) -DEALLOCATE(IINLO_ZS) -DO JLOOP=1,ICOUNT - CALL GRIB_RELEASE(IGRIB(JLOOP)) -ENDDO -DEALLOCATE(IGRIB) - -WRITE (ILUOUT0,'(A,A4,A)') ' -- Grib decoder for ',HFILE,' file ended successfully' -! -!--------------------------------------------------------------------------------------- -!--------------------------------------------------------------------------------------- -!--------------------------------------------------------------------------------------- -! -! - -! -CONTAINS -! -! -! ########################################################################## - SUBROUTINE ARRAY_1D_TO_2D (KN1,P1,KL1,KL2,P2) -! ########################################################################## -! -! Small routine used to store a linear array into a 2 dimension array -! -IMPLICIT NONE -INTEGER, INTENT(IN) :: KN1 -REAL,DIMENSION(KN1), INTENT(IN) :: P1 -INTEGER, INTENT(IN) :: KL1 -INTEGER, INTENT(IN) :: KL2 -REAL,DIMENSION(KL1,KL2),INTENT(OUT) :: P2 -INTEGER :: JLOOP1_A1T2 -INTEGER :: JLOOP2_A1T2 -INTEGER :: JPOS_A1T2 -! -IF (KN1 < KL1*KL2) THEN - CALL PRINT_MSG(NVERB_FATAL,'GEN','ARRAY_1D_TO_2D','sizes do not match') -END IF -JPOS_A1T2 = 1 -DO JLOOP2_A1T2 = 1, KL2 - DO JLOOP1_A1T2 = 1, KL1 - P2(JLOOP1_A1T2,JLOOP2_A1T2) = P1(JPOS_A1T2) - JPOS_A1T2 = JPOS_A1T2 + 1 - END DO -END DO -END SUBROUTINE ARRAY_1D_TO_2D -! -! -!--------------------------------------------------------------------------------------- -!--------------------------------------------------------------------------------------- -!--------------------------------------------------------------------------------------- -!################################################################################# -SUBROUTINE SEARCH_FIELD(KGRIB,KNUM,KPARAM,KDIS,KCAT,KNUMBER,KLEV1,KTFFS) -!################################################################################# -! search the grib message corresponding to KPARAM,KLTYPE,KLEV1,KLEV2 in all -! the KGIRB messages -! -USE MODD_LUNIT -USE GRIB_API -! -IMPLICIT NONE -! -! -INTEGER(KIND=kindOfInt),DIMENSION(:),INTENT(IN) :: KGRIB ! number of grib messages -INTEGER,INTENT(OUT) :: KNUM ! number of the message researched -INTEGER,INTENT(IN),OPTIONAL :: KPARAM ! INdicator of parameter/paramId -INTEGER,INTENT(IN),OPTIONAL :: KDIS ! Discipline (GRIB2) -INTEGER,INTENT(IN),OPTIONAL :: KCAT ! Catégorie (GRIB2) -INTEGER,INTENT(IN),OPTIONAL :: KNUMBER ! parameterNumber (GRIB2) -INTEGER,INTENT(IN),OPTIONAL :: KLEV1 ! Level -INTEGER,INTENT(IN),OPTIONAL :: KTFFS ! TypeOfFirstFixedSurface -! -! Declaration of local variables -! -INTEGER :: IFOUND ! Number of correct parameters -INTEGER :: ISEARCH ! Number of correct parameters to find -INTEGER :: IRET ! error code -INTEGER :: IPARAM,IDIS,ICAT,INUMBER,ITFFS -INTEGER :: ILEV1 ! Level parameter 1 -INTEGER :: JLOOP ! Dummy counter -INTEGER :: IVERSION -! Variables used to display messages -INTEGER :: ILUOUT0 ! Logical unit number of the listing -! -ILUOUT0 = TLUOUT0%NLU -! -ISEARCH=0 -! Initialize as not found -KNUM = -1 -! -IF (PRESENT(KPARAM)) ISEARCH=ISEARCH+1 -IF (PRESENT(KDIS)) ISEARCH=ISEARCH+1 -IF (PRESENT(KCAT)) ISEARCH=ISEARCH+1 -IF (PRESENT(KNUMBER)) ISEARCH=ISEARCH+1 -IF (PRESENT(KLEV1)) ISEARCH=ISEARCH+1 -IF(PRESENT(KTFFS)) ISEARCH=ISEARCH+1 -! -DO JLOOP=1,SIZE(KGRIB) - IFOUND = 0 - ! - CALL GRIB_GET(KGRIB(JLOOP),'editionNumber',IVERSION,IRET_GRIB) - IF (IRET_GRIB > 0) THEN - WRITE (ILUOUT0,'(A)')' | Error encountered in the Grib file, skipping field' - CYCLE - ELSE IF (IRET_GRIB == -6) THEN - WRITE (ILUOUT0,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field' - CYCLE - ENDIF - ! - IF (PRESENT(KTFFS)) THEN - CALL GRIB_GET(KGRIB(JLOOP),'typeOfFirstFixedSurface',ITFFS,IRET_GRIB) - IF (IRET_GRIB > 0) THEN - WRITE (ILUOUT0,'(A)')' | Error encountered in the Grib file, skipping field' - CYCLE - ELSE IF (IRET_GRIB == -6) THEN - WRITE (ILUOUT0,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field' - CYCLE - ENDIF - IF (ITFFS==KTFFS) THEN - IFOUND = IFOUND + 1 - ELSE - CYCLE - ENDIF - ENDIF - - IF (PRESENT(KPARAM)) THEN - IF (IVERSION == 2) THEN - CALL GRIB_GET(KGRIB(JLOOP),'paramId',IPARAM,IRET_GRIB) - ELSE - CALL GRIB_GET(KGRIB(JLOOP),'indicatorOfParameter',IPARAM,IRET_GRIB) - ENDIF - IF (IRET_GRIB > 0) THEN - WRITE (ILUOUT0,'(A)')' | Error encountered in the Grib file, skipping field' - CYCLE - ELSE IF (IRET_GRIB == -6) THEN - WRITE (ILUOUT0,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field' - CYCLE - ENDIF - IF (IPARAM==KPARAM) THEN - IFOUND = IFOUND + 1 - ELSE - CYCLE - ENDIF - ENDIF - ! - IF (PRESENT(KDIS)) THEN - CALL GRIB_GET(KGRIB(JLOOP),'discipline',IDIS,IRET_GRIB) - IF (IRET_GRIB > 0) THEN - WRITE (ILUOUT0,'(A)')' | Error encountered in the Grib file, skipping field' - CYCLE - ELSE IF (IRET_GRIB == -6) THEN - WRITE (ILUOUT0,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field' - CYCLE - ENDIF - IF (IDIS==KDIS) THEN - IFOUND = IFOUND + 1 - ELSE - CYCLE - ENDIF - ENDIF - IF (PRESENT(KCAT)) THEN - CALL GRIB_GET(KGRIB(JLOOP),'parameterCategory',ICAT,IRET_GRIB) - IF (IRET_GRIB > 0) THEN - WRITE (ILUOUT0,'(A)')' | Error encountered in the Grib file, skipping field' - CYCLE - ELSE IF (IRET_GRIB == -6) THEN - WRITE (ILUOUT0,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field' - CYCLE - ENDIF - IF (ICAT==KCAT) THEN - IFOUND = IFOUND + 1 - ELSE - CYCLE - ENDIF - ENDIF - IF (PRESENT(KNUMBER)) THEN - CALL GRIB_GET(KGRIB(JLOOP),'parameterNumber',INUMBER,IRET_GRIB) - IF (IRET_GRIB > 0) THEN - WRITE (ILUOUT0,'(A)')' | Error encountered in the Grib file, skipping field' - CYCLE - ELSE IF (IRET_GRIB == -6) THEN - WRITE (ILUOUT0,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field' - CYCLE - ENDIF - IF (INUMBER==KNUMBER) THEN - IFOUND = IFOUND + 1 - ELSE - CYCLE - ENDIF - ENDIF - ! - IF(PRESENT(KLEV1)) THEN - CALL GRIB_GET(KGRIB(JLOOP),'topLevel',ILEV1,IRET_GRIB) - IF (IRET_GRIB > 0) THEN - WRITE (ILUOUT0,'(A)')' | Error encountered in the Grib file, skipping field' - CYCLE - ELSE IF (IRET_GRIB == -6) THEN - WRITE (ILUOUT0,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field' - CYCLE - ENDIF - IF (ILEV1==KLEV1) THEN - IFOUND = IFOUND + 1 - ELSE - CYCLE - ENDIF - ENDIF - ! - IF (IFOUND == ISEARCH) THEN - KNUM=JLOOP - EXIT - ELSE ! field not found - KNUM=-1 - END IF -END DO -! -END SUBROUTINE SEARCH_FIELD -!################################################################################# -SUBROUTINE COORDINATE_CONVERSION(KMODEL,KGRIB,KNOLON,KNOLARG,& - PLONOUT,PLATOUT,PLXOUT,PLYOUT,KNI,PPARAM,KINLO) -!################################################################################# -!perform coordinate conversion from lat/lon system to x,y (depends on the grib -! type) -!! AUTHOR -!! ------ -!! -!! G. Tanguy -!! -!! MODIFICATIONS -!! ------------- -!! -!! Original 08/06/2010 - -USE MODD_CST -USE MODI_LATLONTOXY -USE GRIB_API -! -IMPLICIT NONE -! -! -INTEGER(KIND=kindOfInt),INTENT(IN) :: KGRIB ! number of the grib message -INTEGER,INTENT(IN) :: KMODEL ! number of the model -INTEGER,INTENT(OUT) :: KNI ! number of points -INTEGER,INTENT(IN) :: KNOLON,KNOLARG ! Number of output points -REAL,DIMENSION( KNOLON*KNOLARG),INTENT(IN) :: PLONOUT ! Output coordinate, -REAL,DIMENSION( KNOLON*KNOLARG),INTENT(IN) :: PLATOUT ! lat/lon system -REAL,DIMENSION( KNOLON*KNOLARG),INTENT(INOUT) :: PLXOUT ! Converted output coordinates -REAL,DIMENSION( KNOLON*KNOLARG),INTENT(INOUT) :: PLYOUT ! (depends on Grib Grid type) -REAL,DIMENSION(:),INTENT(INOUT) :: PPARAM ! output parameters of -! the grid to avoid many calculations -INTEGER,DIMENSION(:),INTENT(INOUT) :: KINLO ! Number of points along a parallel -!=============================== -INTEGER :: IINLA ! Number of points along a meridian -INTEGER :: JLOOP1,JLOOP2 ! Dummy counter -INTEGER :: INO ! Number of output points -REAL :: ZILA1 ! Grib first point latitude -REAL :: ZILO1 ! Grib first point longitude -REAL :: ZILA2 ! Grib last point latitude -REAL :: ZILO2 ! Grib last point longitude -REAL :: ZILASP ! Grib streching pole lat -REAL :: ZILOSP ! Grib streching pole lon -LOGICAL :: GREADY ! Used to test if projection is needed -INTEGER :: ILENX ! nb points in X -INTEGER :: ILENY ! nb points in Y -INTEGER :: IEARTH ! -REAL :: ZSTRECH ! streching of arpege grid -INTEGER(KIND=kindOfInt) :: IMISSING ! dummy variable -! Aladin projection -REAL :: ZALALAT0 ! Grid definition parameters -REAL :: ZALALON0 ! | -REAL :: ZALALATOR ! | -REAL :: ZALALONOR ! | -REAL :: ZALARPK ! | -REAL, DIMENSION(:,:), ALLOCATABLE :: ZXM ! Intermediate arrays -REAL, DIMENSION(:,:), ALLOCATABLE :: ZYM ! | -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLONM ! | -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLATM ! | -! CEP projection -REAL, DIMENSION(:), ALLOCATABLE :: ZLATGRIB -REAL, DIMENSION(:), ALLOCATABLE :: ZLONGRIB -INTEGER :: INBLATGRIB,INBLONGRIB -!JUAN -INTEGER(KIND=kindOfInt),DIMENSION(:),ALLOCATABLE :: INLO_GRIB ! Number of points along a parallel -!JUAN -! -!-------------------------------------------------------------------------------- -! -!JUAN -ALLOCATE(INLO_GRIB(SIZE(KINLO))) -!JUAN -INO= KNOLON*KNOLARG -SELECT CASE (KMODEL) -! -CASE(0,5,11) ! CEP/MOCAGE/ERA5 -! en theorie il faut ces 4 lignes -! CALL GRIB_GET(KGRIB,'latitudeOfFirstGridPointInDegrees',ZILA1) -! CALL GRIB_GET(KGRIB,'longitudeOfFirstGridPointInDegrees',ZILO1) -! CALL GRIB_GET(KGRIB,'latitudeOfLastGridPointInDegrees',ZILA2) -! CALL GRIB_GET(KGRIB,'longitudeOfLastGridPointInDegrees',ZILO2) -! pourtant au passage de GRIB1 a GRIB2 les arrondi etait fait differement -! et on n'obtenais pas les meme resultat entre un fichier grib1 et le meme -! convertit en GRIB2 -! Du coup en faisant ce qui suit on prend une valeur recalculee par grib_api -! suivant l'ordre N de la gausienne donc plus precise et donc la meme entre le -! GRIB1 et le GRIB2 - CALL GRIB_GET(KGRIB,'Nj',IINLA,IRET_GRIB) - CALL GRIB_GET_SIZE(KGRIB,'latitudes',INBLATGRIB) - CALL GRIB_GET_SIZE(KGRIB,'longitudes',INBLONGRIB) - ALLOCATE(ZLATGRIB(INBLATGRIB)) - ALLOCATE(ZLONGRIB(INBLONGRIB)) - CALL GRIB_GET(KGRIB,'latitudes',ZLATGRIB) - CALL GRIB_GET(KGRIB,'longitudes',ZLONGRIB) - ZILA1=MAXVAL(ZLATGRIB) - ZILO1=MINVAL(ZLONGRIB) - ZILA2=MINVAL(ZLATGRIB) - ZILO2=MAXVAL(ZLONGRIB) - KNI=0 - CALL GRIB_IS_MISSING(KGRIB,'pl',IMISSING,IRET_GRIB) - IF (IRET_GRIB /= 0 .OR. IMISSING==1) THEN ! pl not present - CALL GRIB_GET(KGRIB,'Ni',INLO_GRIB(1),IRET_GRIB) - INLO_GRIB(2:)=INLO_GRIB(1) - KNI=IINLA*INLO_GRIB(1) - GREADY= (PPARAM(1)==INLO_GRIB(1) .AND. PPARAM(2)==IINLA .AND.& - PPARAM(3)==ZILA1 .AND. PPARAM(4)==ZILO1 .AND.& - PPARAM(5)==ZILA2 .AND. PPARAM(6)==ZILO2) - PPARAM(1)=INLO_GRIB(1) - PPARAM(2)=IINLA - PPARAM(3)=ZILA1 - PPARAM(4)=ZILO1 - PPARAM(5)=ZILA2 - PPARAM(6)=ZILO2 - ELSE ! pl present in the grib - CALL GRIB_GET(KGRIB,'pl',INLO_GRIB) - DO JLOOP1=1 ,IINLA - KNI = KNI + INLO_GRIB(JLOOP1) - ENDDO - GREADY= (PPARAM(1)==INLO_GRIB(1) .AND.& - PPARAM(3)==ZILA1 .AND. PPARAM(4)==ZILO1 .AND.& - PPARAM(5)==ZILA2 .AND. PPARAM(6)==ZILO2) - PPARAM(1)=INLO_GRIB(1) - PPARAM(2)=IINLA - PPARAM(3)=ZILA1 - PPARAM(4)=ZILO1 - PPARAM(5)=ZILA2 - PPARAM(6)=ZILO2 - END IF - IF (.NOT. GREADY) THEN - PLXOUT=PLONOUT - PLYOUT=PLATOUT - ENDIF -! -CASE(1,6) ! ALADIN -! - CALL GRIB_GET(KGRIB,'Nj',IINLA,IRET_GRIB) - CALL GRIB_GET(KGRIB,'Ni',INLO_GRIB(1),IRET_GRIB) - INLO_GRIB(2:)=INLO_GRIB(1) - CALL GRIB_GET(KGRIB,'DxInMetres',ILENX) - CALL GRIB_GET(KGRIB,'DyInMetres',ILENY) - CALL GRIB_GET(KGRIB,'LoVInDegrees',ZALALON0) - CALL GRIB_GET(KGRIB,'Latin1InDegrees',ZALALAT0) - KNI = IINLA*INLO_GRIB(1) - ZILA1 = 0. - ZILO1 = 0. - ZILA2 = ZILA1 + (IINLA -1)*ILENY - ZILO2 = ZILO1 + (INLO_GRIB(1)-1)*ILENX - GREADY= (PPARAM(1)==INLO_GRIB(1) .AND. PPARAM(2)==IINLA .AND.& - PPARAM(3)==ZILA1 .AND. PPARAM(4)==ZILO1 .AND.& - PPARAM(5)==ZILA2 .AND. PPARAM(6)==ZILO2.AND.& - PPARAM(7)==ILENX .AND. PPARAM(8)==ILENY.AND.& - PPARAM(9)==ZALALAT0 .AND. PPARAM(10)==ZALALON0) - IF(.NOT. GREADY) THEN - PPARAM(1)=INLO_GRIB(1) - PPARAM(2)=IINLA - PPARAM(3)=ZILA1 - PPARAM(4)=ZILO1 - PPARAM(5)=ZILA2 - PPARAM(6)=ZILO2 - PPARAM(7)=ILENX - PPARAM(8)=ILENY - PPARAM(9)=ZALALAT0 - PPARAM(10)=ZALALON0 -! - IF (ZALALON0 > 180.) ZALALON0 = ZALALON0 - 360. - CALL GRIB_GET(KGRIB,'latitudeOfFirstGridPointInDegrees',ZALALATOR) - CALL GRIB_GET(KGRIB,'longitudeOfFirstGridPointInDegrees',ZALALONOR) - IF (ZALALONOR > 180.) ZALALONOR = ZALALONOR - 360. - ZALARPK = SIN(ZALALAT0/180.*XPI) - ALLOCATE (ZXM(KNOLON,KNOLARG)) - ALLOCATE (ZYM(KNOLON,KNOLARG)) - ALLOCATE (ZLONM(KNOLON,KNOLARG)) - ALLOCATE (ZLATM(KNOLON,KNOLARG)) - JLOOP1=0 - DO JLOOP2=1, KNOLARG - ZLONM(1:KNOLON,JLOOP2) = PLONOUT(1+JLOOP1:KNOLON+JLOOP1) - ZLATM(1:KNOLON,JLOOP2) = PLATOUT(1+JLOOP1:KNOLON+JLOOP1) - JLOOP1 = JLOOP1+KNOLON - END DO - CALL SM_LATLONTOXY_A (ZALALAT0,ZALALON0,ZALARPK,ZALALATOR,ZALALONOR, & - ZXM,ZYM,ZLATM,ZLONM,KNOLON,KNOLARG,6367470.) - JLOOP1=0 - DO JLOOP2=1, KNOLARG - PLXOUT(1+JLOOP1:KNOLON+JLOOP1)=ZXM(1:KNOLON,JLOOP2) - PLYOUT(1+JLOOP1:KNOLON+JLOOP1)=ZYM(1:KNOLON,JLOOP2) - JLOOP1 = JLOOP1+KNOLON - ENDDO - DEALLOCATE (ZLATM) - DEALLOCATE (ZLONM) - DEALLOCATE (ZYM) - DEALLOCATE (ZXM) - END IF -! -CASE(2) ! ALADIN REUNION -! - CALL GRIB_GET(KGRIB,'Nj',IINLA,IRET_GRIB) - CALL GRIB_GET(KGRIB,'Ni',INLO_GRIB(1),IRET_GRIB) - INLO_GRIB(2:)=INLO_GRIB(1) - CALL GRIB_GET(KGRIB,'DiInMetres',ILENX) - CALL GRIB_GET(KGRIB,'DjInMetres',ILENY) - CALL GRIB_GET(KGRIB,'LaDInDegrees',ZALALAT0) - KNI = IINLA*INLO_GRIB(1) - ZILA1 = 0. - ZILO1 = 0. - ZILA2 = ZILA1 + (IINLA -1)*ILENY - ZILO2 = ZILO1 + (INLO_GRIB(1)-1)*ILENX - GREADY= (PPARAM(1)==INLO_GRIB(1) .AND. PPARAM(2)==IINLA .AND.& - PPARAM(3)==ZILA1 .AND. PPARAM(4)==ZILO1 .AND.& - PPARAM(5)==ZILA2 .AND. PPARAM(6)==ZILO2.AND.& - PPARAM(7)==ILENX .AND. PPARAM(8)==ILENY.AND.& - PPARAM(9)==ZALALAT0) - IF(.NOT. GREADY) THEN - PPARAM(1)=INLO_GRIB(1) - PPARAM(2)=IINLA - PPARAM(3)=ZILA1 - PPARAM(4)=ZILO1 - PPARAM(5)=ZILA2 - PPARAM(6)=ZILO2 - PPARAM(7)=ILENX - PPARAM(8)=ILENY - PPARAM(9)=ZALALAT0 - ZALALON0 = 0. - CALL GRIB_GET(KGRIB,'latitudeOfFirstGridPointInDegrees',ZALALATOR) - CALL GRIB_GET(KGRIB,'longitudeOfFirstGridPointInDegrees',ZALALONOR) - IF (ZALALONOR > 180.) ZALALONOR = ZALALONOR - 360. - ZALARPK = 0 - ALLOCATE (ZXM(KNOLON,KNOLARG)) - ALLOCATE (ZYM(KNOLON,KNOLARG)) - ALLOCATE (ZLONM(KNOLON,KNOLARG)) - ALLOCATE (ZLATM(KNOLON,KNOLARG)) - JLOOP1=0 - DO JLOOP2=1, KNOLARG - ZLONM(1:KNOLON,JLOOP2) = PLONOUT(1+JLOOP1:KNOLON+JLOOP1) - ZLATM(1:KNOLON,JLOOP2) = PLATOUT(1+JLOOP1:KNOLON+JLOOP1) - JLOOP1 = JLOOP1+KNOLON - END DO - CALL GRIB_GET(KGRIB,'earthIsOblate',IEARTH) - IF (IEARTH==0) THEN - CALL SM_LATLONTOXY_A (ZALALAT0,ZALALON0,ZALARPK,ZALALATOR,ZALALONOR, & - ZXM,ZYM,ZLATM,ZLONM,KNOLON,KNOLARG,6367470.) - ELSE - CALL SM_LATLONTOXY_A (ZALALAT0,ZALALON0,ZALARPK,ZALALATOR,ZALALONOR, & - ZXM,ZYM,ZLATM,ZLONM,KNOLON,KNOLARG) - END IF - JLOOP1=0 - DO JLOOP2=1, KNOLARG - PLXOUT(1+JLOOP1:KNOLON+JLOOP1)=ZXM(1:KNOLON,JLOOP2) - PLYOUT(1+JLOOP1:KNOLON+JLOOP1)=ZYM(1:KNOLON,JLOOP2) - JLOOP1 = JLOOP1+KNOLON - ENDDO - DEALLOCATE (ZLATM) - DEALLOCATE (ZLONM) - DEALLOCATE (ZYM) - DEALLOCATE (ZXM) - END IF -! -CASE(3,4,7) ! ARPEGE -! -!print*,"=========COORDINATE CONVERSION CASE ARPEGE =============" -! PROBLEME AVEC LES GRIB d'EPYGRAM -! dans longitudeOfLastGridPointInDegrees on la la longitude du dernier point du -! tableau (donc au pole sud) -! dans les GRIB1 ont avait la valeur max du tableau des longitude (donc à -! l'equateur) - CALL GRIB_GET(KGRIB,'latitudeOfFirstGridPointInDegrees',ZILA1) - CALL GRIB_GET(KGRIB,'longitudeOfFirstGridPointInDegrees',ZILO1) - CALL GRIB_GET(KGRIB,'latitudeOfLastGridPointInDegrees',ZILA2) - CALL GRIB_GET(KGRIB,'longitudeOfLastGridPointInDegrees',ZILO2) - CALL GRIB_GET(KGRIB,'latitudeOfStretchingPoleInDegrees',ZILASP) - CALL GRIB_GET(KGRIB,'longitudeOfStretchingPoleInDegrees',ZILOSP) - CALL GRIB_GET(KGRIB,'stretchingFactor',ZSTRECH) - CALL GRIB_GET(KGRIB,'Nj',IINLA,IRET_GRIB) -! - KNI=0 - CALL GRIB_IS_MISSING(KGRIB,'pl',IRET_GRIB) - IF (IRET_GRIB == 1) THEN ! regular - CALL GRIB_GET(KGRIB,'Ni',INLO_GRIB(1),IRET_GRIB) - INLO_GRIB(2:)=INLO_GRIB(1) - KNI=IINLA*INLO_GRIB(1) - GREADY= (PPARAM(1)==INLO_GRIB(1) .AND. PPARAM(2)==IINLA .AND.& - PPARAM(3)==ZILA1 .AND. PPARAM(4)==ZILO1 .AND.& - PPARAM(5)==ZILA2 .AND. PPARAM(6)==ZILO2 .AND.& - PPARAM(7)==ZILASP .AND. PPARAM(8)==ZILOSP .AND.& - PPARAM(9)==ZSTRECH) - ELSE ! quasi-regular - CALL GRIB_GET(KGRIB,'pl',INLO_GRIB) - DO JLOOP1=1 ,IINLA - KNI = KNI + INLO_GRIB(JLOOP1) - ENDDO - ZILO2=360.-360./(MAXVAL(INLO_GRIB)) - GREADY= (PPARAM(1)==INLO_GRIB(1) .AND.& - PPARAM(3)==ZILA1 .AND. PPARAM(4)==ZILO1 .AND.& - PPARAM(5)==ZILA2 .AND. PPARAM(6)==ZILO2 .AND.& - PPARAM(7)==ZILASP .AND. PPARAM(8)==ZILOSP .AND.& - PPARAM(9)==ZSTRECH) - END IF -! - IF (.NOT. GREADY) THEN - CALL ARPEGE_STRETCH_A(INO,ZILASP,ZILOSP, & - ZSTRECH,PLATOUT,PLONOUT,PLYOUT,PLXOUT) - PPARAM(1)=INLO_GRIB(1) - PPARAM(2)=IINLA - PPARAM(3)=ZILA1 - PPARAM(4)=ZILO1 - PPARAM(5)=ZILA2 - PPARAM(6)=ZILO2 - PPARAM(7)=ZILASP - PPARAM(8)=ZILOSP - PPARAM(9)=ZSTRECH - END IF -! -CASE(10) ! NCEP -! - CALL GRIB_GET(KGRIB,'latitudeOfFirstGridPointInDegrees',ZILA1) - CALL GRIB_GET(KGRIB,'longitudeOfFirstGridPointInDegrees',ZILO1) - CALL GRIB_GET(KGRIB,'latitudeOfLastGridPointInDegrees',ZILA2) - CALL GRIB_GET(KGRIB,'longitudeOfLastGridPointInDegrees',ZILO2) - CALL GRIB_GET(KGRIB,'Nj',IINLA,IRET_GRIB) - CALL GRIB_GET(KGRIB,'Ni',INLO_GRIB(1),IRET_GRIB) - INLO_GRIB(2:)=INLO_GRIB(1) - KNI=IINLA*INLO_GRIB(1) - GREADY= (PPARAM(1)==INLO_GRIB(1) .AND. PPARAM(2)==IINLA .AND.& - PPARAM(3)==ZILA1 .AND. PPARAM(4)==ZILO1 .AND.& - PPARAM(5)==ZILA2 .AND. PPARAM(6)==ZILO2) - PPARAM(1)=INLO_GRIB(1) - PPARAM(2)=IINLA - PPARAM(3)=ZILA1 - PPARAM(4)=ZILO1 - PPARAM(5)=ZILA2 - PPARAM(6)=ZILO2 - IF (.NOT. GREADY) THEN - PLXOUT=PLONOUT - PLYOUT=PLATOUT - ENDIF -END SELECT -!JUAN -KINLO=INLO_GRIB -!JUAN -END SUBROUTINE COORDINATE_CONVERSION -! -! ################################################################### - SUBROUTINE ARPEGE_STRETCH_A(KN,PLAP,PLOP,PCOEF,PLAR,PLOR,PLAC,PLOC) -! ################################################################### -!!**** *ARPEGE_STRETCH_A* - Projection to Arpege stretched grid -!! -!! PURPOSE -!! ------- -!! -!! Projection from standard Lat,Lon grid to Arpege stretched grid -!! -!! METHOD -!! ------ -!! -!! The projection is defined in two steps : -!! 1. A rotation to place the stretching pole at the north pole -!! 2. The stretching -!! This routine is a basic implementation of the informations founded in -!! 'Note de travail Arpege nr.3' -!! 'Transformation de coordonnees' -!! J.F.Geleyn 1988 -!! This document describes a slightly different transformation in 3 steps. Only the -!! two first steps are to be taken in account (at the time of writing this paper has -!! not been updated). -!! -!! EXTERNAL -!! -------- -!! -!! Module MODD_CST -!! XPI -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! This routine is based on : -!! 'Note de travail ARPEGE' number 3 -!! by J.F. GELEYN (may 1988) -!! -!! AUTHOR -!! ------ -!! -!! V.Bousquet -!! -!! MODIFICATIONS -!! ------------- -!! -!! Original 07/01/1999 -!! -!---------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! --------------- -! -USE MODD_CST -! -IMPLICIT NONE -! -!* 0.1. Declaration of arguments -! ----------------------------- -! -INTEGER, INTENT(IN) :: KN ! Number of points to convert -REAL, INTENT(IN) :: PLAP ! Latitude of stretching pole -REAL, INTENT(IN) :: PLOP ! Longitude of stretching pole -REAL, INTENT(IN) :: PCOEF ! Stretching coefficient -REAL, DIMENSION(KN), INTENT(IN) :: PLAR ! Lat. of points -REAL, DIMENSION(KN), INTENT(IN) :: PLOR ! Lon. of points -REAL, DIMENSION(KN), INTENT(OUT) :: PLAC ! Computed pseudo-lat. of points -REAL, DIMENSION(KN), INTENT(OUT) :: PLOC ! Computed pseudo-lon. of points -! -!* 0.2. Declaration of local variables -! ----------------------------------- -! -REAL :: ZSINSTRETCHLA ! Sine of stretching point lat. -REAL :: ZSINSTRETCHLO ! Sine of stretching point lon. -REAL :: ZCOSSTRETCHLA ! Cosine of stretching point lat. -REAL :: ZCOSSTRETCHLO ! Cosine of stretching point lon. -REAL :: ZSINLA ! Sine of computed point latitude -REAL :: ZSINLO ! Sine of computed point longitude -REAL :: ZCOSLA ! Cosine of computed point latitude -REAL :: ZCOSLO ! Cosine of computed point longitude -REAL :: ZSINLAS ! Sine of point's pseudo-latitude -REAL :: ZSINLOS ! Sine of point's pseudo-longitude -REAL :: ZCOSLOS ! Cosine of point's pseudo-lon. -REAL :: ZA,ZB,ZD ! Dummy variables used for -REAL :: ZX,ZY ! computations -! -INTEGER :: JLOOP1 ! Dummy loop counter -! -!---------------------------------------------------------------------------- -! -ZSINSTRETCHLA = SIN(PLAP*XPI/180.) -ZCOSSTRETCHLA = COS(PLAP*XPI/180.) -ZSINSTRETCHLO = SIN(PLOP*XPI/180.) -ZCOSSTRETCHLO = COS(PLOP*XPI/180.) -! L = longitude (0 = Greenwich, + toward east) -! l = latitude (90 = N.P., -90 = S.P.) -! p stands for stretching pole -PLAC(:) = PLAR(:) * XPI / 180. -PLOC(:) = PLOR(:) * XPI / 180. -! A = 1 + c.c -ZA = 1. + PCOEF*PCOEF -! B = 1 - c.c -ZB = 1. - PCOEF*PCOEF -DO JLOOP1=1, KN - ZSINLA = SIN(PLAC(JLOOP1)) - ZCOSLA = COS(PLAC(JLOOP1)) - ZSINLO = SIN(PLOC(JLOOP1)) - ZCOSLO = COS(PLOC(JLOOP1)) - ! X = cos(Lp-L) - ZX = ZCOSLO*ZCOSSTRETCHLO + ZSINLO*ZSINSTRETCHLO - ! Y = sin(Lp-L) - ZY = ZSINSTRETCHLO*ZCOSLO - ZSINLO*ZCOSSTRETCHLO - ! D = (1+c.c) + (1-c.c)(sin lp.sin l + cos lp.cos l.cos(Lp-L)) - ZD = ZA + ZB*(ZSINSTRETCHLA*ZSINLA+ZCOSSTRETCHLA*ZCOSLA*ZX) - ! (1-c.c)+(1+c.c)((sin lp.sin l + cos lp.cos l.cos(Lp-L)) - ! sin lr = ------------------------------------------------------- - ! D - ZSINLAS = (ZB + ZA*(ZSINSTRETCHLA*ZSINLA+ZCOSSTRETCHLA*ZCOSLA*ZX)) / ZD - ! D' = D * cos lr - ZD = ZD * (AMAX1(1e-6,SQRT(1.-ZSINLAS*ZSINLAS))) - ! 2.c.(cos lp.sin l - sin lp.cos l.cos(Lp-L)) - ! cos Lr = ------------------------------------------- - ! D' - ZCOSLOS = 2.*PCOEF*(ZCOSSTRETCHLA*ZSINLA-ZSINSTRETCHLA*ZCOSLA*ZX) / ZD - ! 2.c.cos l.cos(Lp-L) - ! sin Lr = ------------------- - ! D' - ZSINLOS = 2.*PCOEF*(ZCOSLA*ZY) / ZD - ! saturations (corrects calculation errors) - ZSINLAS = MAX(ZSINLAS,-1.) - ZSINLAS = MIN(ZSINLAS, 1.) - ZCOSLOS = MAX(ZCOSLOS,-1.) - ZCOSLOS = MIN(ZCOSLOS, 1.) - ! back from sine & cosine - PLAC(JLOOP1) = ASIN(ZSINLAS) - IF (ZSINLOS>0) THEN - PLOC(JLOOP1) = ACOS(ZCOSLOS) - ELSE - PLOC(JLOOP1) = -ACOS(ZCOSLOS) - ENDIF -ENDDO -PLOC(:) = PLOC(:) * 180. / XPI -PLAC(:) = PLAC(:) * 180. / XPI -RETURN -END SUBROUTINE ARPEGE_STRETCH_A -! -! -END SUBROUTINE READ_ALL_DATA_GRIB_CASE diff --git a/src/PHYEX/ext/read_desfmn.f90 b/src/PHYEX/ext/read_desfmn.f90 deleted file mode 100644 index 39e599098..000000000 --- a/src/PHYEX/ext/read_desfmn.f90 +++ /dev/null @@ -1,890 +0,0 @@ -!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ###################### - MODULE MODI_READ_DESFM_n -! ###################### -! -INTERFACE -! - SUBROUTINE READ_DESFM_n(KMI,TPDATAFILE,HCONF,OFLAT,OUSERV, & - OUSERC,OUSERR,OUSERI,OUSECI,OUSERS,OUSERG,OUSERH, & - OUSECHEM,OUSECHAQ,OUSECHIC,OCH_PH,OCH_CONV_LINOX,OSALT, & - ODEPOS_SLT,ODUST,ODEPOS_DST, OCHTRANS, & - OORILAM,ODEPOS_AER,OLG,OPASPOL,OFIRE, & -#ifdef MNH_FOREFIRE - OFOREFIRE, & -#endif - OLNOX_EXPLICIT, & - OCONDSAMP,OBLOWSNOW, & - KRIMX,KRIMY,KSV_USER, & - HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC,HEQNSYS ) -! -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS -! -INTEGER, INTENT(IN) :: KMI ! Model index -TYPE(TFILEDATA), INTENT(IN) :: TPDATAFILE ! Datafile -CHARACTER (LEN=5), INTENT(OUT) :: HCONF ! configuration var. linked to FMfile -LOGICAL, INTENT(OUT) :: OFLAT ! Logical for zero orography -LOGICAL, INTENT(OUT) :: OUSERV ! use Rv mixing ratio -LOGICAL, INTENT(OUT) :: OUSERC ! use Rc mixing ratio -LOGICAL, INTENT(OUT) :: OUSERR ! use Rr mixing ratio -LOGICAL, INTENT(OUT) :: OUSERI ! use Ri mixing ratio -LOGICAL, INTENT(OUT) :: OUSECI ! use Ci concentration of Ice cristals -LOGICAL, INTENT(OUT) :: OUSERS ! use Rs mixing ratio -LOGICAL, INTENT(OUT) :: OUSERG ! use Rg mixing ratio -LOGICAL, INTENT(OUT) :: OUSERH ! use Rh mixing ratio -LOGICAL, INTENT(OUT) :: OUSECHEM ! Chemical flag -LOGICAL, INTENT(OUT) :: OUSECHAQ ! Aqueous Chemical flag -LOGICAL, INTENT(OUT) :: OUSECHIC ! Ice phase Chemical flag -LOGICAL, INTENT(OUT) :: OCH_PH ! pH flag -LOGICAL, INTENT(OUT) :: OCH_CONV_LINOX ! LiNOX flag -LOGICAL, INTENT(OUT) :: OLG ! lagrangian flag -LOGICAL, INTENT(OUT) :: OSALT ! Sea Salt flag -LOGICAL, INTENT(OUT) :: ODUST ! Dust flag -LOGICAL, INTENT(OUT) :: OPASPOL ! Passive pollutant flag -LOGICAL, INTENT(OUT) :: OFIRE ! Blaze flag -#ifdef MNH_FOREFIRE -LOGICAL, INTENT(OUT) :: OFOREFIRE! ForeFire flag -#endif -LOGICAL, INTENT(OUT) :: OLNOX_EXPLICIT ! explicit LNOx flag -LOGICAL, INTENT(OUT) :: OCONDSAMP! Conditional sampling flag -LOGICAL, INTENT(OUT) :: OBLOWSNOW ! Blowing snow flag -LOGICAL, INTENT(OUT) :: OORILAM ! Orilam flag -LOGICAL, INTENT(OUT) :: OCHTRANS ! Deep convection on scalar -LOGICAL,DIMENSION(JPMODELMAX),INTENT(OUT) :: ODEPOS_DST ! Dust Wet Deposition flag -LOGICAL,DIMENSION(JPMODELMAX),INTENT(OUT) :: ODEPOS_SLT ! Sea Salt Wet Deposition flag -LOGICAL,DIMENSION(JPMODELMAX),INTENT(OUT) :: ODEPOS_AER ! Aerosols Wet Deposition flag -INTEGER, INTENT(OUT) :: KRIMX, KRIMY ! number of points for the - ! horizontal relaxation for the outermost verticals -INTEGER, INTENT(OUT) :: KSV_USER ! number of additional scalar - ! variables in FMfile -CHARACTER (LEN=4), INTENT(OUT) :: HTURB ! Kind of turbulence parameterization - ! used to produce the FMfile -CHARACTER (LEN=4), INTENT(OUT) :: HTOM ! Kind of third order moment -LOGICAL, INTENT(OUT) :: ORMC01 ! flag for RMC01 SBL computations -CHARACTER (LEN=4), INTENT(OUT) :: HRAD ! Kind of radiation scheme -CHARACTER (LEN=4), INTENT(OUT) :: HDCONV ! Kind of deep convection scheme -CHARACTER (LEN=4), INTENT(OUT) :: HSCONV ! Kind of shallow convection scheme -CHARACTER (LEN=4), INTENT(OUT) :: HCLOUD ! Kind of microphysical scheme -CHARACTER (LEN=4), INTENT(OUT) :: HELEC ! Kind of electrical scheme -CHARACTER (LEN=*), INTENT(OUT) :: HEQNSYS! type of equations' system -END SUBROUTINE READ_DESFM_n -! -END INTERFACE -! -END MODULE MODI_READ_DESFM_n -! ######################################################################### - SUBROUTINE READ_DESFM_n(KMI,TPDATAFILE,HCONF,OFLAT,OUSERV, & - OUSERC,OUSERR,OUSERI,OUSECI,OUSERS,OUSERG,OUSERH, & - OUSECHEM,OUSECHAQ,OUSECHIC,OCH_PH,OCH_CONV_LINOX,OSALT, & - ODEPOS_SLT,ODUST,ODEPOS_DST, OCHTRANS, & - OORILAM,ODEPOS_AER,OLG,OPASPOL,OFIRE, & -#ifdef MNH_FOREFIRE - OFOREFIRE, & -#endif - OLNOX_EXPLICIT, & - OCONDSAMP,OBLOWSNOW, & - KRIMX,KRIMY,KSV_USER, & - HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC,HEQNSYS ) -! ######################################################################### -! -!!**** *READ_DESFM_n * - routine to read the descriptor file DESFM -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to read the descriptor file called -! DESFM. -! -!! -!!** METHOD -!! ------ -!! The descriptor file is read. Namelists (NAMXXXn) which contain -!! informations linked to one nested model are at the beginning of the file. -!! Namelists (NAMXXX) which contain variables common to all models -!! are at the end of the file. When the model index is different from 1, -!! the end of the file (namelists NAMXXX) is not read. -!! Some attributes of the FMfile are saved in order to check coherence -!! between initial file and the segment to perform (description given by -!! EXSEG file), i.e. : -!! - the configuration which has been used to produce the initial file -!! (CCONF) -!! - logical switch for flat configuration (zero orography) in initial file -!! (LFLAT) -!! - kind of moist variables in initial file (LUSERV,LUSERC,LUSERR, -!! LUSERI,LUSERS,LUSERG,LUSERH) -!! - number of additional scalar variables in initial file (NSV_USER) -!! - kind of turbulence parameterization used to produce the initial -!! file (CTURB) -!! - kind of mixing length used to produce the initial -!! file (CTURBLEN) -!! - time step of each model stored in PTSTEP_OLD, to correct the initial -!! field at t-dt in routine READ_FIELD in case of time step change -!! - type of equation system in order to verify that the anelastic is the -!! same for the initila file generation and the run -!! -!! -!! EXTERNAL -!! -------- -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODN_CONF : CCONF,LFLAT,CEQNSYS -!! -!! Module MODN_CONF1 : LUSERV,LUSERC,LUSERR,LUSERI,LUSECI, -!! LUSERS,LUSERG,LUSERH -!! -!! Module MODN_PARAM1 : CTURB,CRAD,CDCONV,CSCONV -!! -!! Module MODN_TURB$n : CTURBLEN -!! -!! Module MODN_DYN$n : NRIMX,NRIMY -!! -!! REFERENCE -!! --------- -!! Book2 of the documentation (routine READ_DESFM_n) -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/06/94 -!! Modifications 17/10/94 (Stein) For LCORIO -!! Modifications 26/10/94 (Stein) remove NAM_GET from the Namelists -!! present in DESFM + change the namelist names -!! Modifications 09/01/95 (Stein) add the turbulence scheme -!! Modifications 09/01/95 (Stein) add the 1D switch -!! Modifications 13/02/95 (Stein) save HTURBLEN -!! Modifications 30/06/95 (Stein) add new namelists -!! Modifications 18/08/95 (Lafore) time step change -!! Modifications 15/09/95 (Pinty) add the radiations -!! Modifications 06/02/96 (J.Vila) add the new scalar advection scheme -!! Modifications 20/02/96 (Stein) add the LES namelist + cleaning -!! Modifications 25/04/96 (Suhre) add NAM_BLANK -!! Modifications 25/04/96 (Suhre) add NAM_FRC -!! Modifications 25/04/96 (Suhre) add NAM_CH_MNHCn and NAM_CH_SOLVER -!! Modifications 11/04/96 (Pinty) add the ice concentration -!! Modifications 11/01/97 (Pinty) add the deep convection -!! Modifications 22/07/96 (Lafore) gridnesting implementation -!! Modifications 22/06/97 (Stein ) save the equations' system+ cleaning -!! Modifications 09/07/97 (Masson) add NAM_PARAM_GROUND -!! Modifications 25/08/97 (Masson) add HGROUND -!! Modifications 25/10/97 (Stein ) new namelists -!! Modification 04/06/00 (Pinty) add C2R2 scheme -!! Modification 22/01/01 (Gazen) Add OUSECHEM and OLG -!! Modification 15/10/01 (Mallet) allow namelists in different orders -!! Modification 29/11/02 (Pinty) add C3R5, ICE2, ICE4, ELEC -!! Modification 01/2004 (Masson) removes surface (externalization) -!! Modification 01/2005 (Masson) removes 1D and 2D switches -!! Modification 03/2005 (Tulet) add dust, aerosols -!! Modification 03/2006 (O.Geoffroy) Add KHKO scheme -!! Modification 04/2010 (M. Leriche) Add aqueous + ice chemistry -!! Modification 07/2013 (Bosseur & Filippi) Adds Forefire -!! Modification 01/2015 (C. Barthe) Add explicit LNOx -!! Modification 2016 (B.VIE) LIMA -!! Modification 11/2016 (Ph. Wautelet) Allocate/initialise some output/backup structures -!! Modification 02/2018 (Q.Libois) ECRAD -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! Modification 07/2017 (V. Vionnet) Add blowing snow scheme -!! Modification 02/2021 (F.Auguste) add IBM -!! (T.Nagel) add turbulence recycling -!! (E.Jezequel) add stations read from CSV file -! A. Costes 12/2021: add Blaze fire model -! P. Wautelet 27/04/2022: add namelist for profilers -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_PARAMETERS -! -USE MODN_BACKUP -USE MODN_BUDGET -USE MODN_CONF -USE MODN_DYN -USE MODN_NESTING -USE MODN_OUTPUT -USE MODN_LES -USE MODN_CONF_n -USE MODN_DYN_n -USE MODN_ADV_n -USE MODN_PARAM_n -USE MODN_PARAM_RAD_n -USE MODN_PARAM_ECRAD_n -USE MODN_PARAM_KAFR_n -USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN_INIT -USE MODD_PARAM_ICE_n, ONLY : PARAM_ICEN_INIT -USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_INIT -USE MODN_LUNIT_n -USE MODN_LBC_n -USE MODN_NUDGING_n -USE MODD_TURB_n, ONLY: TURBN_INIT, CTOM, LRMC01 -USE MODD_NEB_n, ONLY: NEBN_INIT -USE MODN_FRC -USE MODN_BLANK_n -USE MODN_CH_SOLVER_n -USE MODN_CH_MNHC_n -USE MODN_PARAM_C2R2, ONLY : HPARAM_CCN_C2R2=>HPARAM_CCN,HINI_CCN_C2R2=>HINI_CCN, & - HTYPE_CCN_C2R2=>HTYPE_CCN,LRAIN_C2R2=>LRAIN, & - LSEDC_C2R2=>LSEDC,LACTIT_C2R2=>LACTIT,XCHEN_C2R2=>XCHEN, & - XKHEN_C2R2=>XKHEN,XMUHEN_C2R2=>XMUHEN, & - XBETAHEN_C2R2=>XBETAHEN,XCONC_CCN_C2R2=>XCONC_CCN, & - XR_MEAN_CCN_C2R2=>XR_MEAN_CCN,XLOGSIG_CCN_C2R2=>XLOGSIG_CCN, & - XFSOLUB_CCN_C2R2=>XFSOLUB_CCN,XACTEMP_CCN_C2R2=>XACTEMP_CCN, & - XALPHAC_C2R2=>XALPHAC,XNUC_C2R2=>XNUC,XALPHAR_C2R2=>XALPHAR, & - XNUR_C2R2=>XNUR,XAERDIFF_C2R2=>XAERDIFF, & - XAERHEIGHT_C2R2=>XAERHEIGHT,NAM_PARAM_C2R2 -USE MODN_PARAM_C1R3, ONLY : XALPHAI_C1R3=>XALPHAI,XNUI_C1R3=>XNUI,XALPHAS_C1R3=>XALPHAS, & - XNUS_C1R3=>XNUS,XALPHAG_C1R3=>XALPHAG,XNUG_C1R3=>XNUG, & - XFACTNUC_DEP_C1R3=>XFACTNUC_DEP, & - XFACTNUC_CON_C1R3=>XFACTNUC_CON,LSEDI_C1R3=>LSEDI, & - LHHONI_C1R3=>LHHONI,CPRISTINE_ICE_C1R3,CHEVRIMED_ICE_C1R3, & - NAM_PARAM_C1R3 -USE MODN_ELEC -USE MODN_SERIES -USE MODN_SERIES_n -USE MODN_TURB_CLOUD -USE MODN_CH_ORILAM -USE MODN_DUST -USE MODN_SALT -USE MODN_PASPOL -USE MODN_VISCOSITY -USE MODN_DRAG_n -#ifdef MNH_FOREFIRE -USE MODN_FOREFIRE -#endif -USE MODN_CONDSAMP -USE MODN_LATZ_EDFLX -USE MODN_2D_FRC -USE MODN_BLOWSNOW_n -USE MODN_BLOWSNOW -! -! USE MODN_FLYERS -! -USE MODE_MSG -USE MODE_POS -USE MODN_RECYCL_PARAM_n -USE MODN_IBM_PARAM_n -USE MODD_IBM_LSF, ONLY: LIBM_LSF -! -USE MODN_FIRE_n -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -! -INTEGER, INTENT(IN) :: KMI ! Model index -TYPE(TFILEDATA), INTENT(IN) :: TPDATAFILE ! Datafile -CHARACTER (LEN=5), INTENT(OUT) :: HCONF ! configuration var. linked to FMfile -LOGICAL, INTENT(OUT) :: OFLAT ! Logical for zero orography -LOGICAL, INTENT(OUT) :: OUSERV ! use Rv mixing ratio -LOGICAL, INTENT(OUT) :: OUSERC ! use Rc mixing ratio -LOGICAL, INTENT(OUT) :: OUSERR ! use Rr mixing ratio -LOGICAL, INTENT(OUT) :: OUSERI ! use Ri mixing ratio -LOGICAL, INTENT(OUT) :: OUSECI ! use Ci concentration of Ice cristals -LOGICAL, INTENT(OUT) :: OUSERS ! use Rs mixing ratio -LOGICAL, INTENT(OUT) :: OUSERG ! use Rg mixing ratio -LOGICAL, INTENT(OUT) :: OUSERH ! use Rh mixing ratio -LOGICAL, INTENT(OUT) :: OUSECHEM ! Chemical flag -LOGICAL, INTENT(OUT) :: OUSECHAQ ! Aqueous Chemical flag -LOGICAL, INTENT(OUT) :: OUSECHIC ! Ice phase Chemical flag -LOGICAL, INTENT(OUT) :: OCH_PH ! pH flag -LOGICAL, INTENT(OUT) :: OCH_CONV_LINOX ! LiNOX flag -LOGICAL, INTENT(OUT) :: OLG ! lagrangian flag -INTEGER, INTENT(OUT) :: KRIMX, KRIMY ! number of points for the - ! horizontal relaxation for the outermost verticals -INTEGER, INTENT(OUT) :: KSV_USER ! number of additional scalar - ! variables in FMfile -CHARACTER (LEN=4), INTENT(OUT) :: HTURB ! Kind of turbulence parameterization - ! used to produce the FMfile -CHARACTER (LEN=4), INTENT(OUT) :: HTOM ! Kind of third order moment -LOGICAL, INTENT(OUT) :: ORMC01 ! flag for RMC01 SBL computations -CHARACTER (LEN=4), INTENT(OUT) :: HRAD ! Kind of radiation scheme -CHARACTER (LEN=4), INTENT(OUT) :: HDCONV ! Kind of deep convection scheme -CHARACTER (LEN=4), INTENT(OUT) :: HSCONV ! Kind of shallow convection scheme -CHARACTER (LEN=4), INTENT(OUT) :: HCLOUD ! Kind of microphysical scheme -CHARACTER (LEN=4), INTENT(OUT) :: HELEC ! Kind of electrical scheme -CHARACTER (LEN=*), INTENT(OUT) :: HEQNSYS! type of equations' system -LOGICAL, INTENT(OUT) :: OSALT ! Sea Salt flag -LOGICAL, INTENT(OUT) :: OPASPOL ! Passive pollutant flag -LOGICAL, INTENT(OUT) :: OFIRE ! Blaze flag -#ifdef MNH_FOREFIRE -LOGICAL, INTENT(OUT) :: OFOREFIRE ! ForeFire flag -#endif -LOGICAL, INTENT(OUT) :: OLNOX_EXPLICIT ! explicit LNOx flag -LOGICAL, INTENT(OUT) :: OCONDSAMP! Conditional sampling flag -LOGICAL, INTENT(OUT) :: OBLOWSNOW! Blowing snow flag -LOGICAL, INTENT(OUT) :: ODUST ! Dust flag -LOGICAL, INTENT(OUT) :: OORILAM ! Dust flag -LOGICAL, INTENT(OUT) :: OCHTRANS ! Deep convection on scalar - ! variables flag -LOGICAL,DIMENSION(JPMODELMAX),INTENT(OUT) :: ODEPOS_DST ! Dust Wet Deposition flag -LOGICAL,DIMENSION(JPMODELMAX),INTENT(OUT) :: ODEPOS_SLT ! Sea Salt Wet Deposition flag -LOGICAL,DIMENSION(JPMODELMAX),INTENT(OUT) :: ODEPOS_AER ! Aerosols Wet Deposition flag -! -!* 0.2 declarations of local variables -! -INTEGER :: ILUDES, & ! logical unit numbers of - ILUOUT ! DESFM file and output listing -LOGICAL :: GFOUND ! Return code when searching namelist -LOGICAL,DIMENSION(JPMODELMAX),SAVE :: LTEMPDEPOS_DST ! Dust Moist flag -LOGICAL,DIMENSION(JPMODELMAX),SAVE :: LTEMPDEPOS_SLT ! Sea Salt Moist flag -LOGICAL,DIMENSION(JPMODELMAX),SAVE :: LTEMPDEPOS_AER ! Orilam Moist flag -TYPE(TFILEDATA), POINTER :: TZDESFILE -! -!------------------------------------------------------------------------------- -! -!* 1. READ DESFM FILE -! --------------- -! -CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_DESFM_n','called for '//TRIM(TPDATAFILE%CNAME)) -! -IF (.NOT.ASSOCIATED(TPDATAFILE%TDESFILE)) & - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_DESFM_n','TDESFILE not associated for '//TRIM(TPDATAFILE%CNAME)) -! -TZDESFILE => TPDATAFILE%TDESFILE -ILUDES = TZDESFILE%NLU -ILUOUT = TLUOUT%NLU -! -CALL POSNAM( TZDESFILE, 'NAM_LUNITN', GFOUND ) -CALL INIT_NAM_LUNITN -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_LUNITn) - CALL UPDATE_NAM_LUNITN -END IF -CALL POSNAM( TZDESFILE, 'NAM_CONFN', GFOUND ) -CALL INIT_NAM_CONFN -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_CONFn) - CALL UPDATE_NAM_CONFN -END IF -CALL POSNAM( TZDESFILE, 'NAM_DYNN', GFOUND ) -CALL INIT_NAM_DYNN -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_DYNn) - CALL UPDATE_NAM_DYNN -END IF -CALL POSNAM( TZDESFILE, 'NAM_ADVN', GFOUND ) -CALL INIT_NAM_ADVN -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_ADVn) - CALL UPDATE_NAM_ADVN -END IF -CALL POSNAM( TZDESFILE, 'NAM_PARAMN', GFOUND ) -CALL INIT_NAM_PARAMn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_PARAMn) - CALL UPDATE_NAM_PARAMn -END IF -CALL POSNAM( TZDESFILE, 'NAM_PARAM_RADN', GFOUND ) -CALL INIT_NAM_PARAM_RADn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_PARAM_RADn) - CALL UPDATE_NAM_PARAM_RADn -END IF -#ifdef MNH_ECRAD -CALL POSNAM( TZDESFILE, 'NAM_PARAM_ECRADN', GFOUND ) -CALL INIT_NAM_PARAM_ECRADn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_PARAM_ECRADn) - CALL UPDATE_NAM_PARAM_ECRADn -END IF -#endif -CALL POSNAM( TZDESFILE, 'NAM_PARAM_KAFRN', GFOUND ) -CALL INIT_NAM_PARAM_KAFRn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_PARAM_KAFRn) - CALL UPDATE_NAM_PARAM_KAFRn -END IF -CALL PARAM_MFSHALLN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) -CALL POSNAM( TZDESFILE, 'NAM_LBCN', GFOUND ) -CALL INIT_NAM_LBCn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_LBCn) - CALL UPDATE_NAM_LBCn -END IF -CALL POSNAM( TZDESFILE, 'NAM_NUDGINGN', GFOUND ) -CALL INIT_NAM_NUDGINGn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_NUDGINGn) - CALL UPDATE_NAM_NUDGINGn -END IF -CALL TURBN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) -CALL NEBN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) -CALL PARAM_ICEN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) -CALL POSNAM( TZDESFILE, 'NAM_CH_MNHCN', GFOUND ) -CALL INIT_NAM_CH_MNHCn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_CH_MNHCn) - CALL UPDATE_NAM_CH_MNHCn -END IF -CALL POSNAM( TZDESFILE, 'NAM_CH_SOLVERN', GFOUND ) -CALL INIT_NAM_CH_SOLVERn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_CH_SOLVERn) - CALL UPDATE_NAM_CH_SOLVERn -END IF -CALL POSNAM( TZDESFILE, 'NAM_DRAGN', GFOUND ) -CALL INIT_NAM_DRAGn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_DRAGn) - CALL UPDATE_NAM_DRAGn -END IF -CALL POSNAM( TZDESFILE, 'NAM_IBM_PARAMN', GFOUND ) -CALL INIT_NAM_IBM_PARAMn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_IBM_PARAMn) - CALL UPDATE_NAM_IBM_PARAMn -END IF -CALL POSNAM( TZDESFILE, 'NAM_RECYCL_PARAMN', GFOUND ) -CALL INIT_NAM_RECYCL_PARAMn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_RECYCL_PARAMn) - CALL UPDATE_NAM_RECYCL_PARAMn -END IF -CALL POSNAM( TZDESFILE, 'NAM_SERIESN', GFOUND ) -CALL INIT_NAM_SERIESn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_SERIESn) - CALL UPDATE_NAM_SERIESn -END IF -CALL POSNAM( TZDESFILE, 'NAM_BLOWSNOWN', GFOUND ) -CALL INIT_NAM_BLOWSNOWn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_BLOWSNOWn) - CALL UPDATE_NAM_BLOWSNOWn -END IF -CALL POSNAM( TZDESFILE, 'NAM_BLANKN', GFOUND ) -CALL INIT_NAM_BLANKn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_BLANKn) - CALL UPDATE_NAM_BLANKn -END IF -! Note: it is not useful to read the PROFILERS/STATIONS namelists in the .des files -! The values here (if present in file) don't need to be compared with the ones in the EXSEGn files -! CALL POSNAM( TZDESFILE, 'NAM_PROFILERN', GFOUND ) -! CALL INIT_NAM_PROFILERn -! IF (GFOUND) THEN -! READ(UNIT=ILUDES,NML=NAM_PROFILERN) -! CALL UPDATE_NAM_PROFILERn -! END IF -! CALL POSNAM( TZDESFILE, 'NAM_STATIONN', GFOUND ) -! CALL INIT_NAM_STATIONn -! IF (GFOUND) THEN -! READ(UNIT=ILUDES,NML=NAM_STATIONn) -! CALL UPDATE_NAM_STATIONn -! END IF -CALL POSNAM( TZDESFILE, 'NAM_FIREN', GFOUND ) -CALL INIT_NAM_FIREn -IF (GFOUND) THEN - READ(UNIT=ILUDES,NML=NAM_FIREn) - CALL UPDATE_NAM_FIREn -END IF -! -! -IF (KMI == 1) THEN - CALL POSNAM( TZDESFILE, 'NAM_CONF', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_CONF) - CALL POSNAM( TZDESFILE, 'NAM_DYN', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_DYN) - CALL POSNAM( TZDESFILE, 'NAM_NESTING', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_NESTING) - CALL POSNAM( TZDESFILE, 'NAM_BACKUP', GFOUND ) - IF (GFOUND) THEN - IF (.NOT.ALLOCATED(XBAK_TIME)) THEN - ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX)) - XBAK_TIME(:,:) = XNEGUNDEF - END IF - IF (.NOT.ALLOCATED(XOUT_TIME)) THEN - ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX)) !Allocate *OUT* variables to prevent - XOUT_TIME(:,:) = XNEGUNDEF - END IF - IF (.NOT.ALLOCATED(NBAK_STEP)) THEN - ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX)) - NBAK_STEP(:,:) = NNEGUNDEF - END IF - IF (.NOT.ALLOCATED(NOUT_STEP)) THEN - ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX)) !problems if NAM_OUTPUT does not exist - NOUT_STEP(:,:) = NNEGUNDEF - END IF - IF (.NOT.ALLOCATED(COUT_VAR)) THEN - ALLOCATE(COUT_VAR (NMODEL,JPOUTVARMAX)) - COUT_VAR(:,:) = '' - END IF - READ(UNIT=ILUDES,NML=NAM_BACKUP) - ELSE - CALL POSNAM( TZDESFILE, 'NAM_FMOUT', GFOUND ) - IF (GFOUND) CALL PRINT_MSG(NVERB_FATAL,'IO','READ_DESFM_n','use namelist NAM_BACKUP instead of namelist NAM_FMOUT') - END IF - CALL POSNAM( TZDESFILE, 'NAM_OUTPUT', GFOUND ) - IF (GFOUND) THEN - IF (.NOT.ALLOCATED(XBAK_TIME)) THEN - ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX)) !Allocate *BAK* variables to prevent - XBAK_TIME(:,:) = XNEGUNDEF - END IF - IF (.NOT.ALLOCATED(XOUT_TIME)) THEN - ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX)) - XOUT_TIME(:,:) = XNEGUNDEF - END IF - IF (.NOT.ALLOCATED(NBAK_STEP)) THEN - ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX)) !problems if NAM_BACKUP does not exist - NBAK_STEP(:,:) = NNEGUNDEF - END IF - IF (.NOT.ALLOCATED(NOUT_STEP)) THEN - ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX)) - NOUT_STEP(:,:) = NNEGUNDEF - END IF - IF (.NOT.ALLOCATED(COUT_VAR)) THEN - ALLOCATE(COUT_VAR (NMODEL,JPOUTVARMAX)) - COUT_VAR(:,:) = '' - END IF - READ(UNIT=ILUDES,NML=NAM_OUTPUT) - END IF -! Note: it is not useful to read the budget namelists in the .des files -! The values here (if present in file) don't need to be compared with the ones in the EXSEGn files -! CALL POSNAM( TZDESFILE, 'NAM_BUDGET', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BUDGET) -! CALL POSNAM( TZDESFILE, 'NAM_BU_RU', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RU) -! CALL POSNAM( TZDESFILE, 'NAM_BU_RV', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RV) -! CALL POSNAM( TZDESFILE, 'NAM_BU_RW', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RW) -! CALL POSNAM( TZDESFILE, 'NAM_BU_RTH', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTH) -! CALL POSNAM( TZDESFILE, 'NAM_BU_RTKE', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTKE) -! CALL POSNAM( TZDESFILE, 'NAM_BU_RRV', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRV) -! CALL POSNAM( TZDESFILE, 'NAM_BU_RRC', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRC) -! CALL POSNAM( TZDESFILE, 'NAM_BU_RRR', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRR) -! CALL POSNAM( TZDESFILE, 'NAM_BU_RRI', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRI) -! CALL POSNAM( TZDESFILE, 'NAM_BU_RRS', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRS) -! CALL POSNAM( TZDESFILE, 'NAM_BU_RRG', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRG) -! CALL POSNAM( TZDESFILE, 'NAM_BU_RRH', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRH) -! CALL POSNAM( TZDESFILE, 'NAM_BU_RSV', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RSV) - CALL POSNAM( TZDESFILE, 'NAM_LES', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_LES) - CALL POSNAM( TZDESFILE, 'NAM_PDF', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PDF) - CALL POSNAM( TZDESFILE, 'NAM_FRC', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_FRC) - CALL POSNAM( TZDESFILE, 'NAM_PARAM_C2R2', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PARAM_C2R2) - CALL POSNAM( TZDESFILE, 'NAM_PARAM_C1R3', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PARAM_C1R3) - CALL PARAM_LIMA_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) - CALL POSNAM( TZDESFILE, 'NAM_ELEC', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_ELEC) - CALL POSNAM( TZDESFILE, 'NAM_SERIES', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_SERIES) - CALL POSNAM( TZDESFILE, 'NAM_TURB_CLOUD', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_TURB_CLOUD) - CALL POSNAM( TZDESFILE, 'NAM_CH_ORILAM', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_CH_ORILAM) - CALL POSNAM( TZDESFILE, 'NAM_DUST', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_DUST) - CALL POSNAM( TZDESFILE, 'NAM_SALT', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_SALT) - CALL POSNAM( TZDESFILE, 'NAM_PASPOL', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PASPOL) -#ifdef MNH_FOREFIRE - CALL POSNAM( TZDESFILE, 'NAM_FOREFIRE', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_FOREFIRE) -#endif - CALL POSNAM( TZDESFILE, 'NAM_CONDSAMP', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_CONDSAMP) - CALL POSNAM( TZDESFILE, 'NAM_BLOWSNOW', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BLOWSNOW) - CALL POSNAM( TZDESFILE, 'NAM_2D_FRC', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_2D_FRC) - LTEMPDEPOS_DST(:) = LDEPOS_DST(:) - LTEMPDEPOS_SLT(:) = LDEPOS_SLT(:) - LTEMPDEPOS_AER(:) = LDEPOS_AER(:) - CALL POSNAM( TZDESFILE, 'NAM_LATZ_EDFLX', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_LATZ_EDFLX) - CALL POSNAM( TZDESFILE, 'NAM_VISC', GFOUND ) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_VISC) -! Note: it is not useful to read the FLYERS/AIRCRAFTS/BALLOONS namelists in the .des files -! The values here (if present in file) don't need to be compared with the ones in the EXSEGn files -! CALL POSNAM( TZDESFILE, 'NAM_FLYERS', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_FLYERS) -! CALL POSNAM(ILUSEG,'NAM_AIRCRAFTS', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_AIRCRAFTS) -! CALL POSNAM(ILUSEG,'NAM_BALLOONS', GFOUND ) -! IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BALLOONS) -END IF -! -!------------------------------------------------------------------------------- -! -!* 2. SAVE SOME FMFILE ATTRIBUTES -! --------------------------- -HCONF = CCONF -OFLAT = LFLAT -OUSERV = LUSERV -OUSERC = LUSERC -OUSERR = LUSERR -OUSERI = LUSERI -OUSECI = LUSECI -OUSERS = LUSERS -OUSERG = LUSERG -OUSERH = LUSERH -OUSECHEM = LUSECHEM -OUSECHAQ = LUSECHAQ -OUSECHIC = LUSECHIC -OCH_PH = LCH_PH -OCH_CONV_LINOX = LCH_CONV_LINOX -ODUST = LDUST -ODEPOS_DST(KMI) = LTEMPDEPOS_DST(KMI) -ODEPOS_SLT(KMI) = LTEMPDEPOS_SLT(KMI) -ODEPOS_AER(KMI) = LTEMPDEPOS_AER(KMI) -OCHTRANS = LCHTRANS -OSALT = LSALT -OORILAM = LORILAM -OLG = LLG -OPASPOL = LPASPOL -OFIRE = LBLAZE -#ifdef MNH_FOREFIRE -OFOREFIRE = LFOREFIRE -#endif -OLNOX_EXPLICIT = LLNOX_EXPLICIT -OCONDSAMP= LCONDSAMP -OBLOWSNOW= LBLOWSNOW -! Initially atmosphere free of blowing snow particles -IF(KMI>1) OBLOWSNOW=.FALSE. -KRIMX = NRIMX -KRIMY = NRIMY -KSV_USER = NSV_USER -HTURB = CTURB -HTOM = CTOM -ORMC01 = LRMC01 -HRAD = CRAD -HDCONV = CDCONV -HSCONV = CSCONV -HCLOUD = CCLOUD -HELEC = CELEC -HEQNSYS = CEQNSYS -! -!------------------------------------------------------------------------------- -! -!* 3. WRITE DESFM ON OUTPUT LISTING -! ------------------------------ -! -IF (NVERB >= 10) THEN - WRITE(UNIT=ILUOUT,FMT="(/,'DESCRIPTOR OF INITIAL FILE FOR MODEL ',I2)") KMI - WRITE(UNIT=ILUOUT,FMT="( '------------------------------------ ' )") -! - WRITE(UNIT=ILUOUT,FMT="('********** LOGICAL UNITSn **********')") - WRITE(UNIT=ILUOUT,NML=NAM_LUNITn) -! - WRITE(UNIT=ILUOUT,FMT="('********** CONFIGURATIONn **********')") - WRITE(UNIT=ILUOUT,NML=NAM_CONFn) -! - WRITE(UNIT=ILUOUT,FMT="('********** DYNAMICn ****************')") - WRITE(UNIT=ILUOUT,NML=NAM_DYNn) -! - WRITE(UNIT=ILUOUT,FMT="('********** ADVECTIONn **************')") - WRITE(UNIT=ILUOUT,NML=NAM_ADVn) -! - WRITE(UNIT=ILUOUT,FMT="('********** PARAMETERIZATIONSn ******')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAMn) -! - WRITE(UNIT=ILUOUT,FMT="('********** RADIATIONSn *************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_RADn) -! -#ifdef MNH_ECRAD - WRITE(UNIT=ILUOUT,FMT="('********** ECRAD RADIATIONSn *************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_ECRADn) -#endif -! - WRITE(UNIT=ILUOUT,FMT="('********** DEEP CONVECTIONn ********')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_KAFRn) -! - WRITE(UNIT=ILUOUT,FMT="('*** MASS FLUX SHALLOW CONVECTION ***')") - CALL PARAM_MFSHALLN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) -! - WRITE(UNIT=ILUOUT,FMT="('********** LBCn ********************')") - WRITE(UNIT=ILUOUT,NML=NAM_LBCn) -! - WRITE(UNIT=ILUOUT,FMT="('********** TURBn *******************')") - CALL TURBN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) -! - WRITE(UNIT=ILUOUT,FMT="('********** NEBn *******************')") - CALL NEBN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) -! - WRITE(UNIT=ILUOUT,FMT="('********** DRAGn *******************')") - WRITE(UNIT=ILUOUT,NML=NAM_DRAGn) -! - WRITE(UNIT=ILUOUT,FMT="('********** IBM FORCING *************')") - WRITE(UNIT=ILUOUT,NML=NAM_IBM_PARAMn) -! - WRITE(UNIT=ILUOUT,FMT="('********** RECYLING *************')") - WRITE(UNIT=ILUOUT,NML=NAM_RECYCL_PARAMn) -! - WRITE(UNIT=ILUOUT,FMT="('********** NUDGINGn ****************')") - WRITE(UNIT=ILUOUT,NML=NAM_NUDGINGn) -! - WRITE(UNIT=ILUOUT,FMT="('********** CHEMICAL MONITORn *******')") - WRITE(UNIT=ILUOUT,NML=NAM_CH_MNHCn) -! - WRITE(UNIT=ILUOUT,FMT="('********** CHEMICAL SOLVER *********')") - WRITE(UNIT=ILUOUT,NML=NAM_CH_SOLVERn) -! - WRITE(UNIT=ILUOUT,FMT="('********** BLOWSNOWn ***************')") - WRITE(UNIT=ILUOUT,NML=NAM_BLOWSNOWn) -! - WRITE(UNIT=ILUOUT,FMT="('********** BLANKn ******************')") - WRITE(UNIT=ILUOUT,NML=NAM_BLANKn) -! -! Profilers/stations namelists not read anymore in READ_DESFM_n -! WRITE(UNIT=ILUOUT,FMT="('********** PROFILERn *****************')") -! WRITE(UNIT=ILUOUT,NML=NAM_PROFILERn) -! -! WRITE(UNIT=ILUOUT,FMT="('********** STATIONn ******************')") -! WRITE(UNIT=ILUOUT,NML=NAM_STATIONn) -! - WRITE(UNIT=ILUOUT,FMT="('************ ICE SCHEME ***********************')") - CALL PARAM_ICEN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) -! - WRITE(UNIT=ILUOUT,FMT="('********** BLAZE *******************')") - WRITE(UNIT=ILUOUT,NML=NAM_FIREn) -! - IF (KMI==1) THEN - WRITE(UNIT=ILUOUT,FMT="(/,'PART OF INITIAL FILE COMMON TO ALL THE MODELS')") - WRITE(UNIT=ILUOUT,FMT="( '---------------------------------------------')") -! - WRITE(UNIT=ILUOUT,FMT="('************ CONFIGURATION ********************')") - WRITE(UNIT=ILUOUT,NML=NAM_CONF) -! - WRITE(UNIT=ILUOUT,FMT="('************ DYNAMIC **************************')") - WRITE(UNIT=ILUOUT,NML=NAM_DYN) -! -! Budget namelists not read anymore in READ_DESFM_n -! WRITE(UNIT=ILUOUT,FMT="('************ BUDGET ***************************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BUDGET) -! ! -! WRITE(UNIT=ILUOUT,FMT="('************ U BUDGET *************************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BU_RU) -! ! -! WRITE(UNIT=ILUOUT,FMT="('************ V BUDGET *************************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BU_RV) -! ! -! WRITE(UNIT=ILUOUT,FMT="('************ W BUDGET *************************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BU_RW) -! ! -! WRITE(UNIT=ILUOUT,FMT="('************ TH BUDGET ************************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BU_RTH) -! ! -! WRITE(UNIT=ILUOUT,FMT="('************ TKE BUDGET ***********************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BU_RTKE) -! ! -! WRITE(UNIT=ILUOUT,FMT="('************ RV BUDGET ************************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BU_RRV) -! ! -! WRITE(UNIT=ILUOUT,FMT="('************ RC BUDGET ************************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BU_RRC) -! ! -! WRITE(UNIT=ILUOUT,FMT="('************ RR BUDGET ************************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BU_RRR) -! ! -! WRITE(UNIT=ILUOUT,FMT="('************ RI BUDGET ************************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BU_RRI) -! ! -! WRITE(UNIT=ILUOUT,FMT="('************ RS BUDGET ************************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BU_RRS) -! ! -! WRITE(UNIT=ILUOUT,FMT="('************ RG BUDGET ************************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BU_RRG) -! ! -! WRITE(UNIT=ILUOUT,FMT="('************ RH BUDGET ************************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BU_RRH) -! ! -! WRITE(UNIT=ILUOUT,FMT="('************ SVx BUDGET ***********************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BU_RSV) -! - WRITE(UNIT=ILUOUT,FMT="('************ LES ******************************')") - WRITE(UNIT=ILUOUT,NML=NAM_LES) -! - WRITE(UNIT=ILUOUT,FMT="('************ PDF ******************************')") - WRITE(UNIT=ILUOUT,NML=NAM_PDF) -! - WRITE(UNIT=ILUOUT,FMT="('************ FORCING **************************')") - WRITE(UNIT=ILUOUT,NML=NAM_FRC) -! - WRITE(UNIT=ILUOUT,FMT="('************ ORILAM SCHEME ********************')") - WRITE(UNIT=ILUOUT,NML=NAM_CH_ORILAM) -! - WRITE(UNIT=ILUOUT,FMT="('************ SALT SCHEME **********************')") - WRITE(UNIT=ILUOUT,NML=NAM_SALT) -! - WRITE(UNIT=ILUOUT,FMT="('************ DUST SCHEME **********************')") - WRITE(UNIT=ILUOUT,NML=NAM_DUST) -! - WRITE(UNIT=ILUOUT,FMT="('************ PASSIVE POLLUTANT ***************')") - WRITE(UNIT=ILUOUT,NML=NAM_PASPOL) -! - WRITE(UNIT=ILUOUT,FMT="('************ VISCOSITY ***************')") - WRITE(UNIT=ILUOUT,NML=NAM_VISC) -! -#ifdef MNH_FOREFIRE - WRITE(UNIT=ILUOUT,FMT="('************ FOREFIRE ***************')") - WRITE(UNIT=ILUOUT,NML=NAM_FOREFIRE) -! -#endif -! - WRITE(UNIT=ILUOUT,FMT="('************ CONDITIONAL SAMPLING *************')") - WRITE(UNIT=ILUOUT,NML=NAM_CONDSAMP) - ! - WRITE(UNIT=ILUOUT,FMT="('********** BLOWING SNOW SCHEME******************')") - WRITE(UNIT=ILUOUT,NML=NAM_BLOWSNOW) -! - IF( CCLOUD == 'C2R2' ) THEN - WRITE(UNIT=ILUOUT,FMT="('************ C2R2 SCHEME **********************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_C2R2) - END IF -! - IF( CCLOUD == 'KHKO' ) THEN !modif - WRITE(UNIT=ILUOUT,FMT="('************ KHKO SCHEME **********************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_C2R2) - END IF -! - IF( CCLOUD == 'C3R5' ) THEN - WRITE(UNIT=ILUOUT,FMT="('************ C3R5 SCHEME **********************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_C2R2) - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_C1R3) - END IF -! - IF( CCLOUD == 'LIMA' ) THEN - WRITE(UNIT=ILUOUT,FMT="('************ LIMA SCHEME **********************')") - CALL PARAM_LIMA_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) - END IF -! - IF (CELEC /= 'NONE') THEN - WRITE(UNIT=ILUOUT,FMT="('************ ELEC SCHEME **********************')") - WRITE(UNIT=ILUOUT,NML=NAM_ELEC) - END IF -! - END IF -! -END IF -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE READ_DESFM_n diff --git a/src/PHYEX/ext/read_exsegn.f90 b/src/PHYEX/ext/read_exsegn.f90 deleted file mode 100644 index 1aa20763f..000000000 --- a/src/PHYEX/ext/read_exsegn.f90 +++ /dev/null @@ -1,3040 +0,0 @@ -!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ###################### - MODULE MODI_READ_EXSEG_n -! ###################### -! -INTERFACE -! - SUBROUTINE READ_EXSEG_n(KMI,TPEXSEGFILE,HCONF,OFLAT,OUSERV, & - OUSERC,OUSERR,OUSERI,OUSECI,OUSERS,OUSERG,OUSERH, & - OUSECHEM,OUSECHAQ,OUSECHIC,OCH_PH,OCH_CONV_LINOX,OSALT, & - ODEPOS_SLT, ODUST,ODEPOS_DST, OCHTRANS, & - OORILAM,ODEPOS_AER, OLG,OPASPOL, OFIRE, & -#ifdef MNH_FOREFIRE - OFOREFIRE, & -#endif - OLNOX_EXPLICIT, & - OCONDSAMP,OBLOWSNOW, & - KRIMX,KRIMY, KSV_USER, & - HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC, & - HEQNSYS,PTSTEP_ALL,HINIFILEPGD ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KMI ! Model index -TYPE(TFILEDATA), INTENT(IN) :: TPEXSEGFILE ! EXSEG file -! The following variables are read by READ_DESFM in DESFM descriptor : -CHARACTER (LEN=*), INTENT(IN) :: HCONF ! configuration var. linked to FMfile -LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero orography -LOGICAL, INTENT(IN) :: OUSERV,OUSERC,OUSERR,OUSERI,OUSERS, & - OUSERG,OUSERH ! kind of moist variables in - ! FMfile -LOGICAL, INTENT(IN) :: OUSECI ! ice concentration in - ! FMfile -LOGICAL, INTENT(IN) :: OUSECHEM ! Chemical FLAG in FMFILE -LOGICAL, INTENT(IN) :: OUSECHAQ ! Aqueous chemical FLAG in FMFILE -LOGICAL, INTENT(IN) :: OUSECHIC ! Ice chemical FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCH_PH ! pH FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCH_CONV_LINOX ! LiNOx FLAG in FMFILE -LOGICAL, INTENT(IN) :: ODUST ! Dust FLAG in FMFILE -LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_DST ! Dust wet deposition FLAG in FMFILE -LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_SLT ! Sea Salt wet deposition FLAG in FMFILE -LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_AER ! Orilam wet deposition FLAG in FMFILE -LOGICAL, INTENT(IN) :: OSALT ! Sea Salt FLAG in FMFILE -LOGICAL, INTENT(IN) :: OORILAM ! Orilam FLAG in FMFILE -LOGICAL, INTENT(IN) :: OPASPOL ! Passive pollutant FLAG in FMFILE -LOGICAL, INTENT(IN) :: OFIRE ! Blaze FLAG in FMFILE -#ifdef MNH_FOREFIRE -LOGICAL, INTENT(IN) :: OFOREFIRE ! ForeFire FLAG in FMFILE -#endif -LOGICAL, INTENT(IN) :: OLNOX_EXPLICIT ! explicit LNOx FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCONDSAMP ! Conditional sampling FLAG in FMFILE -LOGICAL, INTENT(IN) :: OBLOWSNOW ! Blowing snow FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCHTRANS ! LCHTRANS FLAG in FMFILE - -LOGICAL, INTENT(IN) :: OLG ! lagrangian FLAG in FMFILE -INTEGER, INTENT(IN) :: KRIMX, KRIMY ! number of points for the - ! horizontal relaxation for the outermost verticals -INTEGER, INTENT(IN) :: KSV_USER ! number of additional scalar - ! variables in FMfile -CHARACTER (LEN=*), INTENT(IN) :: HTURB ! Kind of turbulence parameterization - ! used to produce FMFILE -CHARACTER (LEN=*), INTENT(IN) :: HTOM ! Kind of third order moment -LOGICAL, INTENT(IN) :: ORMC01 ! flag for RMC01 SBL computations -CHARACTER (LEN=*), INTENT(IN) :: HRAD ! Kind of radiation scheme -CHARACTER (LEN=4), INTENT(IN) :: HDCONV ! Kind of deep convection scheme -CHARACTER (LEN=4), INTENT(IN) :: HSCONV ! Kind of shallow convection scheme -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme -CHARACTER (LEN=4), INTENT(IN) :: HELEC ! Kind of electrical scheme -CHARACTER (LEN=*), INTENT(IN) :: HEQNSYS! type of equations' system -REAL,DIMENSION(:), INTENT(INOUT):: PTSTEP_ALL ! Time STEP of ALL models -CHARACTER (LEN=*), INTENT(IN) :: HINIFILEPGD ! name of PGD file -! -END SUBROUTINE READ_EXSEG_n -! -END INTERFACE -! -END MODULE MODI_READ_EXSEG_n -! -! -! ######################################################################### - SUBROUTINE READ_EXSEG_n(KMI,TPEXSEGFILE,HCONF,OFLAT,OUSERV, & - OUSERC,OUSERR,OUSERI,OUSECI,OUSERS,OUSERG,OUSERH, & - OUSECHEM,OUSECHAQ,OUSECHIC,OCH_PH,OCH_CONV_LINOX,OSALT, & - ODEPOS_SLT, ODUST,ODEPOS_DST, OCHTRANS, & - OORILAM,ODEPOS_AER, OLG,OPASPOL, OFIRE, & -#ifdef MNH_FOREFIRE - OFOREFIRE, & -#endif - OLNOX_EXPLICIT, & - OCONDSAMP, OBLOWSNOW, & - KRIMX,KRIMY, KSV_USER, & - HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC, & - HEQNSYS,PTSTEP_ALL,HINIFILEPGD ) -! ######################################################################### -! -!!**** *READ_EXSEG_n * - routine to read the descriptor file EXSEG -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to read the descriptor file called -! EXSEG and to control the coherence with FMfile data . -! -!! -!!** METHOD -!! ------ -!! The descriptor file is read. Namelists (NAMXXXn) which contain -!! variables linked to one nested model are at the beginning of the file. -!! Namelists (NAMXXX) which contain variables common to all models -!! are at the end of the file. When the model index is different from 1, -!! the end of the file (namelists NAMXXX) is not read. -!! -!! Coherence between the initial file (description read in DESFM file) -!! and the segment to perform (description read in EXSEG file) -!! is checked for segment achievement configurations -!! or postprocessing configuration. The get indicators are set according -!! to the following check : -!! -!! - segment achievement and preinit configurations : -!! -!! * if there is no turbulence kinetic energy in initial -!! file (HTURB='NONE'), and the segment to perform requires a turbulence -!! parameterization (CTURB /= 'NONE'), the get indicators for turbulence -!! kinetic energy variables are set to 'INIT'; i.e. these variables will be -!! set equal to zero by READ_FIELD according to the get indicators. -!! * The same procedure is applied to the dissipation of TKE. -!! * if there is no moist variables RRn in initial file (OUSERn=.FALSE.) -!! and the segment to perform requires moist variables RRn -!! (LUSERn=.TRUE.), the get indicators for moist variables RRn are set -!! equal to 'INIT'; i.e. these variables will be set equal to zero by -!! READ_FIELD according to the get indicators. -!! * if there are KSV_USER additional scalar variables in initial file and the -!! segment to perform needs more than KSV_USER additional variables, the get -!! indicators for these (NSV_USER-KSV_USER) additional scalar variables are set -!! equal to 'INIT'; i.e. these variables will be set equal to zero by -!! READ_FIELD according to the get indicators. If the segment to perform -!! needs less additional scalar variables than there are in initial file, -!! the get indicators for these (KSV_USER - NSV_USER) additional scalar variables are -!! set equal to 'SKIP'. -!! * warning messages are printed if the fields in initial file are the -!! same at time t and t-dt (HCONF='START') and a leap-frog advance -!! at first time step will be used for the segment to perform -!! (CCONF='RESTA'); It is likewise when HCONF='RESTA' and CCONF='START'. -!! * A warning message is printed if the orography in initial file is zero -!! (OFLAT=.TRUE.) and the segment to perform considers no-zero orography -!! (LFLAT=.FALSE.). It is likewise for LFLAT=.TRUE. and OFLAT=.FALSE.. -!! If the segment to perform requires zero orography (LFLAT=.TRUE.), the -!! orography (XZS) will not read in initial file but set equal to zero -!! by SET_GRID. -!! * check of the depths of the Lateral Damping Layer in x and y -!! direction is performed -!! * If some coupling files are specified, LSTEADYLS is set to T -!! * If no coupling files are specified, LSTEADYLS is set to F -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODN_CONF : CCONF,LTHINSHELL,LFLAT,NMODEL,NVERB -!! -!! Module MODN_DYN : LCORIO, LZDIFFU -!! -!! Module MODN_NESTING : NDAD(m),NDTRATIO(m),XWAY(m) -!! -!! Module MODN_BUDGET : CBUTYPE,XBULEN -!! -!! Module MODN_CONF1 : LUSERV,LUSERC,LUSERR,LUSERI,LUSERS,LUSERG,LUSERH,CSEG -!! -!! Module MODN_DYN1 : XTSTEP,CPRESOPT,NITR,XRELAX -!! -!! Module MODD_ADV1 : CMET_ADV_SCHEME,CSV_ADV_SCHEME,CUVW_ADV_SCHEME,NLITER -!! -!! Module MODN_PARAM1 : CTURB,CRAD,CDCONV,CSCONV -!! -!! Module MODN_LUNIT1 : -!! Module MODN_LBC1 : CLBCX,CLBCY,NLBLX,NLBLY,XCPHASE,XPOND -!! -!! Module MODN_TURB_n : CTURBLEN,CTURBDIM -!! -!! Module MODD_GET1: -!! CGETTKEM,CGETTKET, -!! CGETRVM,CGETRCM,CGETRRM,CGETRIM,CGETRSM,CGETRGM,CGETRHM -!! CGETRVT,CGETRCT,CGETRRT,CGETRIT,CGETRST,CGETRGT,CGETRHT,CGETSVM -!! CGETSVT,CGETSIGS,CGETSRCM,CGETSRCT -!! NCPL_NBR,NCPL_TIMES,NCPL_CUR -!! Module MODN_LES : contains declaration of the control parameters -!! for Large Eddy Simulations' storages -!! for the forcing -!! -!! REFERENCE -!! --------- -!! Book2 of the documentation (routine READ_EXSEG_n) -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/06/94 -!! Modification 26/10/94 (Stein) remove NAM_GET from the Namelists -!! present in DESFM + change the namelist names -!! Modification 22/11/94 (Stein) add GET indicator for phi -!! Modification 21/12/94 (Stein) add GET indicator for LS fields -!! Modification 06/01/95 (Stein) bug in the test for Scalar Var. -!! Modifications 09/01/95 (Stein) add the turbulence scheme -!! Modifications 09/01/95 (Stein) add the 1D switch -!! Modifications 10/03/95 (Mallet) add coherence in coupling case -!! Modifications 16/03/95 (Stein) remove R from the historical variables -!! Modifications 01/03/95 (Hereil) add the budget namelists -!! Modifications 16/06/95 (Stein) coherence control for the -!! microphysical scheme + remove the wrong messge for RESTA conf -!! Modifications 30/06/95 (Stein) conditionnal reading of the fields -!! used by the moist turbulence scheme -!! Modifications 12/09/95 (Pinty) add the radiation scheme -!! Modification 06/02/96 (J.Vila) implement scalar advection schemes -!! Modifications 24/02/96 (Stein) change the default value for CCPLFILE -!! Modifications 02/05/96 (Stein Jabouille) change the Z0SEA activation -!! Modifications 24/05/96 (Stein) change the SRC SIGS control -!! Modifications 08/09/96 (Masson) the coupling file names are reset to -!! default value " " before reading in EXSEG1.nam -!! to avoid extra non-existant coupling files -!! -!! Modifications 25/04/95 (K.Suhre)add namelist NAM_BLANK -!! add read for LFORCING -!! 25/04/95 (K.Suhre)add namelist NAM_FRC -!! and switch checking -!! 06/08/96 (K.Suhre)add namelist NAM_CH_MNHCn -!! and NAM_CH_SOLVER -!! Modifications 10/10/96 (Stein) change SRC into SRCM and SRCT -!! Modifications 11/04/96 (Pinty) add the rain-ice microphysical scheme -!! Modifications 11/01/97 (Pinty) add the deep convection scheme -!! Modifications 22/05/97 (Lafore) gridnesting implementation -!! Modifications 22/06/97 (Stein) add the absolute pressure + cleaning -!! Modifications 25/08/97 (Masson) add tests on surface schemes -!! 22/10/97 (Stein) remove the RIMX /= 0 control -!! + new namelist + cleaning -!! Modifications 17/04/98 (Masson) add tests on character variables -!! Modification 15/03/99 (Masson) add tests on PROGRAM -!! Modification 04/01/00 (Masson) removes TSZ0 case -!! Modification 04/06/00 (Pinty) add C2R2 scheme -!! 11/12/00 (Tomasini) add CSEA_FLUX to MODD_PARAMn -!! delete the test on SST_FRC only in 1D -!! Modification 22/01/01 (Gazen) change NSV,KSV to NSV_USER,KSV_USER and add -!! NSV_* variables initialization -!! Modification 15/10/01 (Mallet) allow namelists in different orders -!! Modification 18/03/02 (Solmon) new radiation scheme test -!! Modification 29/11/02 (JP Pinty) add C3R5, ICE2, ICE4, ELEC -!! Modification 06/11/02 (Masson) new LES BL height diagnostic -!! Modification 06/11/02 (Jabouille) remove LTHINSHELL LFORCING test -!! Modification 01/12/03 (Gazen) change Chemical scheme interface -!! Modification 01/2004 (Masson) removes surface (externalization) -!! Modification 01/2005 (Masson) removes 1D and 2D switches -!! Modification 04/2005 (Tulet) add dust, orilam -!! Modification 03/2006 (O.Geoffroy) Add KHKO scheme -!! Modification 04/2006 (Maric) include 4th order advection scheme -!! Modification 05/2006 (Masson) add nudging -!! Modification 05/2006 Remove KEPS -!! Modification 04/2006 (Maric) include PPM advection scheme -!! Modification 04/2006 (J.Escobar) Bug dollarn add CALL UPDATE_NAM_CONFN -!! Modifications 01/2007 (Malardel,Pergaud) add the MF shallow -!! convection scheme MODN_PARAM_MFSHALL_n -!! Modification 09/2009 (J.Escobar) add more info on relaxation problems -!! Modification 09/2011 (J.Escobar) re-add 'ZRESI' choose -!! Modification 12/2011 (C.Lac) Adaptation to FIT temporal scheme -!! Modification 12/2012 (S.Bielli) add NAM_NCOUT for netcdf output (removed 08/07/2016) -!! Modification 02/2012 (Pialat/Tulet) add ForeFire -!! Modification 02/2012 (T.Lunet) add of new Runge-Kutta methods -!! Modification 01/2015 (C. Barthe) add explicit LNOx -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! M.Leriche 18/12/2015 : bug chimie glace dans prep_real_case -!! Modification 01/2016 (JP Pinty) Add LIMA -!! Modification 02/2016 (M.Leriche) treat gas and aq. chemicals separately -!! P.Wautelet 08/07/2016 : removed MNH_NCWRIT define -!! Modification 10/2016 (C.LAC) Add OSPLIT_WENO + Add droplet -!! deposition + Add max values -!! Modification 11/2016 (Ph. Wautelet) Allocate/initialise some output/backup structures -!! Modification 03/2017 (JP Chaboureau) Fix the initialization of -!! LUSERx-type variables for LIMA -!! M.Leriche 06/2017 for spawn and prep_real avoid abort if wet dep for -!! aerosol and no cloud scheme defined -!! Q.Libois 02/2018 ECRAD -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! Modification 07/2017 (V. Vionnet) add blowing snow scheme -!! Modification 01/2019 (Q. Rodier) define XCEDIS depending on BL89 or RM17 mixing length -!! Modification 01/2019 (P. Wautelet) bugs correction: incorrect writes -!! Modification 01/2019 (R. Honnert) remove SURF in CMF_UPDRAFT -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! C. Lac 11/2019: correction in the drag formula and application to building in addition to tree -! Q. Rodier 03/2020: add abort if use of any LHORELAX and cyclic conditions -! F.Auguste 02/2021: add IBM -! T.Nagel 02/2021: add turbulence recycling -! E.Jezequel 02/2021: add stations read from CSV file -! P. Wautelet 09/03/2021: simplify allocation of scalar variable names -! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv -! P. Wautelet 10/03/2021: move scalar variable name initializations to ini_nsv -! R. Honnert 23/04/2021: add HM21 mixing length and delete HRIO and BOUT from CMF_UPDRAFT -! S. Riette 11/05/2021 HighLow cloud -! A. Costes 12/2021: add Blaze fire model -! R. Schoetter 12/2021: multi-level coupling between MesoNH and SURFEX -! P. Wautelet 27/04/2022: add namelist for profilers -! P. Wautelet 24/06/2022: remove check on CSTORAGE_TYPE for restart of ForeFire variables -! P. Wautelet 13/07/2022: add namelist for flyers and balloons -! P. Wautelet 19/08/2022: add namelist for aircrafts -!------------------------------------------------------------------------------ -! -!* 0. DECLARATIONS -! ------------ -USE MODD_AIRCRAFT_BALLOON, ONLY: NAIRCRAFTS, NBALLOONS -USE MODD_BLOWSNOW -USE MODD_BUDGET -USE MODD_CH_AEROSOL -USE MODD_CH_M9_n, ONLY : NEQ -USE MODD_CONDSAMP -USE MODD_CONF -USE MODD_CONF_n, ONLY: CSTORAGE_TYPE -USE MODD_CONFZ -! USE MODD_DRAG_n -USE MODD_DUST -USE MODD_DYN -USE MODD_DYN_n, ONLY : LHORELAX_SVLIMA, LHORELAX_SVFIRE -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE -#endif -USE MODD_GET_n -USE MODD_GR_FIELD_n -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_NSV,NSV_USER_n=>NSV_USER -USE MODD_PARAMETERS -USE MODD_PASPOL -USE MODD_SALT -USE MODD_VAR_ll, ONLY: NPROC -USE MODD_VISCOSITY - -USE MODE_MSG -USE MODE_POS - -USE MODI_INI_NSV -USE MODI_TEST_NAM_VAR - -USE MODN_2D_FRC -USE MODN_ADV_n ! The final filling of these modules for the model n is -USE MODN_AIRCRAFTS, ONLY: AIRCRAFTS_NML_ALLOCATE, NAM_AIRCRAFTS -USE MODN_BACKUP -USE MODN_BALLOONS, ONLY: BALLOONS_NML_ALLOCATE, NAM_BALLOONS -USE MODN_BLANK_n -USE MODN_BLOWSNOW -USE MODN_BLOWSNOW_n -USE MODN_BUDGET -USE MODN_CH_MNHC_n -USE MODN_CH_ORILAM -USE MODN_CH_SOLVER_n -USE MODN_CONDSAMP -USE MODN_CONF -USE MODN_CONF_n -USE MODN_CONFZ -USE MODN_DRAGBLDG_n -USE MODN_COUPLING_LEVELS_n -USE MODN_DRAG_n -USE MODN_DRAGTREE_n -USE MODN_DUST -USE MODN_DYN -USE MODN_DYN_n ! to avoid the duplication of this routine for each model. -USE MODN_ELEC -USE MODN_EOL -USE MODN_EOL_ADNR -USE MODN_EOL_ALM -USE MODN_FIRE_n -USE MODN_FLYERS -#ifdef MNH_FOREFIRE -USE MODN_FOREFIRE -#endif -USE MODN_FRC -USE MODN_IBM_PARAM_n -USE MODN_LATZ_EDFLX -USE MODN_LBC_n ! routine is used for each nested model. This has been done -USE MODN_LES -USE MODN_LUNIT_n -USE MODN_MEAN -USE MODN_NESTING -USE MODN_NUDGING_n -USE MODN_OUTPUT -USE MODN_PARAM_C1R3, ONLY : NAM_PARAM_C1R3, CPRISTINE_ICE_C1R3, & - CHEVRIMED_ICE_C1R3 -USE MODN_PARAM_C2R2, ONLY : EPARAM_CCN=>HPARAM_CCN, EINI_CCN=>HINI_CCN, & - WNUC=>XNUC, WALPHAC=>XALPHAC, NAM_PARAM_C2R2 -USE MODN_PARAM_ECRAD_n -USE MODD_PARAM_ICE_n, ONLY : PARAM_ICEN_INIT, PARAM_ICEN, CSUBG_AUCV_RC, CSUBG_AUCV_RI -USE MODN_PARAM_KAFR_n -USE MODD_PARAM_LIMA, ONLY : FINI_CCN=>HINI_CCN,PARAM_LIMA_INIT,NMOD_CCN,LSCAV, & - CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, NMOD_IFN, NMOD_IMM, & - LACTI, LNUCL, XALPHAC, XNUC, LMEYERS, & - LPTSPLIT, LSPRO, LADJ, LKHKO, & - NMOM_C, NMOM_R, NMOM_I, NMOM_S, NMOM_G, NMOM_H -USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN_INIT -USE MODN_PARAM_n ! realized in subroutine ini_model n -USE MODN_PARAM_RAD_n -USE MODN_PASPOL -USE MODN_PROFILER_n, LDIAG_SURFRAD_PROF => LDIAG_SURFRAD -USE MODN_RECYCL_PARAM_n -USE MODN_SALT -USE MODN_SERIES -USE MODN_SERIES_n -USE MODN_STATION_n, LDIAG_SURFRAD_STAT => LDIAG_SURFRAD -USE MODD_TURB_n, ONLY: TURBN_INIT, CTOM, CTURBDIM, LRMC01, LHARAT, & - LCLOUDMODIFLM, CTURBLEN_CLOUD, XCEI_MIN, XCEI_MAX -USE MODD_NEB_n, ONLY: NEBN_INIT, LSIGMAS, LSUBG_COND, CCONDENS, LSTATNW -USE MODN_VISCOSITY -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -! -INTEGER, INTENT(IN) :: KMI ! Model index -TYPE(TFILEDATA), INTENT(IN) :: TPEXSEGFILE ! EXSEG file -! The following variables are read by READ_DESFM in DESFM descriptor : -CHARACTER (LEN=*), INTENT(IN) :: HCONF ! configuration var. linked to FMfile -LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero orography -LOGICAL, INTENT(IN) :: OUSERV,OUSERC,OUSERR,OUSERI,OUSERS, & - OUSERG,OUSERH ! kind of moist variables in - ! FMfile -LOGICAL, INTENT(IN) :: OUSECI ! ice concentration in - ! FMfile -LOGICAL, INTENT(IN) :: OUSECHEM ! Chemical FLAG in FMFILE -LOGICAL, INTENT(IN) :: OUSECHAQ ! Aqueous chemical FLAG in FMFILE -LOGICAL, INTENT(IN) :: OUSECHIC ! Ice chemical FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCH_PH ! pH FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCH_CONV_LINOX ! LiNOx FLAG in FMFILE -LOGICAL, INTENT(IN) :: ODUST ! Dust FLAG in FMFILE -LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_DST ! Dust Deposition FLAG in FMFILE -LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_SLT ! Sea Salt wet deposition FLAG in FMFILE -LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_AER ! Orilam wet deposition FLAG in FMFILE -LOGICAL, INTENT(IN) :: OSALT ! Sea Salt FLAG in FMFILE -LOGICAL, INTENT(IN) :: OORILAM ! Orilam FLAG in FMFILE -LOGICAL, INTENT(IN) :: OPASPOL ! Passive pollutant FLAG in FMFILE -LOGICAL, INTENT(IN) :: OFIRE ! Blaze FLAG in FMFILE -#ifdef MNH_FOREFIRE -LOGICAL, INTENT(IN) :: OFOREFIRE ! ForeFire FLAG in FMFILE -#endif -LOGICAL, INTENT(IN) :: OLNOX_EXPLICIT ! explicit LNOx FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCONDSAMP ! Conditional sampling FLAG in FMFILE -LOGICAL, INTENT(IN) :: OCHTRANS ! LCHTRANS FLAG in FMFILE -LOGICAL, INTENT(IN) :: OBLOWSNOW ! Blowing snow FLAG in FMFILE - -LOGICAL, INTENT(IN) :: OLG ! lagrangian FLAG in FMFILE -INTEGER, INTENT(IN) :: KRIMX, KRIMY ! number of points for the - ! horizontal relaxation for the outermost verticals -INTEGER, INTENT(IN) :: KSV_USER ! number of additional scalar - ! variables in FMfile -CHARACTER (LEN=*), INTENT(IN) :: HTURB ! Kind of turbulence parameterization - ! used to produce FMFILE -CHARACTER (LEN=*), INTENT(IN) :: HTOM ! Kind of third order moment -LOGICAL, INTENT(IN) :: ORMC01 ! flag for RMC01 SBL computations -CHARACTER (LEN=*), INTENT(IN) :: HRAD ! Kind of radiation scheme -CHARACTER (LEN=4), INTENT(IN) :: HDCONV ! Kind of deep convection scheme -CHARACTER (LEN=4), INTENT(IN) :: HSCONV ! Kind of shallow convection scheme -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme -CHARACTER (LEN=4), INTENT(IN) :: HELEC ! Kind of electrical scheme -CHARACTER (LEN=*), INTENT(IN) :: HEQNSYS! type of equations' system -REAL,DIMENSION(:), INTENT(INOUT):: PTSTEP_ALL ! Time STEP of ALL models -CHARACTER (LEN=*), INTENT(IN) :: HINIFILEPGD ! name of PGD file -! -!* 0.2 declarations of local variables -! -CHARACTER(LEN=3) :: YMODEL -INTEGER :: ILUSEG,ILUOUT ! logical unit numbers of EXSEG file and outputlisting -INTEGER :: JS,JCI,JI,JSV ! Loop indexes -LOGICAL :: GRELAX -LOGICAL :: GFOUND ! Return code when searching namelist -! -!------------------------------------------------------------------------------- -! -!* 1. READ EXSEG FILE -! --------------- -! -CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_EXSEG_n','called for '//TRIM(TPEXSEGFILE%CNAME)) -! -ILUSEG = TPEXSEGFILE%NLU -ILUOUT = TLUOUT%NLU -! -CALL INIT_NAM_LUNITN -CCPLFILE(:)=" " -CALL INIT_NAM_CONFN -CALL INIT_NAM_DYNN -CALL INIT_NAM_ADVN -CALL INIT_NAM_DRAGTREEN -CALL INIT_NAM_DRAGBLDGN -CALL INIT_NAM_COUPLING_LEVELSN -CALL INIT_NAM_PARAMN -CALL INIT_NAM_PARAM_RADN -#ifdef MNH_ECRAD -CALL INIT_NAM_PARAM_ECRADN -#endif -CALL INIT_NAM_PARAM_KAFRN -CALL INIT_NAM_LBCN -CALL INIT_NAM_NUDGINGN -CALL INIT_NAM_BLANKN -CALL INIT_NAM_DRAGN -CALL INIT_NAM_IBM_PARAMN -CALL INIT_NAM_RECYCL_PARAMN -CALL INIT_NAM_CH_MNHCN -CALL INIT_NAM_CH_SOLVERN -CALL INIT_NAM_SERIESN -CALL INIT_NAM_BLOWSNOWN -CALL INIT_NAM_PROFILERn -CALL INIT_NAM_STATIONn -CALL INIT_NAM_FIREn -! -WRITE(UNIT=ILUOUT,FMT="(/,'READING THE EXSEG.NAM FILE')") -CALL POSNAM( TPEXSEGFILE, 'NAM_LUNITN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LUNITn) -CALL POSNAM( TPEXSEGFILE, 'NAM_CONFN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFn) -CALL POSNAM( TPEXSEGFILE, 'NAM_DYNN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DYNn) -CALL POSNAM( TPEXSEGFILE, 'NAM_ADVN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_ADVn) -CALL POSNAM( TPEXSEGFILE, 'NAM_PARAMN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAMn) -CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_RADN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_RADn) -#ifdef MNH_ECRAD -CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_ECRADN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_ECRADn) -#endif -CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_KAFRN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_KAFRn) -CALL PARAM_MFSHALLN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) -CALL POSNAM( TPEXSEGFILE, 'NAM_LBCN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LBCn) -CALL POSNAM( TPEXSEGFILE, 'NAM_NUDGINGN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_NUDGINGn) -CALL TURBN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) -CALL NEBN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) -CALL PARAM_ICEN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) -CALL POSNAM( TPEXSEGFILE, 'NAM_DRAGN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGn) -CALL POSNAM( TPEXSEGFILE, 'NAM_IBM_PARAMN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_IBM_PARAMn) -CALL POSNAM( TPEXSEGFILE, 'NAM_RECYCL_PARAMN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_RECYCL_PARAMn) -CALL POSNAM( TPEXSEGFILE, 'NAM_CH_MNHCN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CH_MNHCn) -CALL POSNAM( TPEXSEGFILE, 'NAM_CH_SOLVERN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CH_SOLVERn) -CALL POSNAM( TPEXSEGFILE, 'NAM_SERIESN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SERIESn) -CALL POSNAM( TPEXSEGFILE, 'NAM_BLANKN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLANKn) -CALL POSNAM( TPEXSEGFILE, 'NAM_BLOWSNOWN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLOWSNOWn) -CALL POSNAM( TPEXSEGFILE, 'NAM_DRAGTREEN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGTREEn) -CALL POSNAM( TPEXSEGFILE, 'NAM_DRAGBLDGN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGBLDGn) -CALL POSNAM( TPEXSEGFILE,'NAM_COUPLING_LEVELSN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_COUPLING_LEVELSn) -CALL POSNAM( TPEXSEGFILE, 'NAM_EOL', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL) -CALL POSNAM( TPEXSEGFILE, 'NAM_EOL_ADNR', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL_ADNR) -CALL POSNAM( TPEXSEGFILE, 'NAM_EOL_ALM', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL_ALM) -CALL POSNAM( TPEXSEGFILE, 'NAM_PROFILERN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PROFILERn) -CALL POSNAM( TPEXSEGFILE, 'NAM_STATIONN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_STATIONn) -CALL POSNAM( TPEXSEGFILE, 'NAM_FIREN', GFOUND ) -IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FIREn) -! -IF (KMI == 1) THEN - WRITE(UNIT=ILUOUT,FMT="(' namelists common to all the models ')") - CALL POSNAM( TPEXSEGFILE, 'NAM_CONF', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONF) - CALL POSNAM( TPEXSEGFILE, 'NAM_CONFZ', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFZ) - CALL POSNAM( TPEXSEGFILE, 'NAM_DYN', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DYN) - CALL POSNAM( TPEXSEGFILE, 'NAM_NESTING', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_NESTING) - CALL POSNAM( TPEXSEGFILE, 'NAM_BACKUP', GFOUND ) - IF (GFOUND) THEN - !Should have been allocated before in READ_DESFM_n - IF (.NOT.ALLOCATED(XBAK_TIME)) THEN - ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX)) - XBAK_TIME(:,:) = XNEGUNDEF - END IF - IF (.NOT.ALLOCATED(XOUT_TIME)) THEN - ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX)) !Allocate *OUT* variables to prevent - XOUT_TIME(:,:) = XNEGUNDEF - END IF - IF (.NOT.ALLOCATED(NBAK_STEP)) THEN - ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX)) - NBAK_STEP(:,:) = NNEGUNDEF - END IF - IF (.NOT.ALLOCATED(NOUT_STEP)) THEN - ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX)) !problems if NAM_OUTPUT does not exist - NOUT_STEP(:,:) = NNEGUNDEF - END IF - IF (.NOT.ALLOCATED(COUT_VAR)) THEN - ALLOCATE(COUT_VAR (NMODEL,JPOUTVARMAX)) - COUT_VAR(:,:) = '' - END IF - READ(UNIT=ILUSEG,NML=NAM_BACKUP) - ELSE - CALL POSNAM( TPEXSEGFILE, 'NAM_FMOUT', GFOUND ) - IF (GFOUND) THEN - CALL PRINT_MSG(NVERB_FATAL,'IO','READ_EXSEG_n','use namelist NAM_BACKUP instead of namelist NAM_FMOUT') - ELSE - IF (CPROGRAM=='MESONH') CALL PRINT_MSG(NVERB_ERROR,'IO','READ_EXSEG_n','namelist NAM_BACKUP not found') - END IF - END IF - CALL POSNAM( TPEXSEGFILE, 'NAM_OUTPUT', GFOUND ) - IF (GFOUND) THEN - !Should have been allocated before in READ_DESFM_n - IF (.NOT.ALLOCATED(XBAK_TIME)) THEN - ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX)) !Allocate *BAK* variables to prevent - XBAK_TIME(:,:) = XNEGUNDEF - END IF - IF (.NOT.ALLOCATED(XOUT_TIME)) THEN - ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX)) - XOUT_TIME(:,:) = XNEGUNDEF - END IF - IF (.NOT.ALLOCATED(NBAK_STEP)) THEN - ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX)) !problems if NAM_BACKUP does not exist - NBAK_STEP(:,:) = NNEGUNDEF - END IF - IF (.NOT.ALLOCATED(NOUT_STEP)) THEN - ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX)) - NOUT_STEP(:,:) = NNEGUNDEF - END IF - IF (.NOT.ALLOCATED(COUT_VAR)) THEN - ALLOCATE(COUT_VAR (NMODEL,JPOUTVARMAX)) - COUT_VAR(:,:) = '' - END IF - READ(UNIT=ILUSEG,NML=NAM_OUTPUT) - END IF - CALL POSNAM( TPEXSEGFILE, 'NAM_BUDGET', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BUDGET) - - CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RU', GFOUND ) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RU ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RU was already allocated' ) - DEALLOCATE( CBULIST_RU ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RU(NBULISTMAXLINES) ) - CBULIST_RU(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RU) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RU(0) ) - END IF - - CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RV', GFOUND ) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RV ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RV was already allocated' ) - DEALLOCATE( CBULIST_RV ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RV(NBULISTMAXLINES) ) - CBULIST_RV(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RV) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RV(0) ) - END IF - - CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RW', GFOUND ) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RW ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RW was already allocated' ) - DEALLOCATE( CBULIST_RW ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RW(NBULISTMAXLINES) ) - CBULIST_RW(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RW) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RW(0) ) - END IF - - CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RTH', GFOUND ) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RTH ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RTH was already allocated' ) - DEALLOCATE( CBULIST_RTH ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTH(NBULISTMAXLINES) ) - CBULIST_RTH(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RTH) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTH(0) ) - END IF - - CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RTKE', GFOUND ) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RTKE ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RTKE was already allocated' ) - DEALLOCATE( CBULIST_RTKE ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTKE(NBULISTMAXLINES) ) - CBULIST_RTKE(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RTKE) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTKE(0) ) - END IF - - CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRV', GFOUND ) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RRV ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRV was already allocated' ) - DEALLOCATE( CBULIST_RRV ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRV(NBULISTMAXLINES) ) - CBULIST_RRV(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RRV) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRV(0) ) - END IF - - CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRC', GFOUND ) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RRC ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRC was already allocated' ) - DEALLOCATE( CBULIST_RRC ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRC(NBULISTMAXLINES) ) - CBULIST_RRC(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RRC) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRC(0) ) - END IF - - CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRR', GFOUND ) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RRR ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRR was already allocated' ) - DEALLOCATE( CBULIST_RRR ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRR(NBULISTMAXLINES) ) - CBULIST_RRR(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RRR) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRR(0) ) - END IF - - CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRI', GFOUND ) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RRI ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRI was already allocated' ) - DEALLOCATE( CBULIST_RRI ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRI(NBULISTMAXLINES) ) - CBULIST_RRI(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RRI) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRI(0) ) - END IF - - CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRS', GFOUND ) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RRS ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRS was already allocated' ) - DEALLOCATE( CBULIST_RRS ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRS(NBULISTMAXLINES) ) - CBULIST_RRS(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RRS) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRS(0) ) - END IF - - CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRG', GFOUND ) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RRG ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRG was already allocated' ) - DEALLOCATE( CBULIST_RRG ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRG(NBULISTMAXLINES) ) - CBULIST_RRG(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RRG) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRG(0) ) - END IF - - CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRH', GFOUND ) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RRH ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRH was already allocated' ) - DEALLOCATE( CBULIST_RRH ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRH(NBULISTMAXLINES) ) - CBULIST_RRH(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RRH) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRH(0) ) - END IF - - CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RSV', GFOUND ) - IF (GFOUND) THEN - IF ( ALLOCATED( CBULIST_RSV ) ) THEN - CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RSV was already allocated' ) - DEALLOCATE( CBULIST_RSV ) - END IF - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RSV(NBULISTMAXLINES) ) - CBULIST_RSV(:) = '' - READ(UNIT=ILUSEG,NML=NAM_BU_RSV) - ELSE - ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RSV(0) ) - END IF - - CALL POSNAM( TPEXSEGFILE, 'NAM_LES', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LES) - CALL POSNAM( TPEXSEGFILE, 'NAM_MEAN', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_MEAN) - CALL POSNAM( TPEXSEGFILE, 'NAM_PDF', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PDF) - CALL POSNAM( TPEXSEGFILE, 'NAM_FRC', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FRC) - CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_C2R2', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_C2R2) - CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_C1R3', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_C1R3) - CALL PARAM_LIMA_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0) - CALL POSNAM( TPEXSEGFILE, 'NAM_ELEC', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_ELEC) - CALL POSNAM( TPEXSEGFILE, 'NAM_SERIES', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SERIES) - CALL POSNAM( TPEXSEGFILE, 'NAM_CH_ORILAM', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CH_ORILAM) - CALL POSNAM( TPEXSEGFILE, 'NAM_DUST', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DUST) - CALL POSNAM( TPEXSEGFILE, 'NAM_SALT', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SALT) - CALL POSNAM( TPEXSEGFILE, 'NAM_PASPOL', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PASPOL) -#ifdef MNH_FOREFIRE - CALL POSNAM( TPEXSEGFILE, 'NAM_FOREFIRE', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FOREFIRE) -#endif - CALL POSNAM( TPEXSEGFILE, 'NAM_CONDSAMP', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONDSAMP) - CALL POSNAM( TPEXSEGFILE, 'NAM_2D_FRC', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_2D_FRC) - CALL POSNAM( TPEXSEGFILE, 'NAM_LATZ_EDFLX', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LATZ_EDFLX) - CALL POSNAM( TPEXSEGFILE, 'NAM_BLOWSNOW', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLOWSNOW) - CALL POSNAM( TPEXSEGFILE, 'NAM_VISC', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_VISC) - - CALL POSNAM( TPEXSEGFILE, 'NAM_FLYERS', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FLYERS) - - IF ( NAIRCRAFTS > 0 ) THEN - CALL AIRCRAFTS_NML_ALLOCATE( NAIRCRAFTS ) - CALL POSNAM( TPEXSEGFILE, 'NAM_AIRCRAFTS', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_AIRCRAFTS) - END IF - - IF ( NBALLOONS > 0 ) THEN - CALL BALLOONS_NML_ALLOCATE( NBALLOONS ) - CALL POSNAM( TPEXSEGFILE, 'NAM_BALLOONS', GFOUND ) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BALLOONS) - END IF -END IF -! -!------------------------------------------------------------------------------- -! -CALL TEST_NAM_VAR(ILUOUT,'CPRESOPT',CPRESOPT,'RICHA','CGRAD','CRESI','ZRESI') -! -CALL TEST_NAM_VAR(ILUOUT,'CUVW_ADV_SCHEME',CUVW_ADV_SCHEME, & - 'CEN4TH','CEN2ND','WENO_K' ) -CALL TEST_NAM_VAR(ILUOUT,'CMET_ADV_SCHEME',CMET_ADV_SCHEME, & - &'PPM_00','PPM_01','PPM_02') -CALL TEST_NAM_VAR(ILUOUT,'CSV_ADV_SCHEME',CSV_ADV_SCHEME, & - &'PPM_00','PPM_01','PPM_02') -CALL TEST_NAM_VAR(ILUOUT,'CTEMP_SCHEME',CTEMP_SCHEME, & - &'RK11','RK21','RK33','RKC4','RK53','RK4B','RK62','RK65','NP32','SP32','LEFR') -! -CALL TEST_NAM_VAR(ILUOUT,'CTURB',CTURB,'NONE','TKEL') -CALL TEST_NAM_VAR(ILUOUT,'CRAD',CRAD,'NONE','FIXE','ECMW',& -#ifdef MNH_ECRAD - 'ECRA',& -#endif - 'TOPA') -CALL TEST_NAM_VAR(ILUOUT,'CCLOUD',CCLOUD,'NONE','REVE','KESS', & - & 'ICE3','ICE4','C2R2','C3R5','KHKO','LIMA') -CALL TEST_NAM_VAR(ILUOUT,'CDCONV',CDCONV,'NONE','KAFR') -CALL TEST_NAM_VAR(ILUOUT,'CSCONV',CSCONV,'NONE','KAFR','EDKF') -CALL TEST_NAM_VAR(ILUOUT,'CELEC',CELEC,'NONE','ELE3','ELE4') -! -CALL TEST_NAM_VAR(ILUOUT,'CAER',CAER,'TANR','TEGE','SURF','NONE') -CALL TEST_NAM_VAR(ILUOUT,'CAOP',CAOP,'CLIM','EXPL') -CALL TEST_NAM_VAR(ILUOUT,'CLW',CLW,'RRTM','MORC') -CALL TEST_NAM_VAR(ILUOUT,'CEFRADL',CEFRADL,'PRES','OCLN','MART','C2R2','LIMA') -CALL TEST_NAM_VAR(ILUOUT,'CEFRADI',CEFRADI,'FX40','LIOU','SURI','C3R5','LIMA') -CALL TEST_NAM_VAR(ILUOUT,'COPWLW',COPWLW,'SAVI','SMSH','LILI','MALA') -CALL TEST_NAM_VAR(ILUOUT,'COPILW',COPILW,'FULI','EBCU','SMSH','FU98') -CALL TEST_NAM_VAR(ILUOUT,'COPWSW',COPWSW,'SLIN','FOUQ','MALA') -CALL TEST_NAM_VAR(ILUOUT,'COPISW',COPISW,'FULI','EBCU','FU96') -! -CALL TEST_NAM_VAR(ILUOUT,'CLBCX(1)',CLBCX(1),'CYCL','WALL','OPEN') -CALL TEST_NAM_VAR(ILUOUT,'CLBCX(2)',CLBCX(2),'CYCL','WALL','OPEN') -CALL TEST_NAM_VAR(ILUOUT,'CLBCY(1)',CLBCY(1),'CYCL','WALL','OPEN') -CALL TEST_NAM_VAR(ILUOUT,'CLBCY(2)',CLBCY(2),'CYCL','WALL','OPEN') -! -CALL TURBN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0) -CALL NEBN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0) -! -CALL TEST_NAM_VAR(ILUOUT,'CCH_TDISCRETIZATION',CCH_TDISCRETIZATION, & - 'SPLIT ','CENTER ','LAGGED ') -! -CALL TEST_NAM_VAR(ILUOUT,'CCONF',CCONF,'START','RESTA') -CALL TEST_NAM_VAR(ILUOUT,'CEQNSYS',CEQNSYS,'LHE','DUR','MAE') -CALL TEST_NAM_VAR(ILUOUT,'CSPLIT',CSPLIT,'BSPLITTING','XSPLITTING','YSPLITTING') -! -CALL TEST_NAM_VAR(ILUOUT,'CBUTYPE',CBUTYPE,'NONE','CART','MASK') -! -CALL TEST_NAM_VAR(ILUOUT,'CRELAX_HEIGHT_TYPE',CRELAX_HEIGHT_TYPE,'FIXE','THGR') -! -CALL TEST_NAM_VAR(ILUOUT,'CLES_NORM_TYPE',CLES_NORM_TYPE,'NONE','CONV','EKMA','MOBU') -CALL TEST_NAM_VAR(ILUOUT,'CBL_HEIGHT_DEF',CBL_HEIGHT_DEF,'TKE','KE','WTV','FRI','DTH') -CALL TEST_NAM_VAR(ILUOUT,'CTURBLEN_CLOUD',CTURBLEN_CLOUD,'NONE','DEAR','DELT','BL89') -! -! The test on the mass flux scheme for shallow convection -! -CALL PARAM_MFSHALLN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0) -! -! The test on the CSOLVER name is made elsewhere -! -CALL PARAM_ICEN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0) -IF( CCLOUD == 'C3R5' ) THEN - CALL TEST_NAM_VAR(ILUOUT,'CPRISTINE_ICE_C1R3',CPRISTINE_ICE_C1R3, & - 'PLAT','COLU','BURO') - CALL TEST_NAM_VAR(ILUOUT,'CHEVRIMED_ICE_C1R3',CHEVRIMED_ICE_C1R3, & - 'GRAU','HAIL') -END IF -! -IF( CCLOUD == 'LIMA' ) THEN - CALL PARAM_LIMA_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0) -END IF -! Blaze -CALL UPDATE_NAM_FIREn -IF (LBLAZE) THEN - ! Blaze is only allowed on finer model(s) - DO JI = 1, NMODEL - IF ( JI /= KMI .AND. NDAD(JI) == KMI ) THEN - WRITE( YMODEL, '( I3 )' ) JI - CMNHMSG(1) = 'Blaze fire model only allowed on finer model' - CMNHMSG(2) = '=> disabled on model ' // YMODEL - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'READ_EXSEG_n' ) - LBLAZE = .FALSE. - END IF - END DO - CALL TEST_NAM_VAR(ILUOUT,'CPROPAG_MODEL',CPROPAG_MODEL,'SANTONI2011') - CALL TEST_NAM_VAR(ILUOUT,'CHEAT_FLUX_MODEL',CHEAT_FLUX_MODEL,'CST','EXP','EXS') - CALL TEST_NAM_VAR(ILUOUT,'CLATENT_FLUX_MODEL',CLATENT_FLUX_MODEL,'CST','EXP') - CALL TEST_NAM_VAR(ILUOUT,'CFIRE_CPL_MODE',CFIRE_CPL_MODE,'2WAYCPL','FIR2ATM','ATM2FIR') - CALL TEST_NAM_VAR(ILUOUT,'CWINDFILTER',CWINDFILTER,'EWAM','WLIM') -END IF -! -IF(LBLOWSNOW) THEN - CALL TEST_NAM_VAR(ILUOUT,'CSNOWSEDIM',CSNOWSEDIM,'NONE','MITC','CARR','TABC') - IF (XALPHA_SNOW .NE. 3 .AND. CSNOWSEDIM=='TABC') THEN - WRITE(ILUOUT,*) '*****************************************' - WRITE(ILUOUT,*) '* XALPHA_SNW must be set to 3 when ' - WRITE(ILUOUT,*) '* CSNOWSEDIM = TABC ' - WRITE(ILUOUT,*) '* Update the look-up table in BLOWSNOW_SEDIM_LKT1D ' - WRITE(ILUOUT,*) '* to use TABC with a different value of XEMIALPHA_SNW' - WRITE(ILUOUT,*) '*****************************************' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - ENDIF -END IF -! Consistency checks between phyex modules -IF ((CSUBG_AUCV_RC == 'ADJU' .OR. CSUBG_AUCV_RI == 'ADJU') .AND. CCONDENS /= 'GAUS') THEN - CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'READ_EXSEGN', & - &"CSUBG_AUCV_RC and/or CSUBG_AUCV_RI cannot be 'ADJU' if CCONDENS is not 'GAUS'") -ENDIF -IF (.NOT. LHARAT .AND. LSTATNW) THEN - CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'READ_EXSEGN', & - &'LSTATNW only tested in combination with HARATU and EDMFm!') -ENDIF -! -!-------------------------------------------------------------------------------! -!* 2. FIRST INITIALIZATIONS -! --------------------- -! -!* 2.1 Time step in gridnesting case -! -IF (KMI /= 1 .AND. NDAD(KMI) /= KMI) THEN - XTSTEP = PTSTEP_ALL(NDAD(KMI)) / NDTRATIO(KMI) -END IF -PTSTEP_ALL(KMI) = XTSTEP -! -!* 2.2 Fill the global configuration module -! -! Check coherence between the microphysical scheme and water species and -!initialize the logicals LUSERn -! -SELECT CASE ( CCLOUD ) - CASE ( 'NONE' ) - IF (.NOT. ( (.NOT. LUSERC) .AND. (.NOT. LUSERR) .AND. (.NOT. LUSERI) .AND. & - (.NOT. LUSERS) .AND. (.NOT. LUSERG) .AND. (.NOT. LUSERH) & - ) .AND. CPROGRAM=='MESONH' ) THEN -! - LUSERC=.FALSE. - LUSERR=.FALSE.; LUSERI=.FALSE. - LUSERS=.FALSE.; LUSERG=.FALSE. - LUSERH=.FALSE. -! - END IF -! - IF (CSUBG_AUCV_RC == 'SIGM') THEN -! - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE THE SUBGRID AUTOCONVERSION SCHEME ' - WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT MICROPHYSICS' - WRITE(UNIT=ILUOUT,FMT=*) ' CSUBG_AUCV IS PUT TO "NONE"' -! - CSUBG_AUCV_RC = 'NONE' -! - END IF -! - CASE ( 'REVE' ) - IF (.NOT. ( LUSERV .AND. LUSERC .AND. (.NOT. LUSERR) .AND. (.NOT. LUSERI) & - .AND. (.NOT. LUSERS) .AND. (.NOT. LUSERG) .AND. (.NOT. LUSERH) & - ) ) THEN -! - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A REVERSIBLE MICROPHYSICAL " ,& - &" SCHEME. YOU WILL ONLY HAVE VAPOR AND CLOUD WATER ",/, & - &" LUSERV AND LUSERC ARE TO TRUE AND THE OTHERS TO FALSE ")') -! - LUSERV=.TRUE. ; LUSERC=.TRUE. - LUSERR=.FALSE.; LUSERI=.FALSE. - LUSERS=.FALSE.; LUSERG=.FALSE. - LUSERH=.FALSE. - END IF -! - IF (CSUBG_AUCV_RC == 'SIGM') THEN -! - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE BOTH A REVERSIBLE MICROPHYSICAL SCHEME ' - WRITE(UNIT=ILUOUT,FMT=*) ' AND THE SUBGRID AUTOCONVERSION SCHEME ' - WRITE(UNIT=ILUOUT,FMT=*) 'BUT YOU DO NOT HAVE RAIN in the "REVE" SCHEME' - WRITE(UNIT=ILUOUT,FMT=*) ' CSUBG_AUCV_RC IS PUT TO "NONE"' -! - CSUBG_AUCV_RC = 'NONE' -! - END IF -! - CASE ( 'KESS' ) - IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. (.NOT. LUSERI) .AND. & - (.NOT. LUSERS) .AND. (.NOT. LUSERG) .AND. (.NOT. LUSERH) & - ) ) THEN -! - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A KESSLER MICROPHYSICAL " , & - &" SCHEME. YOU WILL ONLY HAVE VAPOR, CLOUD WATER AND RAIN ",/, & - &" LUSERV, LUSERC AND LUSERR ARE SET TO TRUE AND THE OTHERS TO FALSE ")') -! - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.FALSE.; LUSERS=.FALSE. - LUSERG=.FALSE.; LUSERH=.FALSE. - END IF -! - IF (CSUBG_AUCV_RC == 'SIGM') THEN -! - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE BOTH A KESSLER MICROPHYSICAL SCHEME ' - WRITE(UNIT=ILUOUT,FMT=*) ' AND THE SUBGRID AUTOCONVERSION SCHEME USING' - WRITE(UNIT=ILUOUT,FMT=*) 'SIGMA_RC.' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT YET AVAILABLE.' - WRITE(UNIT=ILUOUT,FMT=*) 'SET CSUBG_AUCV_RC TO "CLFR" or "NONE" OR CCLOUD TO "ICE3"' -! - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - CASE ( 'ICE3' ) - IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. LUSERI .AND. LUSECI & - .AND. LUSERS .AND. LUSERG .AND. (.NOT. LUSERH)) & - .AND. CPROGRAM=='MESONH' ) THEN - ! - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE THE ice3 SIMPLE MIXED PHASE' - WRITE(UNIT=ILUOUT,FMT=*) 'MICROPHYSICAL SCHEME. YOU WILL ONLY HAVE VAPOR, CLOUD WATER,' - WRITE(UNIT=ILUOUT,FMT=*) 'RAIN WATER, CLOUD ICE (MIXING RATIO AND CONCENTRATION)' - WRITE(UNIT=ILUOUT,FMT=*) 'SNOW-AGGREGATES AND GRAUPELN.' - WRITE(UNIT=ILUOUT,FMT=*) 'LUSERV,LUSERC,LUSERR,LUSERI,LUSECI,LUSERS,LUSERG ARE SET TO TRUE' - WRITE(UNIT=ILUOUT,FMT=*) 'AND LUSERH TO FALSE' -! - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.TRUE. ; LUSECI=.TRUE. - LUSERS=.TRUE. ; LUSERG=.TRUE. - LUSERH=.FALSE. - END IF -! - IF (CSUBG_AUCV_RC == 'SIGM' .AND. .NOT. LSUBG_COND) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID AUTOCONVERSION SCHEME' - WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT THE SUBGRID CONDENSATION SCHEME.' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV_RC is SET to NONE' - CSUBG_AUCV_RC='NONE' - END IF -! - IF (CSUBG_AUCV_RC == 'CLFR' .AND. CSCONV /= 'EDKF') THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID AUTOCONVERSION SCHEME' - WRITE(UNIT=ILUOUT,FMT=*) 'WITH THE CONVECTIVE CLOUD FRACTION WITHOUT EDKF' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV_RC is SET to NONE' - CSUBG_AUCV_RC='NONE' - END IF -! - CASE ( 'ICE4' ) - IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. LUSERI .AND. LUSECI & - .AND. LUSERS .AND. LUSERG .AND. LUSERH) & - .AND. CPROGRAM=='MESONH' ) THEN - ! - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE THE ice4 SIMPLE MIXED PHASE' - WRITE(UNIT=ILUOUT,FMT=*) 'MICROPHYSICAL SCHEME. YOU WILL ONLY HAVE VAPOR, CLOUD WATER,' - WRITE(UNIT=ILUOUT,FMT=*) 'RAIN WATER, CLOUD ICE (MIXING RATIO AND CONCENTRATION)' - WRITE(UNIT=ILUOUT,FMT=*) 'SNOW-AGGREGATES, GRAUPELN AND HAILSTONES.' - WRITE(UNIT=ILUOUT,FMT=*) 'LUSERV,LUSERC,LUSERR,LUSERI,LUSECI,LUSERS,LUSERG' - WRITE(UNIT=ILUOUT,FMT=*) 'AND LUSERH ARE SET TO TRUE' -! - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.TRUE. ; LUSECI=.TRUE. - LUSERS=.TRUE. ; LUSERG=.TRUE. ; LUSERH=.TRUE. - END IF -! - IF (CSUBG_AUCV_RC /= 'NONE' .AND. .NOT. LSUBG_COND) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID AUTOCONVERSION SCHEME' - WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT THE SUBGRID CONDENSATION SCHEME.' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV_RC is SET to NONE' - CSUBG_AUCV_RC='NONE' - END IF -! - CASE ( 'C2R2','C3R5', 'KHKO' ) - IF (( EPARAM_CCN == 'XXX') .OR. (EINI_CCN == 'XXX')) THEN - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A 2-MOMENT MICROPHYSICAL ", & - &" SCHEME BUT YOU DIDNT FILL CORRECTLY NAM_PARAM_C2R2", & - &" YOU HAVE TO FILL HPARAM_CCN and HINI_CCN ")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF - IF (HCLOUD == 'NONE') THEN - CGETCLOUD = 'SKIP' - ELSE IF (HCLOUD == 'REVE' ) THEN - CGETCLOUD = 'INI1' - ELSE IF (HCLOUD == 'KESS' ) THEN - CGETCLOUD = 'INI2' - ELSE IF (HCLOUD == 'ICE3' ) THEN - IF (CCLOUD == 'C3R5') THEN - CGETCLOUD = 'INI2' - ELSE - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE WARM MICROPHYSICAL ", & - &" SCHEME BUT YOU WERE USING THE ICE3 SCHEME PREVIOUSLY.",/, & - &" AS THIS IS A LITTLE BIT STUPID IT IS NOT AUTHORIZED !!!")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF - ELSE - CGETCLOUD = 'READ' ! This is automatically done - END IF -! - IF ((CCLOUD == 'C2R2' ).OR. (CCLOUD == 'KHKO' )) THEN - IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. (.NOT. LUSERI) .AND. & - (.NOT. LUSERS) .AND. (.NOT. LUSERG) .AND. (.NOT. LUSERH) & - ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE C2R2 MICROPHYSICAL ", & - &" SCHEME. YOU WILL ONLY HAVE VAPOR, CLOUD WATER AND RAIN ",/, & - &"LUSERV, LUSERC AND LUSERR ARE SET TO TRUE AND THE OTHERS TO FALSE ")') -! - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.FALSE.; LUSERS=.FALSE. - LUSERG=.FALSE.; LUSERH=.FALSE. - END IF - ELSE IF (CCLOUD == 'C3R5') THEN - IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. LUSERI .AND. & - LUSERS .AND. LUSERG .AND. (.NOT. LUSERH) & - ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE C3R5 MICROPHYS. SCHEME.",& - &" YOU WILL HAVE VAPOR, CLOUD WATER/ICE, RAIN, SNOW AND GRAUPEL ",/, & - &"LUSERV, LUSERC, LUSERR, LUSERI, LUSERS, LUSERG ARE SET TO TRUE")' ) -! - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.TRUE. ; LUSECI=.TRUE. - LUSERS=.TRUE. ; LUSERG=.TRUE. - LUSERH=.FALSE. - END IF - ELSE IF (CCLOUD == 'LIMA') THEN - IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. LUSERI .AND. & - LUSERS .AND. LUSERG .AND. (.NOT. LUSERH) & - ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE LIMA MICROPHYS. SCHEME.",& - &" YOU WILL HAVE VAPOR, CLOUD WATER/ICE, RAIN, SNOW AND GRAUPEL ",/, & - &"LUSERV, LUSERC, LUSERR, LUSERI, LUSERS, LUSERG ARE SET TO TRUE")' ) -! - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.TRUE. ; LUSECI=.TRUE. - LUSERS=.TRUE. ; LUSERG=.TRUE. - LUSERH=.FALSE. - END IF - END IF -! - IF (LSUBG_COND) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE BOTH THE SIMPLE MIXED PHASE' - WRITE(UNIT=ILUOUT,FMT=*) 'MICROPHYS. SCHEME AND THE SUBGRID COND. SCHEME.' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT YET AVAILABLE.' - WRITE(UNIT=ILUOUT,FMT=*) 'SET LSUBG_COND TO FALSE OR CCLOUD TO "REVE", "KESS"' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - IF ( CEFRADL /= 'C2R2') THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) ' YOU DID NOT CHOOSE CEFRADL=C2R2 FOR RADIATION' - WRITE(UNIT=ILUOUT,FMT=*) ' IT IS ADVISED TO USE CEFRADL=C2R2 ' - WRITE(UNIT=ILUOUT,FMT=*) ' WITH A 2-MOMENT MICROPHYSICAL SCHEME' - END IF -! - IF ( CCLOUD == 'C3R5' .AND. CEFRADI /= 'C3R5') THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) ' YOU DID NOT CHOOSE CEFRADI=C3R5 FOR RADIATION' - WRITE(UNIT=ILUOUT,FMT=*) ' IT IS ADVISED TO USE CEFRADI=C3R5 ' - WRITE(UNIT=ILUOUT,FMT=*) ' WITH A 2-MOMENT MICROPHYSICAL SCHEME' - END IF -! - IF ( WALPHAC /= 3.0 .OR. WNUC /= 2.0) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'IT IS ADVISED TO USE XALPHAC=3. and XNUC=2.' - WRITE(UNIT=ILUOUT,FMT=*) 'FOR STRATOCUMULUS WITH KHKO SCHEME. ' - END IF -! - IF ( CEFRADL /= 'C2R2') THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) ' YOU DID NOT CHOOSE CEFRADL=C2R2 FOR RADIATION' - WRITE(UNIT=ILUOUT,FMT=*) ' IT IS ADVISED TO USE CEFRADL=C2R2 ' - WRITE(UNIT=ILUOUT,FMT=*) ' WITH A 2-MOMENT MICROPHYSICAL SCHEME' - END IF -! - CASE ( 'LIMA') - IF (HCLOUD == 'NONE') THEN - CGETCLOUD = 'SKIP' - ELSE IF (HCLOUD == 'REVE' ) THEN - CGETCLOUD = 'INI1' - ELSE IF (HCLOUD == 'KESS' ) THEN - CGETCLOUD = 'INI2' - ELSE IF (HCLOUD == 'ICE3' ) THEN - CGETCLOUD = 'INI2' - ELSE - CGETCLOUD = 'READ' ! This is automatically done - END IF -! - IF (NMOM_C.GE.1) THEN - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.FALSE.; LUSERS=.FALSE. ; LUSERG=.FALSE.; LUSERH=.FALSE. - END IF -! - IF (NMOM_I.GE.1) THEN - LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.TRUE. ; LUSERS=.TRUE. ; LUSERG=.TRUE. - LUSERH= NMOM_H.GE.1 - END IF - ! - IF (LSPRO) LADJ=.FALSE. - IF (.NOT.LPTSPLIT) THEN - IF (NMOM_C==1) NMOM_C=2 - IF (NMOM_R==1) NMOM_R=2 - IF (NMOM_I==1) NMOM_I=2 - IF (NMOM_S==2 .OR. NMOM_G==2 .OR. NMOM_H==2) THEN - NMOM_S=2 - NMOM_G=2 - IF (NMOM_H.GE.1) NMOM_H=2 - END IF - END IF -! - IF (LSUBG_COND .AND. (.NOT. LPTSPLIT)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU MUST USE LPTSPLIT=T with CCLOUD=LIMA' - WRITE(UNIT=ILUOUT,FMT=*) 'AND LSUBG_COND ' - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','use LPTSPLIT=T with LIMA and LSUBG_COND=T') - END IF -! - IF (LSUBG_COND .AND. (.NOT. LADJ)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU MUST USE LADJ=T with CCLOUD=LIMA' - WRITE(UNIT=ILUOUT,FMT=*) 'AND LSUBG_COND ' - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','use LADJ=T with LIMA and LSUBG_COND=T') - END IF -! - IF ( LKHKO .AND. (XALPHAC /= 3.0 .OR. XNUC /= 2.0) ) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'IT IS ADVISED TO USE XALPHAC=3. and XNUC=2.' - WRITE(UNIT=ILUOUT,FMT=*) 'FOR STRATOCUMULUS. ' - END IF -! - IF ( CEFRADL /= 'LIMA') THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) ' YOU DID NOT CHOOSE CEFRADL=LIMA FOR RADIATION' - WRITE(UNIT=ILUOUT,FMT=*) ' IT IS ADVISED TO USE CEFRADL=LIMA ' - WRITE(UNIT=ILUOUT,FMT=*) ' WITH A 2-MOMENT MICROPHYSICAL SCHEME "LIMA"' - END IF -! -END SELECT -! -LUSERV_G(KMI) = LUSERV -LUSERC_G(KMI) = LUSERC -LUSERR_G(KMI) = LUSERR -LUSERI_G(KMI) = LUSERI -LUSERS_G(KMI) = LUSERS -LUSERG_G(KMI) = LUSERG -LUSERH_G(KMI) = LUSERH -LUSETKE(KMI) = (CTURB /= 'NONE') -! -!------------------------------------------------------------------------------- -! -!* 2.3 Chemical and NSV_* variables initializations -! -CALL UPDATE_NAM_IBM_PARAMN -CALL UPDATE_NAM_RECYCL_PARAMN -CALL UPDATE_NAM_PARAMN -CALL UPDATE_NAM_DYNN -CALL UPDATE_NAM_CONFN -! -IF (LORILAM .AND. .NOT. LUSECHEM) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU CANNOT USE ORILAM AEROSOL SCHEME WITHOUT ' - WRITE(ILUOUT,FMT=*) 'CHEMICAL GASEOUS CHEMISTRY ' - WRITE(ILUOUT,FMT=*) 'THEREFORE LUSECHEM IS SET TO TRUE ' - LUSECHEM=.TRUE. -END IF -! -IF (LUSECHAQ.AND.(.NOT.LUSECHEM)) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE AQUEOUS PHASE CHEMISTRY' - WRITE(UNIT=ILUOUT,FMT=*) 'BUT THE CHEMISTRY IS NOT ACTIVATED' - WRITE(UNIT=ILUOUT,FMT=*) 'SET LUSECHEM TO TRUE IF YOU WANT REALLY USE CHEMISTRY' - WRITE(UNIT=ILUOUT,FMT=*) 'OR SET LUSECHAQ TO FALSE IF YOU DO NOT WANT USE IT' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -IF (LUSECHAQ.AND.(.NOT.LUSERC).AND.CPROGRAM=='MESONH') THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE AQUEOUS PHASE CHEMISTRY' - WRITE(UNIT=ILUOUT,FMT=*) 'BUT CLOUD MICROPHYSICS IS NOT ACTIVATED' - WRITE(UNIT=ILUOUT,FMT=*) 'LUSECHAQ IS SET TO FALSE' - LUSECHAQ = .FALSE. -END IF -IF (LUSECHAQ.AND.CCLOUD(1:3) == 'ICE'.AND. .NOT. LUSECHIC) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE AQUEOUS PHASE CHEMISTRY' - WRITE(UNIT=ILUOUT,FMT=*) 'WITH MIXED PHASE CLOUD MICROPHYSICS' - WRITE(UNIT=ILUOUT,FMT=*) 'SET LUSECHIC TO TRUE IF YOU WANT TO ACTIVATE' - WRITE(UNIT=ILUOUT,FMT=*) 'ICE PHASE CHEMICAL SPECIES' - IF (LCH_RET_ICE) THEN - WRITE(UNIT=ILUOUT,FMT=*) 'LCH_RET_ICE TRUE MEANS ALL SOLUBLE' - WRITE(UNIT=ILUOUT,FMT=*) 'GASES ARE RETAINED IN ICE PHASE' - WRITE(UNIT=ILUOUT,FMT=*) 'WHEN SUPERCOOLED WATER FREEZES' - ELSE - WRITE(UNIT=ILUOUT,FMT=*) 'LCH_RET_ICE FALSE MEANS ALL SOLUBLE' - WRITE(UNIT=ILUOUT,FMT=*) 'GASES GO BACK TO THE GAS PHASE WHEN' - WRITE(UNIT=ILUOUT,FMT=*) 'SUPERCOOLED WATER FREEZES' - ENDIF -ENDIF -IF (LUSECHIC.AND. .NOT. CCLOUD(1:3) == 'ICE'.AND.CPROGRAM=='MESONH') THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE ICE PHASE CHEMISTRY' - WRITE(UNIT=ILUOUT,FMT=*) 'BUT MIXED PHASE CLOUD MICROPHYSICS IS NOT ACTIVATED' - WRITE(UNIT=ILUOUT,FMT=*) 'LUSECHIC IS SET TO FALSE' - LUSECHIC= .FALSE. -ENDIF -IF (LCH_PH.AND. (.NOT. LUSECHAQ)) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'DIAGNOSTIC PH COMPUTATION IS ACTIVATED' - WRITE(UNIT=ILUOUT,FMT=*) 'BUT AQUEOUS PHASE CHEMISTRY IS NOT ACTIVATED' - WRITE(UNIT=ILUOUT,FMT=*) 'SET LUSECHAQ TO TRUE IF YOU WANT TO ACTIVATE IT' - WRITE(UNIT=ILUOUT,FMT=*) 'LCH_PH IS SET TO FALSE' - LCH_PH= .FALSE. -ENDIF -IF (LUSECHIC.AND.(.NOT.LUSECHAQ)) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE ICE PHASE CHEMISTRY' - WRITE(UNIT=ILUOUT,FMT=*) 'BUT THE AQUEOUS PHASE CHEMISTRY IS NOT ACTIVATED' - WRITE(UNIT=ILUOUT,FMT=*) 'SET LUSECHAQ TO TRUE IF YOU WANT REALLY USE CLOUD CHEMISTRY' - WRITE(UNIT=ILUOUT,FMT=*) 'OR SET LUSECHIC TO FALSE IF YOU DO NOT WANT USE IT' -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -IF ((LUSECHIC).AND.(LCH_RET_ICE)) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE RETENTION OF SOLUBLE GASES IN ICE' - WRITE(UNIT=ILUOUT,FMT=*) 'BUT THE ICE PHASE CHEMISTRY IS ACTIVATED' - WRITE(UNIT=ILUOUT,FMT=*) 'FLAG LCH_RET_ICE IS ONLY USES WHEN LUSECHIC IS SET' - WRITE(UNIT=ILUOUT,FMT=*) 'TO FALSE IE NO CHEMICAL SPECIES IN ICE' -ENDIF -! -CALL UPDATE_NAM_CH_MNHCN -CALL INI_NSV(KMI) -! -! From this point, all NSV* variables contain valid values for model KMI -! -DO JSV = 1,NSV - LUSESV(JSV,KMI) = .TRUE. -END DO -! -IF ( CAOP=='EXPL' .AND. .NOT.LDUST .AND. .NOT.LORILAM & - .AND. .NOT.LSALT .AND. .NOT.(CCLOUD=='LIMA') ) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) ' YOU WANT TO USE EXPLICIT AEROSOL OPTICAL ' - WRITE(UNIT=ILUOUT,FMT=*) 'PROPERTIES BUT YOU DONT HAVE DUST OR ' - WRITE(UNIT=ILUOUT,FMT=*) 'AEROSOL OR SALT THEREFORE CAOP=CLIM' - CAOP='CLIM' -END IF -!------------------------------------------------------------------------------- -! -!* 3. CHECK COHERENCE BETWEEN EXSEG VARIABLES AND FMFILE ATTRIBUTES -! ------------------------------------------------------------- -! -! -!* 3.1 Turbulence variable -! -IF ((CTURB /= 'NONE').AND.(HTURB == 'NONE')) THEN - CGETTKET ='INIT' - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*)'YOU WANT TO USE TURBULENCE KINETIC ENERGY TKE' - WRITE(UNIT=ILUOUT,FMT=*)'WHEREAS IT IS NOT IN INITIAL FMFILE' - WRITE(UNIT=ILUOUT,FMT=*)'TKE WILL BE INITIALIZED TO ZERO' -ELSE - IF (CTURB /= 'NONE') THEN - CGETTKET ='READ' - IF ((CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETTKET='INIT' - ELSE - CGETTKET ='SKIP' - END IF -END IF -! -! -IF ((CTOM == 'TM06').AND.(HTOM /= 'TM06')) THEN - CGETBL_DEPTH ='INIT' - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*)'YOU WANT TO USE BL DEPTH FOR THIRD ORDER MOMENTS' - WRITE(UNIT=ILUOUT,FMT=*)'WHEREAS IT IS NOT IN INITIAL FMFILE' - WRITE(UNIT=ILUOUT,FMT=*)'IT WILL BE INITIALIZED TO ZERO' -ELSE - IF (CTOM == 'TM06') THEN - CGETBL_DEPTH ='READ' - ELSE - CGETBL_DEPTH ='SKIP' - END IF -END IF -! -IF (LRMC01 .AND. .NOT. ORMC01) THEN - CGETSBL_DEPTH ='INIT' - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*)'YOU WANT TO USE SBL DEPTH FOR RMC01' - WRITE(UNIT=ILUOUT,FMT=*)'WHEREAS IT IS NOT IN INITIAL FMFILE' - WRITE(UNIT=ILUOUT,FMT=*)'IT WILL BE INITIALIZED TO ZERO' -ELSE - IF (LRMC01) THEN - CGETSBL_DEPTH ='READ' - ELSE - CGETSBL_DEPTH ='SKIP' - END IF -END IF -! -! -!* 3.2 Moist variables -! -IF (LUSERV.AND. (.NOT.OUSERV)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE VAPOR VARIABLE Rv WHEREAS IT ", & - & "IS NOT IN INITIAL FMFILE",/, & - & "Rv WILL BE INITIALIZED TO ZERO")') - CGETRVT='INIT' -ELSE - IF (LUSERV) THEN - CGETRVT='READ' - ELSE - CGETRVT='SKIP' - END IF -END IF -! -IF (LUSERC.AND. (.NOT.OUSERC)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE CLOUD VARIABLE Rc WHEREAS IT ", & - & " IS NOT IN INITIAL FMFILE",/, & - & "Rc WILL BE INITIALIZED TO ZERO")') - CGETRCT='INIT' -ELSE - IF (LUSERC) THEN - CGETRCT='READ' -! IF(CCONF=='START') CGETRCT='INIT' - ELSE - CGETRCT='SKIP' - END IF -END IF -! -IF (LUSERR.AND. (.NOT.OUSERR)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE RAIN VARIABLE Rr WHEREAS IT ", & - & "IS NOT IN INITIAL FMFILE",/, & - & " Rr WILL BE INITIALIZED TO ZERO")') - - CGETRRT='INIT' -ELSE - IF (LUSERR) THEN - CGETRRT='READ' -! IF( (CCONF=='START').AND. CPROGRAM /= 'DIAG') CGETRRT='INIT' - ELSE - CGETRRT='SKIP' - END IF -END IF -! -IF (LUSERI.AND. (.NOT.OUSERI)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE ICE VARIABLE Ri WHEREAS IT ", & - & "IS NOT IN INITIAL FMFILE",/, & - & " Ri WILL BE INITIALIZED TO ZERO")') - CGETRIT='INIT' -ELSE - IF (LUSERI) THEN - CGETRIT='READ' -! IF(CCONF=='START') CGETRIT='INIT' - ELSE - CGETRIT='SKIP' - END IF -END IF -! -IF (LUSECI.AND. (.NOT.OUSECI)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE ICE CONC. VARIABLE Ci WHEREAS IT ",& - & "IS NOT IN INITIAL FMFILE",/, & - & " Ci WILL BE INITIALIZED TO ZERO")') - CGETCIT='INIT' -ELSE - IF (LUSECI) THEN - CGETCIT='READ' - ELSE - CGETCIT='SKIP' - END IF -END IF -! -IF (LUSERS.AND. (.NOT.OUSERS)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE SNOW VARIABLE Rs WHEREAS IT ",& - & "IS NOT IN INITIAL FMFILE",/, & - & " Rs WILL BE INITIALIZED TO ZERO")') - CGETRST='INIT' -ELSE - IF (LUSERS) THEN - CGETRST='READ' -! IF ( (CCONF=='START').AND. CPROGRAM /= 'DIAG') CGETRST='INIT' - ELSE - CGETRST='SKIP' - END IF -END IF -! -IF (LUSERG.AND. (.NOT.OUSERG)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE GRAUPEL VARIABLE Rg WHEREAS ",& - & " IT IS NOTIN INITIAL FMFILE",/, & - & "Rg WILL BE INITIALIZED TO ZERO")') - CGETRGT='INIT' -ELSE - IF (LUSERG) THEN - CGETRGT='READ' -! IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETRGT='INIT' - ELSE - CGETRGT='SKIP' - END IF -END IF -! -IF (LUSERH.AND. (.NOT.OUSERH)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE HAIL VARIABLE Rh WHEREAS",& - & "IT IS NOT IN INITIAL FMFILE",/, & - & " Rh WILL BE INITIALIZED TO ZERO")') - CGETRHT='INIT' -ELSE - IF (LUSERH) THEN - CGETRHT='READ' -! IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETRHT='INIT' - ELSE - CGETRHT='SKIP' - END IF -END IF -! -IF (LUSERC.AND. (.NOT.OUSERC)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'THE CLOUD FRACTION WILL BE INITIALIZED ACCORDING' - WRITE(UNIT=ILUOUT,FMT=*) 'TO CLOUD MIXING RATIO VALUE OR SET TO 0' - CGETCLDFR = 'INIT' -ELSE - IF ( LUSERC ) THEN - CGETCLDFR = 'READ' - IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETCLDFR='INIT' - ELSE - CGETCLDFR = 'SKIP' - END IF -END IF -! -IF (LUSERI.AND. (.NOT.OUSERI)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'THE ICE CLOUD FRACTION WILL BE INITIALIZED ACCORDING' - WRITE(UNIT=ILUOUT,FMT=*) 'TO CLOUD MIXING RATIO VALUE OR SET TO 0' - CGETICEFR = 'INIT' -ELSE - IF ( LUSERI ) THEN - CGETICEFR = 'READ' - IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETICEFR='INIT' - ELSE - CGETICEFR = 'SKIP' - END IF -END IF -! -! -!* 3.3 Moist turbulence -! -IF ( LUSERC .AND. CTURB /= 'NONE' ) THEN - IF ( .NOT. (OUSERC .AND. HTURB /= 'NONE') ) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE MOIST TURBULENCE WHEREAS IT ",/, & - & " WAS NOT THE CASE FOR THE INITIAL FMFILE GENERATION",/, & - & "SRC AND SIGS ARE INITIALIZED TO 0")') - CGETSRCT ='INIT' - CGETSIGS ='INIT' - ELSE - CGETSRCT ='READ' - IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETSRCT ='INIT' - CGETSIGS ='READ' - END IF -ELSE - CGETSRCT ='SKIP' - CGETSIGS ='SKIP' -END IF -! -IF(LCLOUDMODIFLM .AND. CTURBLEN_CLOUD/='NONE') THEN - IF (CTURB=='NONE' .OR. .NOT.LUSERC) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO COMPUTE A MIXING LENGTH FOR CLOUD=", & - & ", WHEREAS YOU DO NOT SPECIFY A TURBULENCE SCHEME OR ", & - & "USE OF RC,",/," CTURBLEN_CLOUD IS SET TO NONE")') & - CTURBLEN_CLOUD - CTURBLEN_CLOUD='NONE' - END IF - IF( XCEI_MIN > XCEI_MAX ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("PROBLEM OF CEI LIMITS FOR CLOUD MIXING ",/, & - & "LENGTH COMPUTATION: XCEI_MIN=",E9.3,", XCEI_MAX=",E9.3)')& - XCEI_MIN,XCEI_MAX - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -END IF -! -IF ( LSIGMAS ) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE SIGMA_S FROM TURBULENCE SCHEME",/, & - & " IN ICE SUBGRID CONDENSATION, SO YOUR SIGMA_S"/, & - & " MIGHT BE SMALL ABOVE PBL DEPENDING ON LENGTH SCALE")') -END IF -! -IF (LSUBG_COND .AND. CTURB=='NONE' ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID CONDENSATION' - WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT TURBULENCE ' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: LSUBG_COND is SET to FALSE' - LSUBG_COND=.FALSE. -END IF -! -IF (L1D .AND. CTURB/='NONE' .AND. CTURBDIM == '3DIM') THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE 3D TURBULENCE IN 1D CONFIGURATION ' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT POSSIBLE: CTURBDIM IS SET TO 1DIM' - CTURBDIM = '1DIM' -END IF -! -!* 3.4 Additional scalar variables -! -IF (NSV_USER == KSV_USER) THEN - DO JS = 1,KSV_USER ! to read all the variables in initial file - CGETSVT(JS)='READ' ! and to initialize them -! IF(CCONF=='START')CGETSVT(JS)='INIT' ! with these values - END DO -ELSEIF (NSV_USER > KSV_USER) THEN - IF (KSV_USER == 0) THEN - CGETSVT(1:NSV_USER)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE MORE ADDITIONAL SCALAR " ,& - &" VARIABLES THAN THERE ARE IN INITIAL FMFILE",/, & - & "THE SUPPLEMENTARY VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - DO JS = 1,KSV_USER ! to read all the variables in initial file - CGETSVT(JS)='READ' ! and to initialize them -! IF(CCONF=='START')CGETSVT(JS)='INIT' ! with these values - END DO - DO JS = KSV_USER+1, NSV_USER ! to initialize to zero supplementary - CGETSVT(JS)='INIT' ! initial file) - END DO - END IF -ELSE - WRITE(UNIT=ILUOUT,FMT=9000) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE LESS ADDITIONAL SCALAR " ,& - &" VARIABLES THAN THERE ARE IN INITIAL FMFILE")') - DO JS = 1,NSV_USER ! to read the first NSV_USER variables in initial file - CGETSVT(JS)='READ' ! and to initialize with these values -! IF(CCONF=='START') CGETSVT(JS)='INIT' - END DO - DO JS = NSV_USER + 1, KSV_USER ! to skip the last (KSV_USER-NSV_USER) variables - CGETSVT(JS)='SKIP' - END DO -END IF -! -! C2R2 and KHKO SV case -! -IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') THEN - IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' .OR. HCLOUD == 'KHKO') THEN - CGETSVT(NSV_C2R2BEG:NSV_C2R2END)='READ' -! IF(CCONF=='START') CGETSVT(NSV_C2R2BEG:NSV_C2R2END)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR C2R2 & - & (or KHKO) SCHEME IN INITIAL FMFILE",/,& - & "THE C2R2 (or KHKO) VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_C2R2BEG:NSV_C2R2END)='INIT' - END IF -END IF -! -! C3R5 SV case -! -IF (CCLOUD == 'C3R5') THEN - IF (HCLOUD == 'C3R5') THEN - CGETSVT(NSV_C1R3BEG:NSV_C1R3END)='READ' -! IF(CCONF=='START') CGETSVT(NSV_C1R3BEG:NSV_C1R3END)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR C3R5 & - &SCHEME IN INITIAL FMFILE",/,& - & "THE C1R3 VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_C1R3BEG:NSV_C1R3END)='INIT' - END IF -END IF -! -! LIMA SV case -! -IF (CCLOUD == 'LIMA') THEN - IF (HCLOUD == 'LIMA') THEN - CGETSVT(NSV_LIMA_BEG:NSV_LIMA_END)='READ' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR LIMA & - & SCHEME IN INITIAL FMFILE",/,& - & "THE LIMA VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_LIMA_BEG:NSV_LIMA_END)='INIT' - END IF -END IF -! -! Electrical SV case -! -IF (CELEC /= 'NONE') THEN - IF (HELEC /= 'NONE') THEN - CGETSVT(NSV_ELECBEG:NSV_ELECEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_ELECBEG:NSV_ELECEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR ELECTRICAL & - &SCHEME IN INITIAL FMFILE",/,& - & "THE ELECTRICAL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_ELECBEG:NSV_ELECEND)='INIT' - END IF -END IF -! -! (explicit) LINOx SV case -! -IF (CELEC /= 'NONE' .AND. LLNOX_EXPLICIT) THEN - IF (HELEC /= 'NONE' .AND. OLNOX_EXPLICIT) THEN - CGETSVT(NSV_LNOXBEG:NSV_LNOXEND)='READ' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR LINOX & - & IN INITIAL FMFILE",/,& - & "THE LINOX VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_LNOXBEG:NSV_LNOXEND)='INIT' - END IF -END IF -! -! Chemical SV case (excluding aqueous chemical species) -! -IF (LUSECHEM) THEN - IF (OUSECHEM) THEN - CGETSVT(NSV_CHGSBEG:NSV_CHGSEND)='READ' - IF(CCONF=='START' .AND. LCH_INIT_FIELD ) CGETSVT(NSV_CHGSBEG:NSV_CHGSEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR CHEMICAL & - &SCHEME IN INITIAL FMFILE",/,& - & "THE CHEMICAL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_CHGSBEG:NSV_CHGSEND)='INIT' - END IF -END IF -! add aqueous chemical species -IF (LUSECHAQ) THEN - IF (OUSECHAQ) THEN - CGETSVT(NSV_CHACBEG:NSV_CHACEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_CHACBEG:NSV_CHACEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR CHEMICAL & - &SCHEME IN AQUEOUS PHASE IN INITIAL FMFILE",/,& - & "THE AQUEOUS PHASE CHEMICAL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_CHACBEG:NSV_CHACEND)='INIT' - END IF -END IF -! add ice phase chemical species -IF (LUSECHIC) THEN - IF (OUSECHIC) THEN - CGETSVT(NSV_CHICBEG:NSV_CHICEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_CHICBEG:NSV_CHICEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR CHEMICAL & - &SPECIES IN ICE PHASE IN INITIAL FMFILE",/,& - & "THE ICE PHASE CHEMICAL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_CHICBEG:NSV_CHICEND)='INIT' - END IF -END IF -! pH values = diagnostics -IF (LCH_PH .AND. .NOT. OCH_PH) THEN - CGETPHC ='INIT' !will be initialized to XCH_PHINIT - IF (LUSERR) THEN - CGETPHR = 'INIT' !idem - ELSE - CGETPHR = 'SKIP' - ENDIF -ELSE - IF (LCH_PH) THEN - CGETPHC ='READ' - IF (LUSERR) THEN - CGETPHR = 'READ' - ELSE - CGETPHR = 'SKIP' - ENDIF - ELSE - CGETPHC ='SKIP' - CGETPHR ='SKIP' - END IF -END IF -! -! Dust case -! -IF (LDUST) THEN - IF (ODUST) THEN - CGETSVT(NSV_DSTBEG:NSV_DSTEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_DSTBEG:NSV_DSTEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR DUST & - &SCHEME IN INITIAL FMFILE",/,& - & "THE DUST VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_DSTBEG:NSV_DSTEND)='INIT' - END IF - IF (LDEPOS_DST(KMI)) THEN - - !UPG *PT - IF((CCLOUD /= 'ICE3').AND.(CCLOUD /= 'ICE4').AND.(CCLOUD /= 'KESS')& - .AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND.(CCLOUD /= 'LIMA').AND. & - (CPROGRAM/='SPAWN').AND.(CPROGRAM/='REAL')) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("ERROR: WET DEPOSITION OF DUST IS ONLY CODED FOR THE",/,& - & "MICROPHYSICAL SCHEME as ICE3, ICE4, KESS, KHKO, LIMA and C2R2")') - !UPG *PT - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF - - IF (ODEPOS_DST(KMI) ) THEN - CGETSVT(NSV_DSTDEPBEG:NSV_DSTDEPEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_DSTDEPBEG:NSV_DSTDEPEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR RAIN and CLOUD DUST & - & SCHEME IN INITIAL FMFILE",/,& - & "THE MOIST DUST VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_DSTDEPBEG:NSV_DSTDEPEND)='INIT' - END IF - END IF - - IF(NMODE_DST.GT.3 .OR. NMODE_DST.LT.1) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("DUST MODES MUST BE BETWEEN 1 and 3 ")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -END IF -! -! Sea Salt case -! -IF (LSALT) THEN - IF (OSALT) THEN - CGETSVT(NSV_SLTBEG:NSV_SLTEND)='READ' - CGETZWS='READ' -! IF(CCONF=='START') CGETSVT(NSV_SLTBEG:NSV_SLTEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR SALT & - &SCHEME IN INITIAL FMFILE",/,& - & "THE SALT VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_SLTBEG:NSV_SLTEND)='INIT' - CGETZWS='INIT' - END IF - IF (LDEPOS_SLT(KMI)) THEN - - !UPG*PT - IF((CCLOUD /= 'ICE3').AND.(CCLOUD /= 'ICE4').AND.(CCLOUD /= 'KESS')& - !.AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND. & - .AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND.(CCLOUD /= 'LIMA').AND. & - (CPROGRAM/='SPAWN').AND.(CPROGRAM/='REAL')) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("ERROR: WET DEPOSITION OF SEA SALT AEROSOLS IS ONLY CODED FOR THE",/,& - & "MICROPHYSICAL SCHEME as ICE3, ICE4, KESS, KHKO, LIMA and C2R2")') - !UPG*PT - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF - - IF (ODEPOS_SLT(KMI) ) THEN - CGETSVT(NSV_SLTDEPBEG:NSV_SLTDEPEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_SLTDEPBEG:NSV_SLTDEPEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR RAIN and CLOUD SEA SALT & - & SCHEME IN INITIAL FMFILE",/,& - & "THE MOIST SEA SALT VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_SLTDEPBEG:NSV_SLTDEPEND)='INIT' - END IF - END IF - IF(NMODE_SLT.GT.8 .OR. NMODE_SLT.LT.1) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("SALT MODES MUST BE BETWEEN 1 and 8 ")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -END IF -! -! Orilam SV case -! -IF (LORILAM) THEN - IF (OORILAM) THEN - CGETSVT(NSV_AERBEG:NSV_AEREND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_AERBEG:NSV_AEREND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR AEROSOL & - &SCHEME IN INITIAL FMFILE",/,& - & "THE AEROSOLS VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_AERBEG:NSV_AEREND)='INIT' - END IF - IF (LDEPOS_AER(KMI)) THEN - - !UPG*PT - IF((CCLOUD /= 'ICE3').AND.(CCLOUD /= 'ICE4').AND.(CCLOUD /= 'KESS')& - .AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND.(CCLOUD /= 'LIMA').AND. & - !.AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND. & - (CPROGRAM/='SPAWN').AND.(CPROGRAM/='REAL')) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("ERROR: WET DEPOSITION OF ORILAM AEROSOLS IS ONLY CODED FOR THE",/,& - & "MICROPHYSICAL SCHEME as ICE3, ICE4, KESS, KHKO, LIMA and C2R2")') - !UPG*PT - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF - - IF (ODEPOS_AER(KMI) ) THEN - CGETSVT(NSV_AERDEPBEG:NSV_AERDEPEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_AERDEPBEG:NSV_AERDEPEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR RAIN and IN CLOUD & - & AEROSOL SCHEME IN INITIAL FMFILE",/,& - & "THE MOIST AEROSOL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_AERDEPBEG:NSV_AERDEPEND)='INIT' - END IF - END IF -END IF -! -! Lagrangian variables -! -IF (LINIT_LG .AND. .NOT.(LLG)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("IT IS INCOHERENT TO HAVE LINIT_LG=.T. AND LLG=.F.",/,& - & "IF YOU WANT LAGRANGIAN TRACERS CHANGE LLG TO .T. ")') -ENDIF -IF (LLG) THEN - IF (OLG .AND. .NOT.(LINIT_LG .AND. CPROGRAM=='MESONH')) THEN - CGETSVT(NSV_LGBEG:NSV_LGEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_LGBEG:NSV_LGEND)='INIT' - ELSE - IF(.NOT.(LINIT_LG) .AND. CPROGRAM=='MESONH') THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO LAGRANGIAN VARIABLES IN INITIAL FMFILE",/,& - & "THE LAGRANGIAN VARIABLES HAVE BEEN REINITIALIZED")') - LINIT_LG=.TRUE. - ENDIF - CGETSVT(NSV_LGBEG:NSV_LGEND)='INIT' - END IF -END IF -! -! -! LINOx SV case -! -IF (.NOT.LUSECHEM .AND. LCH_CONV_LINOX) THEN - IF (.NOT.OUSECHEM .AND. OCH_CONV_LINOX) THEN - CGETSVT(NSV_LNOXBEG:NSV_LNOXEND)='READ' - ELSE - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR LINOX & - &IN INITIAL FMFILE",/,& - & "THE LINOX VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_LNOXBEG:NSV_LNOXEND)='INIT' - END IF -END IF -! -! Passive pollutant case -! -IF (LPASPOL) THEN - IF (OPASPOL) THEN - CGETSVT(NSV_PPBEG:NSV_PPEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_PPBEG:NSV_PPEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO PASSIVE SCALAR VARIABLES IN INITIAL FMFILE",/,& - & "THE VARIABLES HAVE BEEN INITIALIZED TO ZERO")') - CGETSVT(NSV_PPBEG:NSV_PPEND)='INIT' - END IF -END IF -! -#ifdef MNH_FOREFIRE -! ForeFire -! -IF (LFOREFIRE) THEN - IF (OFOREFIRE) THEN - CGETSVT(NSV_FFBEG:NSV_FFEND)='READ' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO FOREFIRE SCALAR VARIABLES IN INITIAL FMFILE",/,& - & "THE VARIABLES HAVE BEEN INITIALIZED TO ZERO")') - CGETSVT(NSV_FFBEG:NSV_FFEND)='INIT' - END IF -END IF -#endif -! Blaze smoke -! -IF (LBLAZE) THEN - IF (OFIRE) THEN - CGETSVT(NSV_FIREBEG:NSV_FIREEND)='READ' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO BLAZE SCALAR VARIABLES IN INITIAL FMFILE",/,& - & "THE VARIABLES HAVE BEEN INITIALIZED TO ZERO")') - CGETSVT(NSV_FIREBEG:NSV_FIREEND)='INIT' - END IF -END IF -! -! Conditional sampling case -! -IF (LCONDSAMP) THEN - IF (OCONDSAMP) THEN - CGETSVT(NSV_CSBEG:NSV_CSEND)='READ' -! IF(CCONF=='START') CGETSVT(NSV_CSBEG:NSV_CSEND)='INIT' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO PASSIVE SCALAR VARIABLES IN INITIAL FMFILE",/,& - & "THE VARIABLES HAVE BEEN INITIALIZED TO ZERO")') - CGETSVT(NSV_CSBEG:NSV_CSEND)='INIT' - END IF -END IF -! -! Blowing snow scheme -! -IF (LBLOWSNOW) THEN - IF (OBLOWSNOW) THEN - CGETSVT(NSV_SNWBEG:NSV_SNWEND)='READ' - ELSE - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR BLOWING SNOW & - &SCHEME IN INITIAL FMFILE",/,& - & "THE BLOWING SNOW VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') - CGETSVT(NSV_SNWBEG:NSV_SNWEND)='INIT' - END IF -END IF -! -! -! -!* 3.5 Check coherence between the radiation control parameters -! -IF( CRAD == 'ECMW' .AND. CPROGRAM=='MESONH' ) THEN - IF(CLW == 'RRTM' .AND. COPILW == 'SMSH') THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'the SMSH parametrisation of LW optical properties for cloud ice' - WRITE(UNIT=ILUOUT,FMT=*) '(COPILW) can not be used with RRTM radiation scheme' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - ENDIF - IF(CLW == 'MORC' .AND. COPWLW == 'LILI') THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'the LILI parametrisation of LW optical properties for cloud water' - WRITE(UNIT=ILUOUT,FMT=*) '(COPWLW) can not be used with MORC radiation scheme' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - ENDIF - IF( .NOT. LSUBG_COND) THEN - WRITE(UNIT=ILUOUT,FMT=9000) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU DO NOT WANT TO USE SUBGRID CONDENSATION' - WRITE(UNIT=ILUOUT,FMT=*) 'THE OVERLAP OPTION IS NOVLP=5 IN ini_radconf.f90' - ELSE IF (CLW == 'MORC') THEN - WRITE(UNIT=ILUOUT,FMT=9000) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE MORCRETTE LW SCHEME' - WRITE(UNIT=ILUOUT,FMT=*) 'THE OVERLAP OPTION IS NOVLP=5 IN ini_radconf.f90' - ELSE - WRITE(UNIT=ILUOUT,FMT=9000) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'THE OVERLAP OPTION IS NOVLP=6 IN ini_radconf.f90' - ENDIF -! - IF( LCLEAR_SKY .AND. XDTRAD_CLONLY /= XDTRAD) THEN - ! Check the validity of the LCLEAR_SKY approximation - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE BOTH THE CLEAR-SKY APPROXIMATION' - WRITE(UNIT=ILUOUT,FMT=*) '(i.e. AVERAGE THE WHOLE CLOUDFREE VERTICALS BUT KEEP' - WRITE(UNIT=ILUOUT,FMT=*) 'ALL THE CLOUDY VERTICALS) AND' - WRITE(UNIT=ILUOUT,FMT=*) 'THE CLOUD-ONLY APPROXIMATION (i.e. YOU CALL MORE OFTEN THE' - WRITE(UNIT=ILUOUT,FMT=*) 'RADIATIONS FOR THE CLOUDY VERTICALS THAN FOR CLOUDFREE ONES).' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT POSSIBLE, SO CHOOSE BETWEEN :' - WRITE(UNIT=ILUOUT,FMT=*) 'XDTRAD_CLONLY = XDTRAD and LCLEAR_SKY = FALSE' -! - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - IF( XDTRAD_CLONLY > XDTRAD ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("BAD USE OF THE CLOUD-ONLY APPROXIMATION " ,& - &" XDTRAD SHOULD BE LARGER THAN XDTRAD_CLONLY ")') -! - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - IF(( XDTRAD < XTSTEP ).OR. ( XDTRAD_CLONLY < XTSTEP )) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("THE RADIATION CALL XDTRAD OR XDTRAD_CLONLY " ,& - &" IS MORE FREQUENT THAN THE TIME STEP SO ADJUST XDTRAD OR XDTRAD_CLONLY ")') -! - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -END IF -! -IF ( CRAD /= 'NONE' .AND. CPROGRAM=='MESONH' ) THEN - CGETRAD='READ' - IF( HRAD == 'NONE' .AND. CCONF=='RESTA') THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'YOU ARE PERFORMING A RESTART. FOR THIS SEGMENT, YOU ARE USING A RADIATION' - WRITE(UNIT=ILUOUT,FMT=*) 'SCHEME AND NO RADIATION SCHEME WAS USED FOR THE PREVIOUS SEGMENT.' - CGETRAD='INIT' - END IF - IF(CCONF=='START') THEN - CGETRAD='INIT' - END IF - IF(CCONF=='RESTA' .AND. (.NOT. LAERO_FT) .AND. (.NOT. LORILAM) & - .AND. (.NOT. LSALT) .AND. (.NOT. LDUST)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT=*) '!!! WARNING !!! FOR REPRODUCTIBILITY BETWEEN START and START+RESTART,' - WRITE(UNIT=ILUOUT,FMT=*) 'YOU MUST USE LAERO_FT=T WITH CAER=TEGE IF CCONF=RESTA IN ALL SEGMENTS' - WRITE(UNIT=ILUOUT,FMT=*) 'TO UPDATE THE OZONE AND AEROSOLS CLIMATOLOGY USED BY THE RADIATION CODE;' - END IF -END IF -! -! 3.6 check the initialization of the deep convection scheme -! -IF ( (CDCONV /= 'KAFR') .AND. & - (CSCONV /= 'KAFR') .AND. LCHTRANS ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE LCHTRANS OPTION= ",& - &"CONVECTIVE TRANSPORT OF TRACERS BUT IT CAN ONLY",& - &"BE USED FOR THE KAIN FRITSCH SCHEME ")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -SELECT CASE ( CDCONV ) - CASE( 'KAFR' ) - IF (.NOT. ( LUSERV ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH DEEP CONV. ",& - &" SCHEME. YOU MUST HAVE VAPOR ",/,"LUSERV IS SET TO TRUE ")') - LUSERV=.TRUE. - ELSE IF (.NOT. ( LUSERI ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH",& - &" DEEP CONV. SCHEME. BUT THE DETRAINED CLOUD ICE WILL BE ADDED TO ",& - &" THE CLOUD WATER ")') - ELSE IF (.NOT. ( LUSERI.AND.LUSERC ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH",& - &" DEEP CONV. SCHEME. BUT THE DETRAINED CLOUD WATER AND CLOUD ICE ",& - &" WILL BE ADDED TO THE WATER VAPOR FIELD ")') - END IF - IF ( LCHTRANS .AND. NSV == 0 ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE LCHTRANS OPTION= ",& - &"CONVECTIVE TRANSPORT OF TRACERS BUT YOUR TRACER ",& - &"NUMBER NSV IS ZERO ",/,"LCHTRANS IS SET TO FALSE")') - LCHTRANS=.FALSE. - END IF -END SELECT -! -IF ( CDCONV == 'KAFR' .AND. LCHTRANS .AND. NSV > 0 ) THEN - IF( OCHTRANS ) THEN - CGETSVCONV='READ' - ELSE - CGETSVCONV='INIT' - END IF -END IF -! -SELECT CASE ( CSCONV ) - CASE( 'KAFR' ) - IF (.NOT. ( LUSERV ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH SHALLOW CONV. ",& - &" SCHEME. YOU MUST HAVE VAPOR ",/,"LUSERV IS SET TO TRUE ")') - LUSERV=.TRUE. - ELSE IF (.NOT. ( LUSERI ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH",& - &" SHALLOW CONV. SCHEME. BUT THE DETRAINED CLOUD ICE WILL BE ADDED TO ",& - &" THE CLOUD WATER ")') - ELSE IF (.NOT. ( LUSERI.AND.LUSERC ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH",& - &" SHALLOW CONV. SCHEME. BUT THE DETRAINED CLOUD WATER AND CLOUD ICE ",& - &" WILL BE ADDED TO THE WATER VAPOR FIELD ")') - END IF - IF ( LCHTRANS .AND. NSV == 0 ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE LCHTRANS OPTION= ",& - &"CONVECTIVE TRANSPORT OF TRACERS BUT YOUR TRACER ",& - &"NUMBER NSV IS ZERO ",/,"LCHTRANS IS SET TO FALSE")') - LCHTRANS=.FALSE. - END IF - CASE( 'EDKF' ) - IF (CTURB == 'NONE' ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE EDKF ", & - &"SHALLOW CONVECTION WITHOUT TURBULENCE SCHEME : ", & - &"IT IS NOT POSSIBLE")') -! - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -END SELECT -! -! -CGETCONV = 'SKIP' -! -IF ( (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR' ) .AND. CPROGRAM=='MESONH') THEN - CGETCONV = 'READ' - IF( HDCONV == 'NONE' .AND. CCONF=='RESTA') THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(UNIT=ILUOUT,FMT='(" YOU ARE PERFORMING A RESTART. FOR THIS ",& - &" SEGMENT, YOU ARE USING A DEEP CONVECTION SCHEME AND NO DEEP ",& - &" CONVECTION SCHEME WAS USED FOR THE PREVIOUS SEGMENT. ")') -! - CGETCONV = 'INIT' - END IF - IF(CCONF=='START') THEN - CGETCONV = 'INIT' - END IF -END IF -! -!* 3.7 configuration and model version -! -IF (KMI == 1) THEN -! - IF (L1D.AND.(CLBCX(1)/='CYCL'.AND.CLBCX(2)/='CYCL' & - .AND.CLBCY(1)/='CYCL'.AND.CLBCY(2)/='CYCL')) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A 1D MODEL VERSION WITH NON-CYCL",& - & "CLBCX OR CLBCY VALUES")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF - IF (L2D.AND.(CLBCY(1)/='CYCL'.AND.CLBCY(2)/='CYCL')) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A 2D MODEL VERSION WITH NON-CYCL",& - & " CLBCY VALUES")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF - ! - IF ( (.NOT. LCARTESIAN) .AND. ( LCORIO) .AND. (.NOT. LGEOST_UV_FRC) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("BE CAREFUL YOU COULD HAVE SPURIOUS MOTIONS " ,& - & " NEAR THE LBC AS LCORIO=T and LGEOST_UV_FRC=F")') - END IF - ! - IF ((.NOT.LFLAT).AND.OFLAT) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT=*) 'ZERO OROGRAPHY IN INITIAL FILE' - WRITE(UNIT=ILUOUT,FMT=*) '***** ALL TERMS HAVE BEEN NEVERTHELESS COMPUTED WITHOUT SIMPLIFICATION*****' - WRITE(UNIT=ILUOUT,FMT=*) 'THIS SHOULD LEAD TO ERRORS IN THE PRESSURE COMPUTATION' - END IF - IF (LFLAT.AND.(.NOT.OFLAT)) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='(" OROGRAPHY IS NOT EQUAL TO ZERO ", & - & "IN INITIAL FILE" ,/, & - & "******* OROGRAPHY HAS BEEN SET TO ZERO *********",/, & - & "ACCORDING TO ZERO OROGRAPHY, SIMPLIFICATIONS HAVE ", & - & "BEEN MADE IN COMPUTATIONS")') - END IF -END IF -! -!* 3.8 System of equations -! -IF ( HEQNSYS /= CEQNSYS ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU HAVE CHANGED THE SYSTEM OF EQUATIONS' - WRITE(ILUOUT,FMT=*) 'THE ANELASTIC CONSTRAINT IS PERHAPS CHANGED :' - WRITE(ILUOUT,FMT=*) 'FOR THE INITIAL FILE YOU HAVE USED ',HEQNSYS - WRITE(ILUOUT,FMT=*) 'FOR THE RUN YOU PLAN TO USE ',CEQNSYS - WRITE(ILUOUT,FMT=*) 'THIS CAN LEAD TO A NUMERICAL EXPLOSION IN THE FIRST TIME STEPS' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -! 3.9 Numerical schemes -! -IF ( (CUVW_ADV_SCHEME == 'CEN4TH') .AND. & - (CTEMP_SCHEME /= 'LEFR') .AND. (CTEMP_SCHEME /= 'RKC4') ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("CEN4TH SCHEME HAS TO BE USED WITH ",& - &"CTEMP_SCHEME = LEFR of RKC4 ONLY")') - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -IF ( (CUVW_ADV_SCHEME == 'WENO_K') .AND. LNUMDIFU ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE NUMERICAL DIFFUSION ",& - &"WITH WENO SCHEME ALREADY DIFFUSIVE")') -END IF -!------------------------------------------------------------------------------- -! -!* 4. CHECK COHERENCE BETWEEN EXSEG VARIABLES -! --------------------------------------- -! -!* 4.1 coherence between coupling variables in EXSEG file -! -IF (KMI == 1) THEN - NCPL_NBR = 0 - DO JCI = 1,JPCPLFILEMAX - IF (LEN_TRIM(CCPLFILE(JCI)) /= 0) THEN ! Finds the number - NCPL_NBR = NCPL_NBR + 1 ! of coupling files - ENDIF - IF (JCI/=JPCPLFILEMAX) THEN ! Deplaces the coupling files - IF ((LEN_TRIM(CCPLFILE(JCI)) == 0) .AND. &! names if one missing - (LEN_TRIM(CCPLFILE(JCI+1)) /= 0)) THEN - DO JI=JCI,JPCPLFILEMAX-1 - CCPLFILE(JI)=CCPLFILE(JI+1) - END DO - CCPLFILE(JPCPLFILEMAX)=' ' - END IF - END IF - END DO -! - IF (NCPL_NBR /= 0) THEN - LSTEADYLS = .FALSE. - ELSE - LSTEADYLS = .TRUE. - ENDIF -END IF -! -!* 4.3 check consistency in forcing switches -! -IF ( LFORCING ) THEN - IF ( LRELAX_THRV_FRC .AND. ( LTEND_THRV_FRC .OR. LGEOST_TH_FRC ) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU CHOSE A TEMPERATURE AND HUMIDITY RELAXATION' - WRITE(ILUOUT,FMT=*) 'TOGETHER WITH TENDENCY OR GEOSTROPHIC FORCING' - WRITE(ILUOUT,FMT=*) & - 'YOU MIGHT CHECK YOUR SWITCHES: LRELAX_THRV_FRC, LTEND_THRV_FRC, AND' - WRITE(ILUOUT,FMT=*) 'LGEOST_TH_FRC' - END IF -! - IF ( LRELAX_UV_FRC .AND. LRELAX_UVMEAN_FRC) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU MUST CHOOSE BETWEEN A RELAXATION APPLIED TO' - WRITE(ILUOUT,FMT=*) 'THE 3D FULL WIND FIELD (LRELAX_UV_FRC) OR' - WRITE(ILUOUT,FMT=*) 'THE HORIZONTAL MEAN WIND (LRELAX_UVMEAN_FRC)' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - IF ( (LRELAX_UV_FRC .OR. LRELAX_UVMEAN_FRC) .AND. LGEOST_UV_FRC ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU MUST NOT USE A WIND RELAXATION' - WRITE(ILUOUT,FMT=*) 'TOGETHER WITH A GEOSTROPHIC FORCING' - WRITE(ILUOUT,FMT=*) 'CHECK SWITCHES: LRELAX_UV_FRC, LRELAX_UVMEAN_FRC, LGEOST_UV_FRC' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - IF ( CRELAX_HEIGHT_TYPE.NE."FIXE" .AND. CRELAX_HEIGHT_TYPE.NE."THGR" ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'CRELAX_HEIGHT_TYPE MUST BE EITHER "FIXE" OR "THGR"' - WRITE(ILUOUT,FMT=*) 'BUT IT IS "', CRELAX_HEIGHT_TYPE, '"' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - IF ( .NOT.LCORIO .AND. LGEOST_UV_FRC ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU CANNOT HAVE A GEOSTROPHIC FORCING WITHOUT' - WRITE(ILUOUT,FMT=*) 'ACTIVATING LCORIOLIS OPTION' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! - IF ( LPGROUND_FRC ) THEN - WRITE(ILUOUT,FMT=*) 'SURFACE PRESSURE FORCING NOT YET IMPLEMENTED' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -! -END IF -! -IF (LTRANS .AND. .NOT. LFLAT ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU ASK FOR A CONSTANT SPEED DOMAIN TRANSLATION ' - WRITE(ILUOUT,FMT=*) 'BUT NOT IN THE FLAT TERRAIN CASE:' - WRITE(ILUOUT,FMT=*) 'THIS IS NOT ALLOWED ACTUALLY' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -!* 4.4 Check the coherence between the LUSERn and LHORELAX -! -IF (.NOT. LUSERV .AND. LHORELAX_RV) THEN - LHORELAX_RV=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RV FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RV=FALSE' -END IF -! -IF (.NOT. LUSERC .AND. LHORELAX_RC) THEN - LHORELAX_RC=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RC FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RC=FALSE' -END IF -! -IF (.NOT. LUSERR .AND. LHORELAX_RR) THEN - LHORELAX_RR=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RR FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RR=FALSE' -END IF -! -IF (.NOT. LUSERI .AND. LHORELAX_RI) THEN - LHORELAX_RI=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RI FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RI=FALSE' -END IF -! -IF (.NOT. LUSERS .AND. LHORELAX_RS) THEN - LHORELAX_RS=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RS FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RS=FALSE' -END IF -! -IF (.NOT. LUSERG .AND. LHORELAX_RG) THEN - LHORELAX_RG=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RG FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RG=FALSE' -END IF -! -IF (.NOT. LUSERH .AND. LHORELAX_RH) THEN - LHORELAX_RH=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RH FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RH=FALSE' -END IF -! -IF (CTURB=='NONE' .AND. LHORELAX_TKE) THEN - LHORELAX_TKE=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX TKE FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_TKE=FALSE' -END IF -! -! -IF (CCLOUD/='C2R2' .AND. CCLOUD/='KHKO' .AND. LHORELAX_SVC2R2) THEN - LHORELAX_SVC2R2=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX C2R2 or KHKO FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVC2R2=FALSE' -END IF -! -IF (CCLOUD/='C3R5' .AND. LHORELAX_SVC1R3) THEN - LHORELAX_SVC1R3=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX C3R5 FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVC1R3=FALSE' -END IF -! -IF (CCLOUD/='LIMA' .AND. LHORELAX_SVLIMA) THEN - LHORELAX_SVLIMA=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX LIMA FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVLIMA=FALSE' -END IF -! -IF (CELEC(1:3) /= 'ELE' .AND. LHORELAX_SVELEC) THEN - LHORELAX_SVELEC=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX ELEC FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVELEC=FALSE' -END IF -! -IF (.NOT. LUSECHEM .AND. LHORELAX_SVCHEM) THEN - LHORELAX_SVCHEM=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX CHEM FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVCHEM=FALSE' -END IF -! -IF (.NOT. LUSECHIC .AND. LHORELAX_SVCHIC) THEN - LHORELAX_SVCHIC=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX ICE CHEM FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVCHIC=FALSE' -END IF -! -IF (.NOT. LORILAM .AND. LHORELAX_SVAER) THEN - LHORELAX_SVAER=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX AEROSOL FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVAER=FALSE' -END IF - -IF (.NOT. LDUST .AND. LHORELAX_SVDST) THEN - LHORELAX_SVDST=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX DUST FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVDST=FALSE' -END IF - -IF (.NOT. LSALT .AND. LHORELAX_SVSLT) THEN - LHORELAX_SVSLT=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX SEA SALT FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVSLT=FALSE' -END IF - -IF (.NOT. LPASPOL .AND. LHORELAX_SVPP) THEN - LHORELAX_SVPP=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX PASSIVE POLLUTANT FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVPP=FALSE' -END IF -#ifdef MNH_FOREFIRE -IF (.NOT. LFOREFIRE .AND. LHORELAX_SVFF) THEN - LHORELAX_SVFF=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX FOREFIRE FLUXES BUT THEY DO NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVFF=FALSE' -END IF -#endif -IF (.NOT. LBLAZE .AND. LHORELAX_SVFIRE) THEN - LHORELAX_SVFIRE=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX BLAZE FLUXES BUT THEY DO NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVFIRE=FALSE' -END IF -IF (.NOT. LCONDSAMP .AND. LHORELAX_SVCS) THEN - LHORELAX_SVCS=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX CONDITIONAL SAMPLING FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVCS=FALSE' -END IF - -IF (.NOT. LBLOWSNOW .AND. LHORELAX_SVSNW) THEN - LHORELAX_SVSNW=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX BLOWING SNOW FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVSNW=FALSE' -END IF - -IF (ANY(LHORELAX_SV(NSV+1:))) THEN - LHORELAX_SV(NSV+1:)=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX SV(NSV+1:) FIELD BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SV(NSV+1:)=FALSE' -END IF -! -!* 4.5 check the number of points for the horizontal relaxation -! -IF ( NRIMX > KRIMX .AND. .NOT.LHORELAX_SVELEC ) THEN - NRIMX = KRIMX - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE A LARGER NUMBER OF POINTS ' - WRITE(ILUOUT,FMT=*) 'FOR THE HORIZONTAL RELAXATION THAN THE ' - WRITE(ILUOUT,FMT=*) 'CORRESPONDING NUMBER OF LARGE SCALE FIELDS:' - WRITE(ILUOUT,FMT=*) 'IT IS THEREFORE REDUCED TO NRIMX =',NRIMX -END IF -! -IF ( L2D .AND. KRIMY>0 ) THEN - NRIMY = 0 - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE A 2D MODEL THEREFORE NRIMY=0 ' -END IF -! -IF ( NRIMY > KRIMY .AND. .NOT.LHORELAX_SVELEC ) THEN - NRIMY = KRIMY - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE A LARGER NUMBER OF POINTS ' - WRITE(ILUOUT,FMT=*) 'FOR THE HORIZONTAL RELAXATION THAN THE ' - WRITE(ILUOUT,FMT=*) 'CORRESPONDING NUMBER OF LARGE SCALE FIELDS:' - WRITE(ILUOUT,FMT=*) 'IT IS THEREFORE REDUCED TO NRIMY =',NRIMY -END IF -! -IF ( (.NOT. LHORELAX_UVWTH) .AND. (.NOT.(ANY(LHORELAX_SV))) .AND. & - (.NOT. LHORELAX_SVC2R2).AND. (.NOT. LHORELAX_SVC1R3) .AND. & - (.NOT. LHORELAX_SVLIMA).AND. & - (.NOT. LHORELAX_SVELEC).AND. (.NOT. LHORELAX_SVCHEM) .AND. & - (.NOT. LHORELAX_SVLG) .AND. (.NOT. LHORELAX_SVPP) .AND. & - (.NOT. LHORELAX_SVCS) .AND. (.NOT. LHORELAX_SVFIRE) .AND. & -#ifdef MNH_FOREFIRE - (.NOT. LHORELAX_SVFF) .AND. & -#endif - (.NOT. LHORELAX_RV) .AND. (.NOT. LHORELAX_RC) .AND. & - (.NOT. LHORELAX_RR) .AND. (.NOT. LHORELAX_RI) .AND. & - (.NOT. LHORELAX_RS) .AND. (.NOT. LHORELAX_RG) .AND. & - (.NOT. LHORELAX_RH) .AND. (.NOT. LHORELAX_TKE) .AND. & - (.NOT. LHORELAX_SVCHIC).AND. & - (NRIMX /= 0 .OR. NRIMY /= 0)) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU DO NOT WANT TO USE THE HORIZONTAL RELAXATION ' - WRITE(ILUOUT,FMT=*) 'THEREFORE NRIMX=NRIMY=0 ' - NRIMX=0 - NRIMY=0 -END IF -! -IF ((LHORELAX_UVWTH .OR. LHORELAX_SVPP .OR. & - LHORELAX_SVCS .OR. LHORELAX_SVFIRE .OR. & -#ifdef MNH_FOREFIRE - LHORELAX_SVFF .OR. & -#endif - LHORELAX_SVC2R2 .OR. LHORELAX_SVC1R3 .OR. & - LHORELAX_SVLIMA .OR. & - LHORELAX_SVELEC .OR. LHORELAX_SVCHEM .OR. & - LHORELAX_SVLG .OR. ANY(LHORELAX_SV) .OR. & - LHORELAX_RV .OR. LHORELAX_RC .OR. & - LHORELAX_RR .OR. LHORELAX_RI .OR. & - LHORELAX_RG .OR. LHORELAX_RS .OR. & - LHORELAX_RH .OR. LHORELAX_TKE.OR. & - LHORELAX_SVCHIC ) & - .AND. (NRIMX==0 .OR. (NRIMY==0 .AND. .NOT.(L2D) ))) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE THE HORIZONTAL RELAXATION ' - WRITE(ILUOUT,FMT=*) 'BUT NRIMX OR NRIMY=0 CHANGE YOUR VALUES ' - WRITE(ILUOUT,FMT=*) "LHORELAX_UVWTH=",LHORELAX_UVWTH - WRITE(ILUOUT,FMT=*) "LHORELAX_SVC2R2=",LHORELAX_SVC2R2 - WRITE(ILUOUT,FMT=*) "LHORELAX_SVC1R3=",LHORELAX_SVC1R3 - WRITE(ILUOUT,FMT=*) "LHORELAX_SVLIMA=",LHORELAX_SVLIMA - WRITE(ILUOUT,FMT=*) "LHORELAX_SVELEC=",LHORELAX_SVELEC - WRITE(ILUOUT,FMT=*) "LHORELAX_SVCHEM=",LHORELAX_SVCHEM - WRITE(ILUOUT,FMT=*) "LHORELAX_SVCHIC=",LHORELAX_SVCHIC - WRITE(ILUOUT,FMT=*) "LHORELAX_SVLG=",LHORELAX_SVLG - WRITE(ILUOUT,FMT=*) "LHORELAX_SVPP=",LHORELAX_SVPP - WRITE(ILUOUT,FMT=*) "LHORELAX_SVFIRE=",LHORELAX_SVFIRE -#ifdef MNH_FOREFIRE - WRITE(ILUOUT,FMT=*) "LHORELAX_SVFF=",LHORELAX_SVFF -#endif - WRITE(ILUOUT,FMT=*) "LHORELAX_SVCS=",LHORELAX_SVCS - WRITE(ILUOUT,FMT=*) "LHORELAX_SV=",LHORELAX_SV - WRITE(ILUOUT,FMT=*) "LHORELAX_RV=",LHORELAX_RV - WRITE(ILUOUT,FMT=*) "LHORELAX_RC=",LHORELAX_RC - WRITE(ILUOUT,FMT=*) "LHORELAX_RR=",LHORELAX_RR - WRITE(ILUOUT,FMT=*) "LHORELAX_RI=",LHORELAX_RI - WRITE(ILUOUT,FMT=*) "LHORELAX_RG=",LHORELAX_RG - WRITE(ILUOUT,FMT=*) "LHORELAX_RS=",LHORELAX_RS - WRITE(ILUOUT,FMT=*) "LHORELAX_RH=",LHORELAX_RH - WRITE(ILUOUT,FMT=*) "LHORELAX_TKE=", LHORELAX_TKE - WRITE(ILUOUT,FMT=*) "NRIMX=",NRIMX - WRITE(ILUOUT,FMT=*) "NRIMY=",NRIMY - WRITE(ILUOUT,FMT=*) "L2D=",L2D - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -IF ((LHORELAX_UVWTH .OR. LHORELAX_SVPP .OR. & - LHORELAX_SVCS .OR. LHORELAX_SVFIRE .OR. & -#ifdef MNH_FOREFIRE - LHORELAX_SVFF .OR. & -#endif - LHORELAX_SVC2R2 .OR. LHORELAX_SVC1R3 .OR. & - LHORELAX_SVLIMA .OR. & - LHORELAX_SVELEC .OR. LHORELAX_SVCHEM .OR. & - LHORELAX_SVLG .OR. ANY(LHORELAX_SV) .OR. & - LHORELAX_RV .OR. LHORELAX_RC .OR. & - LHORELAX_RR .OR. LHORELAX_RI .OR. & - LHORELAX_RG .OR. LHORELAX_RS .OR. & - LHORELAX_RH .OR. LHORELAX_TKE.OR. & - LHORELAX_SVCHIC ) & - .AND. (KMI /=1)) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE THE HORIZONTAL RELAXATION ' - WRITE(ILUOUT,FMT=*) 'FOR A NESTED MODEL BUT THE COUPLING IS ALREADY DONE' - WRITE(ILUOUT,FMT=*) 'BY THE GRID NESTING. CHANGE LHORELAX TO FALSE' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -IF ((LHORELAX_UVWTH .OR. LHORELAX_SVPP .OR. & - LHORELAX_SVCS .OR. LHORELAX_SVFIRE .OR. & -#ifdef MNH_FOREFIRE - LHORELAX_SVFF .OR. & -#endif - LHORELAX_SVC2R2 .OR. LHORELAX_SVC1R3 .OR. & - LHORELAX_SVLIMA .OR. & - LHORELAX_SVELEC .OR. LHORELAX_SVCHEM .OR. & - LHORELAX_SVLG .OR. ANY(LHORELAX_SV) .OR. & - LHORELAX_RV .OR. LHORELAX_RC .OR. & - LHORELAX_RR .OR. LHORELAX_RI .OR. & - LHORELAX_RG .OR. LHORELAX_RS .OR. & - LHORELAX_RH .OR. LHORELAX_TKE.OR. & - LHORELAX_SVCHIC ) & - .AND. (CLBCX(1)=='CYCL'.OR.CLBCX(2)=='CYCL' & - .OR.CLBCY(1)=='CYCL'.OR.CLBCY(2)=='CYCL')) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE THE HORIZONTAL RELAXATION ' - WRITE(ILUOUT,FMT=*) 'FOR CYCLIC CLBCX OR CLBCY VALUES' - WRITE(ILUOUT,FMT=*) 'CHANGE LHORELAX TO FALSE' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -IF (KMI==1) THEN - GRELAX = .NOT.(OUSERV) .AND. LUSERV .AND. LHORELAX_RV -ELSE - GRELAX = .NOT.(LUSERV_G(NDAD(KMI))) .AND. LUSERV_G(KMI).AND. LHORELAX_RV -END IF -! -IF ( GRELAX ) THEN - LHORELAX_RV=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RV FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RV=FALSE' -END IF -! -IF (KMI==1) THEN - GRELAX = .NOT.(OUSERC) .AND. LUSERC .AND. LHORELAX_RC -ELSE - GRELAX = .NOT.(LUSERC_G(NDAD(KMI))) .AND. LUSERC_G(KMI).AND. LHORELAX_RC -END IF -! -IF ( GRELAX ) THEN - LHORELAX_RC=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RC FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RC=FALSE' -END IF -! -IF (KMI==1) THEN - GRELAX = .NOT.(OUSERR) .AND. LUSERR .AND. LHORELAX_RR -ELSE - GRELAX = .NOT.(LUSERR_G(NDAD(KMI))) .AND. LUSERR_G(KMI).AND. LHORELAX_RR -END IF -! -IF ( GRELAX ) THEN - LHORELAX_RR=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RR FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RR=FALSE' -END IF -! -IF (KMI==1) THEN - GRELAX = .NOT.(OUSERI) .AND. LUSERI .AND. LHORELAX_RI -ELSE - GRELAX = .NOT.(LUSERI_G(NDAD(KMI))) .AND. LUSERI_G(KMI).AND. LHORELAX_RI -END IF -! -IF ( GRELAX ) THEN - LHORELAX_RI=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RI FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RI=FALSE' -END IF -! -IF (KMI==1) THEN - GRELAX = .NOT.(OUSERG) .AND. LUSERG .AND. LHORELAX_RG -ELSE - GRELAX = .NOT.(LUSERG_G(NDAD(KMI))) .AND. LUSERG_G(KMI).AND. LHORELAX_RG -END IF -! -IF ( GRELAX ) THEN - LHORELAX_RG=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RG FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RG=FALSE' -END IF -! -IF (KMI==1) THEN - GRELAX = .NOT.(OUSERH) .AND. LUSERH .AND. LHORELAX_RH -ELSE - GRELAX = .NOT.(LUSERH_G(NDAD(KMI))) .AND. LUSERH_G(KMI).AND. LHORELAX_RH -END IF -! -IF ( GRELAX ) THEN - LHORELAX_RH=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RH FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RH=FALSE' -END IF -! -IF (KMI==1) THEN - GRELAX = .NOT.(OUSERS) .AND. LUSERS .AND. LHORELAX_RS -ELSE - GRELAX = .NOT.(LUSERS_G(NDAD(KMI))) .AND. LUSERS_G(KMI).AND. LHORELAX_RS -END IF -! -IF ( GRELAX ) THEN - LHORELAX_RS=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RS FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RS=FALSE' -END IF -! -IF (KMI==1) THEN - GRELAX = HTURB=='NONE' .AND. LUSETKE(1).AND. LHORELAX_TKE -ELSE - GRELAX = .NOT.(LUSETKE(NDAD(KMI))) .AND. LUSETKE(KMI) .AND. LHORELAX_TKE -END IF -! -IF ( GRELAX ) THEN - LHORELAX_TKE=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE TKE FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_TKE=FALSE' -END IF -! -! -DO JSV = 1,NSV_USER -! - IF (KMI==1) THEN - GRELAX = KSV_USER<JSV .AND. LUSESV(JSV,1).AND. LHORELAX_SV(JSV) - ELSE - GRELAX = .NOT.(LUSESV(JSV,NDAD(KMI))) .AND. LUSESV(JSV,KMI) .AND. LHORELAX_SV(JSV) - END IF - ! - IF ( GRELAX ) THEN - LHORELAX_SV(JSV)=.FALSE. - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE ',JSV,' SV FIELD' - WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI) - WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.' - WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SV(',JSV,')=FALSE' - END IF -END DO -! -!* 4.6 consistency in LES diagnostics choices -! -IF (CLES_NORM_TYPE=='EKMA' .AND. .NOT. LCORIO) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE THE EKMAN NORMALIZATION' - WRITE(ILUOUT,FMT=*) 'BUT CORIOLIS FORCE IS NOT USED (LCORIO=.FALSE.)' - WRITE(ILUOUT,FMT=*) 'THEN, NO NORMALIZATION IS PERFORMED' - CLES_NORM_TYPE='NONE' -END IF -! -!* 4.7 Check the coherence with LNUMDIFF -! -IF (L1D .AND. (LNUMDIFU .OR. LNUMDIFTH .OR. LNUMDIFSV) ) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE HORIZONTAL DIFFUSION ' - WRITE(ILUOUT,FMT=*) 'BUT YOU ARE IN A COLUMN MODEL (L1D=.TRUE.).' - WRITE(ILUOUT,FMT=*) 'THEREFORE LNUMDIFU and LNUMDIFTH and LNUMDIFSV' - WRITE(ILUOUT,FMT=*) 'ARE SET TO FALSE' - LNUMDIFU=.FALSE. - LNUMDIFTH=.FALSE. - LNUMDIFSV=.FALSE. -END IF -! -IF (.NOT. LNUMDIFTH .AND. LZDIFFU) THEN - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(ILUOUT,FMT=*) 'YOU DO NOT WANT TO USE HORIZONTAL DIFFUSION (LNUMDIFTH=F)' - WRITE(ILUOUT,FMT=*) 'BUT YOU WANT TO USE Z-NUMERICAL DIFFUSION ' - WRITE(ILUOUT,FMT=*) 'THEREFORE LNUMDIFTH IS SET TO TRUE' - LNUMDIFTH=.TRUE. -END IF -! -!* 4.8 Other -! -IF (XTNUDGING < 4.*XTSTEP) THEN - XTNUDGING = 4.*XTSTEP - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("TIME SCALE FOR NUDGING CAN NOT BE SMALLER THAN", & - & " FOUR TIMES THE TIME STEP")') - WRITE(ILUOUT,FMT=*) 'XTNUDGING is SET TO ',XTNUDGING -END IF -! -! -IF (XWAY(KMI) == 3. ) THEN - XWAY(KMI) = 2. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("XWAY=3 DOES NOT EXIST ANYMORE; ", & - & " IT IS REPLACED BY XWAY=2 ")') -END IF -! -IF ( (KMI == 1) .AND. XWAY(KMI) /= 0. ) THEN - XWAY(KMI) = 0. - WRITE(UNIT=ILUOUT,FMT=9002) KMI - WRITE(UNIT=ILUOUT,FMT='("XWAY MUST BE EQUAL TO 0 FOR DAD MODEL")') -END IF -! -!JUANZ ZRESI solver need BSPLITTING -IF ( CPRESOPT == 'ZRESI' .AND. CSPLIT /= 'BSPLITTING' ) THEN - WRITE(UNIT=ILUOUT,FMT=9003) KMI - WRITE(UNIT=ILUOUT,FMT='("Paralleliez in Z solver CPRESOPT=ZRESI need also CSPLIT=BSPLITTING ")') - WRITE(ILUOUT,FMT=*) ' ERROR you have to set also CSPLIT=BSPLITTING ' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') -END IF -! -IF ( LEN_TRIM(HINIFILEPGD)>0 ) THEN - IF ( CINIFILEPGD/=HINIFILEPGD ) THEN - WRITE(UNIT=ILUOUT,FMT=9001) KMI - WRITE(ILUOUT,FMT=*) ' ERROR : in EXSEG1.nam, in NAM_LUNITn you have CINIFILEPGD= ',CINIFILEPGD - WRITE(ILUOUT,FMT=*) ' whereas in .des you have CINIFILEPGD= ',HINIFILEPGD - WRITE(ILUOUT,FMT=*) ' Please check your Namelist ' - WRITE(ILUOUT,FMT=*) ' For example, you may have specified the un-nested PGD file instead of the nested PGD file ' - WRITE(ILUOUT,FMT=*) - WRITE(ILUOUT,FMT=*) '###############' - WRITE(ILUOUT,FMT=*) ' MESONH ABORTS' - WRITE(ILUOUT,FMT=*) '###############' - WRITE(ILUOUT,FMT=*) - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') - END IF -ELSE - CINIFILEPGD = '' -!* note that after a spawning, there is no value for CINIFILEPGD in the .des file, -! so the checking cannot be made if the user starts a simulation directly from -! a spawned file (without the prep_real_case stage) -END IF -!------------------------------------------------------------------------------- -! -!* 5. WE DO NOT FORGET TO UPDATE ALL DOLLARN NAMELIST VARIABLES -! --------------------------------------------------------- -! -CALL UPDATE_NAM_LUNITN -CALL UPDATE_NAM_CONFN -CALL UPDATE_NAM_DRAGTREEN -CALL UPDATE_NAM_DRAGBLDGN -CALL UPDATE_NAM_COUPLING_LEVELSN -CALL UPDATE_NAM_DYNN -CALL UPDATE_NAM_ADVN -CALL UPDATE_NAM_PARAMN -CALL UPDATE_NAM_PARAM_RADN -#ifdef MNH_ECRAD -CALL UPDATE_NAM_PARAM_ECRADN -#endif -CALL UPDATE_NAM_PARAM_KAFRN -CALL UPDATE_NAM_LBCN -CALL UPDATE_NAM_NUDGINGN -CALL UPDATE_NAM_BLANKN -CALL UPDATE_NAM_CH_MNHCN -CALL UPDATE_NAM_CH_SOLVERN -CALL UPDATE_NAM_SERIESN -CALL UPDATE_NAM_BLOWSNOWN -CALL UPDATE_NAM_PROFILERn -CALL UPDATE_NAM_STATIONn -CALL UPDATE_NAM_FIREn -!------------------------------------------------------------------------------- -WRITE(UNIT=ILUOUT,FMT='(/)') -!------------------------------------------------------------------------------- -! -!* 6. FORMATS -! ------- -! -9000 FORMAT(/,'NOTE IN READ_EXSEG FOR MODEL ', I2, ' : ',/, & - '--------------------------------') -9001 FORMAT(/,'CAUTION ERROR IN READ_EXSEG FOR MODEL ', I2,' : ',/, & - '----------------------------------------' ) -9002 FORMAT(/,'WARNING IN READ_EXSEG FOR MODEL ', I2,' : ',/, & - '----------------------------------' ) -9003 FORMAT(/,'FATAL ERROR IN READ_EXSEG FOR MODEL ', I2,' : ',/, & - '--------------------------------------' ) -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE READ_EXSEG_n diff --git a/src/PHYEX/ext/read_field.f90 b/src/PHYEX/ext/read_field.f90 deleted file mode 100644 index d86c67557..000000000 --- a/src/PHYEX/ext/read_field.f90 +++ /dev/null @@ -1,1700 +0,0 @@ -!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ###################### - MODULE MODI_READ_FIELD -! ###################### -! -INTERFACE -! - SUBROUTINE READ_FIELD(KOCEMI,TPINIFILE,KIU,KJU,KKU, & - HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT,HGETZWS, & - HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR,HGETICEFR, & - HGETBL_DEPTH,HGETSBL_DEPTH,HGETPHC,HGETPHR,HUVW_ADV_SCHEME, & - HTEMP_SCHEME,KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll, & - KSIZELBXTKE_ll,KSIZELBYTKE_ll, & - KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & - PUM,PVM,PWM,PDUM,PDVM,PDWM, & - PUT,PVT,PWT,PTHT,PPABST,PTKET,PRTKEMS, & - PRT,PSVT,PZWS,PCIT,PDRYMASST,PDRYMASSS, & - PSIGS,PSRCT,PCLDFR,PICEFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, PLSZWSM, & - PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & - PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & - KFRC,TPDTFRC,PUFRC,PVFRC,PWFRC,PTHFRC,PRVFRC, & - PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC,PPGROUNDFRC,PATC, & - PTENDUFRC,PTENDVFRC, & - KADVFRC,TPDTADVFRC,PDTHFRC,PDRVFRC, & - KRELFRC,TPDTRELFRC, PTHREL, PRVREL, & - PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M, & - PRUS_PRES,PRVS_PRES,PRWS_PRES,PRTHS_CLD,PRRS_CLD,PRSVS_CLD, & - PIBM_LSF,PIBM_XMUT,PUMEANW,PVMEANW,PWMEANW,PUMEANN,PVMEANN, & - PWMEANN,PUMEANE,PVMEANE,PWMEANE,PUMEANS,PVMEANS,PWMEANS, & - PLSPHI,PBMAP,PFMASE,PFMAWC,PFMWINDU,PFMWINDV,PFMWINDW,PFMHWS ) -! -USE MODD_IO, ONLY : TFILEDATA -USE MODD_TIME ! for type DATE_TIME -! -! -INTEGER, INTENT(IN) :: KOCEMI !Ocan model index -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE !Initial file -INTEGER, INTENT(IN) :: KIU, KJU, KKU - ! array sizes in x, y and z directions -! -CHARACTER (LEN=*), INTENT(IN) :: HGETTKET, & - HGETRVT,HGETRCT,HGETRRT, & - HGETRIT,HGETRST,HGETRGT,HGETRHT, & - HGETCIT,HGETSRCT, HGETZWS, & - HGETSIGS, HGETCLDFR, HGETICEFR, & - HGETBL_DEPTH, HGETSBL_DEPTH, & - HGETPHC, HGETPHR -CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVT -! -! GET indicators to know wether a given variable should or not be read in the -! FM file at time t-deltat and t -CHARACTER(LEN=6), INTENT(IN) :: HUVW_ADV_SCHEME ! advection scheme for wind -CHARACTER(LEN=4), INTENT(IN) :: HTEMP_SCHEME ! advection scheme for wind -! -! sizes of the West-east total LB area -INTEGER, INTENT(IN) :: KSIZELBX_ll,KSIZELBXU_ll ! for T,V,W and u -INTEGER, INTENT(IN) :: KSIZELBXTKE_ll ! for TKE -INTEGER, INTENT(IN) :: KSIZELBXR_ll,KSIZELBXSV_ll ! for Rx and SV -! sizes of the North-south total LB area -INTEGER, INTENT(IN) :: KSIZELBY_ll,KSIZELBYV_ll ! for T,U,W and v -INTEGER, INTENT(IN) :: KSIZELBYTKE_ll ! for TKE -INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll ! for Rx and SV -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PUM,PVM,PWM ! U,V,W at t-dt -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDUM,PDVM,PDWM ! Difference on U,V,W - ! between t+dt and t-dt -REAL, DIMENSION(:,:), INTENT(OUT) :: PBL_DEPTH ! BL depth -REAL, DIMENSION(:,:), INTENT(OUT) :: PSBL_DEPTH ! SBL depth -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTHVMF ! MassFlux buoyancy flux -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PUT,PVT,PWT ! U,V,W at t -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHT,PTKET ! theta, tke and -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRTKEMS ! tke adv source -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPABST ! pressure at t -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PRT,PSVT ! moist and scalar - ! variables at t -REAL, DIMENSION(:,:), INTENT(INOUT) :: PZWS -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCT ! turbulent flux - ! <s'Rc'> at t -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCIT ! ice conc. at t -REAL, INTENT(OUT) :: PDRYMASST ! Md(t) -REAL, INTENT(OUT) :: PDRYMASSS ! d Md(t) / dt -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! =sqrt(<s's'>) for the - ! Subgrid Condensation -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! cloud fraction -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PICEFR ! cloud fraction -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPHC ! pH value in cloud water -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPHR ! pH value in rainwater -! Larger Scale fields -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSUM,PLSVM,PLSWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSTHM, PLSRVM ! Mass -! LB fields -REAL, DIMENSION(:,:), INTENT(OUT) :: PLSZWSM ! significant height of sea waves -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXUM,PLBXVM,PLBXWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBYUM,PLBYVM,PLBYWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBYTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXTKEM ! TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBYTKEM -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PLBXRM ,PLBXSVM ! Moisture and SV -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PLBYRM ,PLBYSVM ! in x and y-dir. -! Forcing fields -INTEGER, INTENT(IN) :: KFRC ! number of forcing -TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT) :: TPDTFRC ! date of forcing profs. -REAL, DIMENSION(:,:), INTENT(OUT) :: PUFRC,PVFRC,PWFRC ! forcing variables -REAL, DIMENSION(:,:), INTENT(OUT) :: PTHFRC,PRVFRC -REAL, DIMENSION(:,:), INTENT(OUT) :: PTENDUFRC,PTENDVFRC -REAL, DIMENSION(:,:), INTENT(OUT) :: PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC -REAL, DIMENSION(:), INTENT(OUT) :: PPGROUNDFRC -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PATC -INTEGER, INTENT(IN) :: KADVFRC ! number of forcing -TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT) :: TPDTADVFRC ! date of forcing profs. -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PDTHFRC, PDRVFRC -INTEGER, INTENT(IN) :: KRELFRC ! number of forcing -TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT) :: TPDTRELFRC ! date of forcing profs. -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PTHREL, PRVREL -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M ! Eddy fluxes -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS_PRES, PRVS_PRES, PRWS_PRES -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS_CLD -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS_CLD, PRSVS_CLD -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PIBM_LSF,PIBM_XMUT -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUMEANW,PVMEANW,PWMEANW -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUMEANN,PVMEANN,PWMEANN -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUMEANE,PVMEANE,PWMEANE -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUMEANS,PVMEANS,PWMEANS -! -! Fire Model fields -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSPHI ! Fire Model Level Set function Phi [-] -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBMAP ! Fire Model Burning map [s] -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFMASE ! Fire Model Available Sensible Energy [J/m2] -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFMAWC ! Fire Model Available Water Content [kg/m2] -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFMWINDU ! Fire Model filtered u wind [m/s] -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFMWINDV ! Fire Model filtered v wind [m/s] -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFMWINDW ! Fire Model filtered w wind [m/s] -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFMHWS ! Fire Model filtered horizontal wind speed [m/s] -! -END SUBROUTINE READ_FIELD -! -END INTERFACE -! -END MODULE MODI_READ_FIELD -! -! ######################################################################## - SUBROUTINE READ_FIELD(KOCEMI,TPINIFILE,KIU,KJU,KKU, & - HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT,HGETZWS, & - HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR,HGETICEFR, & - HGETBL_DEPTH,HGETSBL_DEPTH,HGETPHC,HGETPHR,HUVW_ADV_SCHEME, & - HTEMP_SCHEME,KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll, & - KSIZELBXTKE_ll,KSIZELBYTKE_ll, & - KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & - PUM,PVM,PWM,PDUM,PDVM,PDWM, & - PUT,PVT,PWT,PTHT,PPABST,PTKET,PRTKEMS, & - PRT,PSVT,PZWS,PCIT,PDRYMASST,PDRYMASSS, & - PSIGS,PSRCT,PCLDFR,PICEFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM, & - PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & - PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & - KFRC,TPDTFRC,PUFRC,PVFRC,PWFRC,PTHFRC,PRVFRC, & - PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC,PPGROUNDFRC,PATC, & - PTENDUFRC,PTENDVFRC, & - KADVFRC,TPDTADVFRC,PDTHFRC,PDRVFRC, & - KRELFRC,TPDTRELFRC, PTHREL, PRVREL, & - PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M, & - PRUS_PRES,PRVS_PRES,PRWS_PRES,PRTHS_CLD,PRRS_CLD,PRSVS_CLD, & - PIBM_LSF,PIBM_XMUT,PUMEANW,PVMEANW,PWMEANW,PUMEANN,PVMEANN, & - PWMEANN,PUMEANE,PVMEANE,PWMEANE,PUMEANS,PVMEANS,PWMEANS, & - PLSPHI,PBMAP,PFMASE,PFMAWC,PFMWINDU,PFMWINDV,PFMWINDW,PFMHWS ) -! ######################################################################## -! -!!**** *READ_FIELD* - routine to read prognostic and surface fields -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to initialize prognostic and -! surface fields by reading their value in initial file or by setting -! them to a fixed value. -! -!!** METHOD -!! ------ -!! According to the get indicators, the prognostics fields are : -!! - initialized by reading their value in the LFIFM file -!! if the corresponding indicators are equal to 'READ' -!! - initialized to zero if the corresponding indicators -!! are equal to 'INIT' -!! - not initialized if their corresponding indicators -!! are equal to 'SKIP' -!! -!! In case of time step change, all fields at t-dt are (linearly) -!! interpolated to get a consistant initial state before the segment -!! integration -!! -!! EXTERNAL -!! -------- -!! FMREAD : to read data in LFIFM file -!! INI_LS : to initialize larger scale fields -!! INI_LB : to initialize "2D" surfacic LB fields -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CONF : NVERB,CCONF,CPROGRAM -!! -!! Module MODD_CTURB : XTKEMIN -!! -!! REFERENCE -!! --------- -!! Book2 of the documentation (routine READ_FIELD) -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/06/94 -!! modification 22/11/94 add the pressure function (J.Stein) -!! modification 22/11/94 add the LS fields (J.Stein) -!! modification 06/01/95 add Md(t) (J.P.Lafore) -!! 26/03/95 add EPS var (J. Cuxart) -!! 30/06/95 add var related to the Subgrid condensation -!! (J.Stein) -!! 18/08/95 time step change case (J.P.Lafore) -!! 01/03/96 add the cloud fraction (J. Stein) -!! modification 13/12/95 add fmread of the forcing variables -!! (M.Georgelin) -!! modification 13/02/96 external control of the forcing (J.-P. Pinty) -!! 11/04/96 add the ice concentration (J.-P. Pinty) -!! 27/01/97 read ISVR 3D fields of SV (J.-P. Pinty) -!! 26/02/97 "surfacic" LS fieds introduction (J.P.Lafore) -!! (V MASSON) 03/03/97 positivity control for time step change -!! 10/04/97 proper treatment of minima for LS-fields (J.P.Lafore) -!! J. Stein 22/06/97 use the absolute pressure -!! J. Stein 22/10/97 cleaning + add the LB fields for u,v,w,theta,Rv -!! P. Bechtold 22/01/98 add SST and surface pressure forcing -!! V. Ducrocq 14/08/98 //, remove KIINF,KJINF,KISUP,KJSUP, -!! and introduce INI_LS and INI_LB -!! J. Stein 22/01/99 add the reading of STORAGE_TYPE to improve -!! the START case when the file contains 2 -!! instants MT -!! D. Gazen 22/01/01 use MODD_NSV to handle NSV floating indices -!! for the current model -!! V. Masson 01/2004 removes surface (externalization) -!! J.-P. Pinty 06/05/04 treat NSV_* for C1R3 and ELEC -!! 05/06 Remove EPS -!! M. Leriche 04/10 add pH in cloud water and rainwater -!! M. Leriche 07/10 treat NSV_* for ice phase chemical species -!! C.Lac 11/11 Suppress all the t-Dt fields -!! M.Tomasini, -!! P. Peyrille 06/12 2D west african monsoon : add reading of ADV forcing and addy fluxes -!! C.Lac 03/13 add prognostic supersaturation for C2R2/KHKO -!! Bosseur & Filippi 07/13 Adds Forefire -!! M. Leriche 11/14 correct bug in pH initialization -!! C.Lac 12/14 correction for reproducibility START/RESTA -!! Modification 01/2016 (JP Pinty) Add LIMA -!! M. Leriche 02/16 treat gas and aq. chemicals separately -!! C.Lac 10/16 CEN4TH with RKC4 + Correction on RK loop -!! 09/2017 Q.Rodier add LTEND_UV_FRC -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! V. Vionnet 07/17: add blowing snow scheme -! P. Wautelet 01/2019: corrected intent of PDUM,PDVM,PDWM (OUT->INOUT) -! P. Wautelet 13/02/2019: removed PPABSM and PTSTEP dummy arguments (bugfix: PPABSM was intent(OUT)) -! S. Bielli 02/2019: Sea salt : significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 14/03/2019: correct ZWS when variable not present in file -! M. Leriche 10/06/2019: in restart case read all immersion modes for LIMA -! B. Vie 06/2020: Add prognostic supersaturation for LIMA -! F. Auguste 02/2021: add fields necessary for IBM -! T. Nagel 02/2021: add fields necessary for turbulence recycling -! JL. Redelsperger 03/2021: add necessary variables for Ocean LES case -! A. Costes 12/2021: add Blaze fire model -! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables -!!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_2D_FRC, ONLY: L2D_ADV_FRC, L2D_REL_FRC -USE MODD_ADV_n, ONLY: CTEMP_SCHEME, LSPLIT_CFL -USE MODD_BLOWSNOW_n, ONLY: XSNWCANO -USE MODD_CONF, ONLY: CCONF, CPROGRAM, L1D, LFORCING, NVERB -USE MODD_CONF_n, ONLY: IDX_RVT, IDX_RCT, IDX_RRT, IDX_RIT, IDX_RST, IDX_RGT, IDX_RHT -USE MODD_CST, ONLY: XALPW, XBETAW, XCPD, XGAMW, XMD, XMV, XP00, XRD -USE MODD_TURB_n, ONLY: XTKEMIN -USE MODD_DYN_n, ONLY: LOCEAN -use modd_field, only: tfieldmetadata, tfieldlist, NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED, & - TYPEDATE, TYPEREAL, TYPELOG, TYPEINT -USE MODD_FIELD_n, only: XZWS_DEFAULT -USE MODD_FIRE_n, ONLY: CWINDFILTER, LBLAZE, LRESTA_ASE, LRESTA_AWC, LRESTA_EWAM, LRESTA_WLIM, LWINDFILTER -USE MODD_IBM_PARAM_n, ONLY: LIBM -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LATZ_EDFLX, ONLY: LTH_FLX, LUV_FLX -USE MODD_LUNIT_N, ONLY: TLUOUT -USE MODD_NSV, ONLY: NSV, NSV_C2R2BEG, NSV_C2R2END, NSV_CSBEG, NSV_CSEND, & -#ifdef MNH_FOREFIRE - NSV_FFBEG, NSV_FFEND, & -#endif - NSV_PPBEG, NSV_PPEND, NSV_SNW, NSV_USER, TSVLIST -USE MODD_OCEANH, ONLY: NFRCLT, NINFRT, XSSOLA_T, XSSUFL_T, XSSTFL_T, XSSVFL_T -USE MODD_PARAM_C2R2, ONLY: LSUPSAT -USE MODD_PARAMETERS, ONLY: XUNDEF -USE MODD_PARAM_n, ONLY: CSCONV -USE MODD_RECYCL_PARAM_n, ONLY: LRECYCLE, LRECYCLN, LRECYCLS, LRECYCLW, NR_COUNT -USE MODD_REF, ONLY: LCOUPLES -USE MODD_TIME, ONLY: DATE_TIME -! -use mode_field, only: Find_field_id_from_mnhname -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_MSG -USE MODE_TOOLS, ONLY: UPCASE -! -USE MODI_INI_LB -USE MODI_INI_LS -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -! -INTEGER, INTENT(IN) :: KOCEMI !Ocan model index -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE !Initial file -INTEGER, INTENT(IN) :: KIU, KJU, KKU - ! array sizes in x, y and z directions -! -CHARACTER (LEN=*), INTENT(IN) :: HGETTKET, & - HGETRVT,HGETRCT,HGETRRT, & - HGETRIT,HGETRST,HGETRGT,HGETRHT, & - HGETCIT,HGETSRCT, HGETZWS, & - HGETSIGS, HGETCLDFR, HGETICEFR, & - HGETBL_DEPTH, HGETSBL_DEPTH, & - HGETPHC, HGETPHR -CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVT -! -! GET indicators to know wether a given variable should or not be read in the -! FM file at time t-deltat and t -! -CHARACTER(LEN=6), INTENT(IN) :: HUVW_ADV_SCHEME ! advection scheme for wind -CHARACTER(LEN=4), INTENT(IN) :: HTEMP_SCHEME ! advection scheme for wind -! -! sizes of the West-east total LB area -INTEGER, INTENT(IN) :: KSIZELBX_ll,KSIZELBXU_ll ! for T,V,W and u -INTEGER, INTENT(IN) :: KSIZELBXTKE_ll ! for TKE -INTEGER, INTENT(IN) :: KSIZELBXR_ll,KSIZELBXSV_ll ! for Rx and SV -! sizes of the North-south total LB area -INTEGER, INTENT(IN) :: KSIZELBY_ll,KSIZELBYV_ll ! for T,U,W and v -INTEGER, INTENT(IN) :: KSIZELBYTKE_ll ! for TKE -INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll ! for Rx and SV -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PUM,PVM,PWM ! U,V,W at t-dt -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDUM,PDVM,PDWM ! Difference on U,V,W - ! between t+dt and t-dt -REAL, DIMENSION(:,:), INTENT(OUT) :: PBL_DEPTH ! BL depth -REAL, DIMENSION(:,:), INTENT(OUT) :: PSBL_DEPTH ! SBL depth -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTHVMF ! MassFlux buoyancy flux -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PUT,PVT,PWT ! U,V,W at t -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHT,PTKET ! theta, tke and -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRTKEMS ! tke adv source -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPABST ! pressure at t -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PRT,PSVT ! moist and scalar - ! variables at t -REAL, DIMENSION(:,:), INTENT(INOUT) :: PZWS -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCT ! turbulent flux - ! <s'Rc'> at t -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCIT ! ice conc. at t -REAL, INTENT(OUT) :: PDRYMASST ! Md(t) -REAL, INTENT(OUT) :: PDRYMASSS ! d Md(t) / dt -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! =sqrt(<s's'>) for the - ! Subgrid Condensation -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! cloud fraction -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PICEFR ! cloud fraction -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPHC ! pH value in cloud water -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPHR ! pH value in rainwater -! -! -! Larger Scale fields -REAL, DIMENSION(:,:), INTENT(OUT) :: PLSZWSM ! significant height of sea waves -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSUM,PLSVM,PLSWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSTHM, PLSRVM ! Mass -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXUM,PLBXVM,PLBXWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBYUM,PLBYVM,PLBYWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBYTHM ! Mass -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBXTKEM ! TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLBYTKEM -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PLBXRM ,PLBXSVM ! Moisture and SV -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PLBYRM ,PLBYSVM ! in x and y-dir. -! -! -! Forcing fields -INTEGER, INTENT(IN) :: KFRC ! number of forcing -TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT) :: TPDTFRC ! date of forcing profs. -REAL, DIMENSION(:,:), INTENT(OUT) :: PUFRC,PVFRC,PWFRC ! forcing variables -REAL, DIMENSION(:,:), INTENT(OUT) :: PTHFRC,PRVFRC -REAL, DIMENSION(:,:), INTENT(OUT) :: PTENDUFRC,PTENDVFRC -REAL, DIMENSION(:,:), INTENT(OUT) :: PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC -REAL, DIMENSION(:), INTENT(OUT) :: PPGROUNDFRC -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PATC -INTEGER, INTENT(IN) :: KADVFRC ! number of forcing -TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT) :: TPDTADVFRC ! date of forcing profs. -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PDTHFRC, PDRVFRC -INTEGER, INTENT(IN) :: KRELFRC ! number of forcing -TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT) :: TPDTRELFRC ! date of forcing profs. -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PTHREL, PRVREL -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M ! Eddy fluxes -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS_PRES, PRVS_PRES, PRWS_PRES -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS_CLD -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS_CLD, PRSVS_CLD -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PIBM_LSF ! LSF for IBM -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PIBM_XMUT ! Turbulent viscosity -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUMEANW,PVMEANW,PWMEANW ! Velocity average at West boundary -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUMEANN,PVMEANN,PWMEANN ! Velocity average at North boundary -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUMEANE,PVMEANE,PWMEANE ! Velocity average at East boundary -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUMEANS,PVMEANS,PWMEANS ! Velocity average at South boundary -! Fire Model fields -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLSPHI ! Fire Model Level Set function Phi [-] -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBMAP ! Fire Model Burning map [s] -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFMASE ! Fire Model Available Sensible Energy [J/m2] -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFMAWC ! Fire Model Available Water Content [kg/m2] -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFMWINDU ! Fire Model filtered u wind [m/s] -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFMWINDV ! Fire Model filtered v wind [m/s] -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFMWINDW ! Fire Model filtered v wind [m/s] -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFMHWS ! Fire Model filtered horizontal wind speed [m/s] -! -!* 0.2 declarations of local variables -! -INTEGER :: IID -INTEGER :: ILUOUT ! Unit number for prints -INTEGER :: IRESP -INTEGER :: ISV ! total number of scalar variables -INTEGER :: JSV ! Loop index for additional scalar variables -INTEGER :: JKLOOP,JRR ! Loop indexes -INTEGER :: IIUP,IJUP ! size of working window arrays -INTEGER :: JT ! loop index -LOGICAL :: GLSOURCE ! switch for the source term (for ini_ls and ini_lb) -LOGICAL :: ZLRECYCL ! switch if turbulence recycling is activated -LOGICAL :: GOLDFILEFORMAT -CHARACTER(LEN=3) :: YFRC ! To mark the different forcing dates -CHARACTER(LEN=3) :: YNUM3 -CHARACTER(LEN=15) :: YVAL -REAL, DIMENSION(KIU,KJU,KKU) :: ZWORK ! to compute supersaturation -TYPE(TFIELDMETADATA) :: TZFIELD -! -!------------------------------------------------------------------------------- -! -!* 1. INITIALIZATION -! --------------- -! -GLSOURCE=.FALSE. -ZWORK = 0.0 -! -!If TPINIFILE file was written with a MesoNH version < 5.6, some variables had different names or were not available -GOLDFILEFORMAT = ( TPINIFILE%NMNHVERSION(1) < 5 & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 6 ) ) -!------------------------------------------------------------------------------- -! -!* 2. READ PROGNOSTIC VARIABLES -! ------------------------- -! -!* 2.1 Time t: -! -IF (TPINIFILE%NMNHVERSION(1)<5) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('UT',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'UM' - CALL IO_Field_read(TPINIFILE,TZFIELD,PUT) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('VT',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'VM' - CALL IO_Field_read(TPINIFILE,TZFIELD,PVT) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('WT',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'WM' - CALL IO_Field_read(TPINIFILE,TZFIELD,PWT) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('THT',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'THM' - CALL IO_Field_read(TPINIFILE,TZFIELD,PTHT) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'PABSM' - CALL IO_Field_read(TPINIFILE,TZFIELD,PPABST) -ELSE - CALL IO_Field_read(TPINIFILE,'UT',PUT) - CALL IO_Field_read(TPINIFILE,'VT',PVT) - CALL IO_Field_read(TPINIFILE,'WT',PWT) - CALL IO_Field_read(TPINIFILE,'THT',PTHT) - CALL IO_Field_read(TPINIFILE,'PABST',PPABST) -ENDIF -! -SELECT CASE(HGETTKET) - CASE('READ') - IF (TPINIFILE%NMNHVERSION(1)<5) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('TKET',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'TKEM' - CALL IO_Field_read(TPINIFILE,TZFIELD,PTKET) - ELSE - CALL IO_Field_read(TPINIFILE,'TKET',PTKET) - END IF - IF ( ( (TPINIFILE%NMNHVERSION(1)==5 .AND. TPINIFILE%NMNHVERSION(2)>0) .OR. TPINIFILE%NMNHVERSION(1)>5 ) & - .AND. (CCONF == 'RESTA') .AND. LSPLIT_CFL) THEN - CALL IO_Field_read(TPINIFILE,'TKEMS',PRTKEMS) - END IF - CASE('INIT') - PTKET(:,:,:) = XTKEMIN - PRTKEMS(:,:,:) = 0. -END SELECT -! -SELECT CASE(HGETZWS) - CASE('READ') - CALL IO_Field_read(TPINIFILE,'ZWS',PZWS,IRESP) - !If the field ZWS is not in the file, set its value to XZWS_DEFAULT - !ZWS is present in files since MesoNH 5.4.2 - IF ( IRESP/=0 ) THEN - WRITE (YVAL,'( E15.8 )') XZWS_DEFAULT - CALL PRINT_MSG(NVERB_WARNING,'IO','READ_FIELD','ZWS not found in file: using default value: '//TRIM(YVAL)//' m') - PZWS(:,:) = XZWS_DEFAULT - END IF - - CASE('INIT') - PZWS(:,:)=0. -END SELECT -! -SELECT CASE(HGETRVT) ! vapor - CASE('READ') - IF (TPINIFILE%NMNHVERSION(1)<5) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RVT',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'RVM' - CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RVT)) - ELSE - CALL IO_Field_read(TPINIFILE,'RVT',PRT(:,:,:,IDX_RVT)) - END IF - CASE('INIT') - PRT(:,:,:,IDX_RVT) = 0. -END SELECT -! -SELECT CASE(HGETRCT) ! cloud - CASE('READ') - IF (TPINIFILE%NMNHVERSION(1)<5) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RCT',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'RCM' - CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RCT)) - ELSE - CALL IO_Field_read(TPINIFILE,'RCT',PRT(:,:,:,IDX_RCT)) - END IF - CASE('INIT') - PRT(:,:,:,IDX_RCT) = 0. -END SELECT -! -SELECT CASE(HGETRRT) ! rain - CASE('READ') - IF (TPINIFILE%NMNHVERSION(1)<5) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RRT',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'RRM' - CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RRT)) - ELSE - CALL IO_Field_read(TPINIFILE,'RRT',PRT(:,:,:,IDX_RRT)) - END IF - CASE('INIT') - PRT(:,:,:,IDX_RRT) = 0. -END SELECT -! -SELECT CASE(HGETRIT) ! cloud ice - CASE('READ') - IF (TPINIFILE%NMNHVERSION(1)<5) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RIT',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'RIM' - CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RIT)) - ELSE - CALL IO_Field_read(TPINIFILE,'RIT',PRT(:,:,:,IDX_RIT)) - END IF - CASE('INIT') - PRT(:,:,:,IDX_RIT) = 0. -END SELECT -! -SELECT CASE(HGETRST) ! snow - CASE('READ') - IF (TPINIFILE%NMNHVERSION(1)<5) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RST',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'RSM' - CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RST)) - ELSE - CALL IO_Field_read(TPINIFILE,'RST',PRT(:,:,:,IDX_RST)) - END IF - CASE('INIT') - PRT(:,:,:,IDX_RST) = 0. -END SELECT -! -SELECT CASE(HGETRGT) ! graupel - CASE('READ') - IF (TPINIFILE%NMNHVERSION(1)<5) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RGT',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'RGM' - CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RGT)) - ELSE - CALL IO_Field_read(TPINIFILE,'RGT',PRT(:,:,:,IDX_RGT)) - END IF - CASE('INIT') - PRT(:,:,:,IDX_RGT) = 0. -END SELECT -! -SELECT CASE(HGETRHT) ! hail - CASE('READ') - IF (TPINIFILE%NMNHVERSION(1)<5) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RHT',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'RHM' - CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RHT)) - ELSE - CALL IO_Field_read(TPINIFILE,'RHT',PRT(:,:,:,IDX_RHT)) - END IF - CASE('INIT') - PRT(:,:,:,IDX_RHT) = 0. -END SELECT -! -SELECT CASE(HGETCIT) ! ice concentration - CASE('READ') - IF (SIZE(PCIT) /= 0 ) CALL IO_Field_read(TPINIFILE,'CIT',PCIT) - CASE('INIT') - PCIT(:,:,:)=0. -END SELECT -! -IF (LIBM .AND. CPROGRAM=='MESONH') THEN - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'LSFP', & - CLONGNAME = 'LSFP', & - CSTDNAME = '', & - CUNITS = 'm', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - CALL IO_Field_read(TPINIFILE,TZFIELD,PIBM_LSF) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'XMUT', & - CLONGNAME = 'XMUT', & - CSTDNAME = '', & - CUNITS = 'm2 s-1', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - CALL IO_Field_read(TPINIFILE,TZFIELD,PIBM_XMUT) - ! -ENDIF -! -TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'RECYCLING', & - CLONGNAME = 'RECYCLING', & - CSTDNAME = '', & - CUNITS = '', & - CDIR = '--', & - CCOMMENT = '', & - NGRID = 1, & - NTYPE = TYPELOG, & - NDIMS = 0, & - LTIMEDEP = .FALSE. ) -CALL IO_Field_read(TPINIFILE,TZFIELD,ZLRECYCL,IRESP) -!If field not found (file from older version of MesoNH) => set ZLRECYCL to false -IF ( IRESP /= 0 ) ZLRECYCL = .FALSE. - -IF (ZLRECYCL) THEN - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'RCOUNT', & - CLONGNAME = 'RCOUNT', & - CSTDNAME = '', & - CUNITS = '', & - CDIR = '--', & - NGRID = 1, & - NTYPE = TYPEINT, & - NDIMS = 0, & - LTIMEDEP = .TRUE., & - CCOMMENT = 'Incremental counter for averaging purpose' ) - CALL IO_Field_read(TPINIFILE,TZFIELD,NR_COUNT) - ! - IF (NR_COUNT .NE. 0) THEN - IF (LRECYCLW) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'URECYCLW', & - CLONGNAME = 'URECYCLW', & - CSTDNAME = '', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE., & - CCOMMENT = 'UMEAN-WEST side plan for recycling purpose' ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PUMEANW) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VRECYCLW', & - CLONGNAME = 'VRECYCLW', & - CSTDNAME = '', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE., & - CCOMMENT = 'VMEAN-WEST side plan for recycling purpose' ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PVMEANW) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'WRECYCLW', & - CLONGNAME = 'WRECYCLW', & - CSTDNAME = '', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE., & - CCOMMENT = 'WMEAN-WEST side plan for recycling purpose' ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PWMEANW) - ! - ENDIF - IF (LRECYCLN) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'URECYCLN', & - CLONGNAME = 'URECYCLN', & - CSTDNAME = '', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE., & - CCOMMENT = 'UMEAN-NORTH side plan for recycling purpose' ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PUMEANN) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VRECYCLN', & - CLONGNAME = 'VRECYCLN', & - CSTDNAME = '', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE., & - CCOMMENT = 'VMEAN-NORTH side plan for recycling purpose' ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PVMEANN) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'WRECYCLN', & - CLONGNAME = 'WRECYCLN', & - CSTDNAME = '', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE., & - CCOMMENT = 'WMEAN-NORTH side plan for recycling purpose' ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PWMEANN) - ! - ENDIF - IF (LRECYCLE) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'URECYCLE', & - CLONGNAME = 'URECYCLE', & - CSTDNAME = '', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE., & - CCOMMENT = 'UMEAN-EAST side plan for recycling purpose' ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PUMEANE) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VRECYCLE', & - CLONGNAME = 'VRECYCLE', & - CSTDNAME = '', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE., & - CCOMMENT = 'VMEAN-EAST side plan for recycling purpose' ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PVMEANE) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'WRECYCLE', & - CLONGNAME = 'WRECYCLE', & - CSTDNAME = '', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE., & - CCOMMENT = 'WMEAN-EAST side plan for recycling purpose' ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PWMEANE) - ! - ENDIF - IF (LRECYCLS) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'URECYCLS', & - CLONGNAME = 'URECYCLS', & - CSTDNAME = '', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE., & - CCOMMENT = 'UMEAN-SOUTH side plan for recycling purpose' ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PUMEANS) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VRECYCLS', & - CLONGNAME = 'VRECYCLS', & - CSTDNAME = '', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE., & - CCOMMENT = 'VMEAN-SOUTH side plan for recycling purpose' ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PVMEANS) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'WRECYCLS', & - CLONGNAME = 'WRECYCLS', & - CSTDNAME = '', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE., & - CCOMMENT = 'WMEAN-SOUTH side plan for recycling purpose' ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PWMEANS) - ENDIF - ENDIF -ENDIF - -! Blaze fire model -IF (LBLAZE .AND. CCONF=='RESTA') THEN - ! Blaze is not compliant with MNHVERSION(1)<5 - ! Blaze begins with MNH 5.3.1 - CALL IO_Field_read(TPINIFILE,'FMPHI',PLSPHI,IRESP) - IF (IRESP /= 0) PLSPHI(:,:,:) = 0. - CALL IO_Field_read(TPINIFILE,'FMBMAP',PBMAP,IRESP) - IF (IRESP /= 0) PBMAP(:,:,:) = -1. - CALL IO_Field_read(TPINIFILE,'FMASE',PFMASE,IRESP) - IF(IRESP == 0) THEN - ! flag for the use of restart value for ASE initialization - LRESTA_ASE = .TRUE. - ELSE - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMASE set to 0' ) - PFMASE(:,:,:) = 0. - END IF - CALL IO_Field_read(TPINIFILE,'FMAWC',PFMAWC,IRESP) - ! flag for the use of restart value for AWC initialization - IF(IRESP == 0) THEN - LRESTA_AWC = .TRUE. - ELSE - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMAWC set to 0' ) - PFMAWC(:,:,:) = 0. - END IF - ! read wind on fire grid if present - IF (LWINDFILTER) THEN - ! read in file only if wind filtering is required - SELECT CASE(CWINDFILTER) - CASE('EWAM') - ! read u - CALL IO_Field_read(TPINIFILE,'FMWINDU',PFMWINDU,IRESP) - ! flag for EWAM filtered u wind - IF(IRESP == 0) THEN - LRESTA_EWAM = .TRUE. - ELSE - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMWINDU set to 0' ) - PFMWINDU(:,:,:) = 0. - END IF - ! read v - CALL IO_Field_read(TPINIFILE,'FMWINDV',PFMWINDV,IRESP) - ! flag for EWAM filtered v wind - IF(IRESP == 0 .AND. LRESTA_EWAM) THEN - ! u and v fields found - LRESTA_EWAM = .TRUE. - ELSE - ! u or v fields NOT found - LRESTA_EWAM = .FALSE. - END IF - IF (IRESP /= 0) THEN - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMWINDV set to 0' ) - PFMWINDV(:,:,:) = 0. - END IF - ! read w - CALL IO_Field_read(TPINIFILE,'FMWINDW',PFMWINDW,IRESP) - ! flag for EWAM filtered w wind - IF(IRESP == 0 .AND. LRESTA_EWAM) THEN - ! u and v and w fields found - LRESTA_EWAM = .TRUE. - ELSE - ! u or v or w fields NOT found - LRESTA_EWAM = .FALSE. - END IF - IF (IRESP /= 0) THEN - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMWINDW set to 0' ) - PFMWINDW(:,:,:) = 0. - END IF - - CASE('WLIM') - CALL IO_Field_read(TPINIFILE,'FMHWS',PFMHWS,IRESP) - ! flag for WLIM filtered horizontal wind speed - IF(IRESP == 0) THEN - LRESTA_WLIM = .TRUE. - ELSE - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMHWS set to 0' ) - PFMHWS(:,:,:) = 0. - END IF - END SELECT - END IF -END IF -! -! Scalar Variables Reading : Users, C2R2, C1R3, LIMA, ELEC, Chemical SV -! -ISV= SIZE(PSVT,4) -! -DO JSV = 1, NSV ! initialize according to the get indicators - SELECT CASE( HGETSVT(JSV) ) - CASE ('READ') - TZFIELD = TSVLIST(JSV) - - IF ( GOLDFILEFORMAT ) THEN - IF ( ( JSV >= 1 .AND. JSV <= NSV_USER ) .OR. & - ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. & -#ifdef MNH_FOREFIRE - ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. & -#endif - ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) ) THEN - !Some variables were written with an other name in MesoNH < 5.6 - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CSTDNAME = '' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - ELSE - !Scalar variables were written with a T suffix in older versions - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' - END IF - END IF - - CALL IO_Field_read( TPINIFILE, TZFIELD, PSVT(:,:,:,JSV), IRESP ) - - IF ( IRESP /= 0 ) THEN - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PSVT set to 0 for ' // TRIM( TZFIELD%CMNHNAME ) ) - PSVT(:,:,:,JSV) = 0. - END IF - - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - - IF ( JSV == NSV_C2R2END ) THEN - IF ( LSUPSAT .AND. (HGETRVT == 'READ') ) THEN - ZWORK(:,:,:) = (PPABST(:,:,:)/XP00 )**(XRD/XCPD) - ZWORK(:,:,:) = PTHT(:,:,:)*ZWORK(:,:,:) - ZWORK(:,:,:) = EXP(XALPW-XBETAW/ZWORK(:,:,:)-XGAMW*LOG(ZWORK(:,:,:))) - !rvsat - ZWORK(:,:,:) = (XMV / XMD)*ZWORK(:,:,:)/(PPABST(:,:,:)-ZWORK(:,:,:)) - ZWORK(:,:,:) = PRT(:,:,:,IDX_RVT)/ZWORK(:,:,:) - PSVT(:,:,:,NSV_C2R2END ) = ZWORK(:,:,:) - END IF - END IF - - END SELECT -END DO - -DO JSV = NSV_PPBEG, NSV_PPEND - SELECT CASE( HGETSVT(JSV) ) - CASE ('READ') - WRITE( YNUM3, '( I3.3 )' ) JSV - - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ATC' // YNUM3, & - CSTDNAME = '', & - CLONGNAME = 'ATC' // YNUM3, & - CCOMMENT = 'X_Y_Z_ATC' // YNUM3, & - CUNITS = 'm-3', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - - CALL IO_Field_read( TPINIFILE, TZFIELD, PATC(:,:,:,JSV-NSV_PPBEG+1), IRESP ) - - IF ( IRESP /= 0 ) THEN - PATC(:,:,:,JSV-NSV_PPBEG+1) = 0. - ENDIF - - CASE ('INIT') - PATC(:,:,:,JSV-NSV_PPBEG+1) = 0. - - END SELECT -END DO - -IF ( NSV_SNW >= 1 ) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic for SNOWCANO_M', & - CUNITS = 'kg kg-1', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - DO JSV = 1, NSV_SNW - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - WRITE(TZFIELD%CMNHNAME,'(A10,I3.3)')'SNOWCANO_M',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A8,I3.3)') 'X_Y_Z_','SNOWCANO',JSV - CALL IO_Field_read( TPINIFILE, TZFIELD, XSNWCANO(:,:,JSV) ) - CASE ('INIT') - XSNWCANO(:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (CCONF == 'RESTA') THEN - IF (CTEMP_SCHEME/='LEFR') THEN - CALL IO_Field_read(TPINIFILE,'US_PRES',PRUS_PRES) - CALL IO_Field_read(TPINIFILE,'VS_PRES',PRVS_PRES) - CALL IO_Field_read(TPINIFILE,'WS_PRES',PRWS_PRES) - END IF - IF (LSPLIT_CFL) THEN - CALL IO_Field_read(TPINIFILE,'THS_CLD',PRTHS_CLD) - DO JRR = 1, SIZE(PRT,4) - SELECT CASE(JRR) - CASE (1) - CALL IO_Field_read(TPINIFILE,'RVS_CLD',PRRS_CLD(:,:,:,JRR)) - CASE (2) - CALL IO_Field_read(TPINIFILE,'RCS_CLD',PRRS_CLD(:,:,:,JRR)) - CASE (3) - CALL IO_Field_read(TPINIFILE,'RRS_CLD',PRRS_CLD(:,:,:,JRR)) - CASE (4) - CALL IO_Field_read(TPINIFILE,'RIS_CLD',PRRS_CLD(:,:,:,JRR)) - CASE (5) - CALL IO_Field_read(TPINIFILE,'RSS_CLD',PRRS_CLD(:,:,:,JRR)) - CASE (6) - CALL IO_Field_read(TPINIFILE,'RGS_CLD',PRRS_CLD(:,:,:,JRR)) - CASE (7) - CALL IO_Field_read(TPINIFILE,'RHS_CLD',PRRS_CLD(:,:,:,JRR)) - CASE DEFAULT - CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_FIELD','PRT is too big') - END SELECT - END DO - DO JSV = NSV_C2R2BEG,NSV_C2R2END - IF (JSV == NSV_C2R2BEG ) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'RSVS_CLD1', & - CSTDNAME = '', & - CLONGNAME = 'RSVS_CLD1', & - CUNITS = '1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_RHS_CLD', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PRSVS_CLD(:,:,:,JSV)) - END IF - IF (JSV == NSV_C2R2BEG ) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'RSVS_CLD2', & - CSTDNAME = '', & - CLONGNAME = 'RSVS_CLD2', & - CUNITS = '1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_RHS_CLD', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PRSVS_CLD(:,:,:,JSV)) - END IF - END DO - END IF -END IF -! -!* 2.1 Time t-dt: -! -IF (CPROGRAM=='MESONH' .AND. HUVW_ADV_SCHEME(1:3)=='CEN' .AND. & - HTEMP_SCHEME == 'LEFR' ) THEN - IF (CCONF=='RESTA') THEN - CALL IO_Field_read(TPINIFILE,'UM', PUM) - CALL IO_Field_read(TPINIFILE,'VM', PVM) - CALL IO_Field_read(TPINIFILE,'WM', PWM) - CALL IO_Field_read(TPINIFILE,'DUM',PDUM) - CALL IO_Field_read(TPINIFILE,'DVM',PDVM) - CALL IO_Field_read(TPINIFILE,'DWM',PDWM) - ELSE - PUM = PUT - PVM = PVT - PWM = PWT - END IF -END IF -! -!* 2.2a 3D LS fields -! -! -CALL INI_LS(TPINIFILE,HGETRVT,GLSOURCE,PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM) -! -! -!* 2.2b 2D "surfacic" LB fields -! -! -CALL INI_LB(TPINIFILE,GLSOURCE,ISV, & - KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll, & - KSIZELBXTKE_ll,KSIZELBYTKE_ll, & - KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & - HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETRST, & - HGETRGT,HGETRHT,HGETSVT, & - PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & - PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM ) -! -! -!* 2.3 Some special variables: -! -CALL IO_Field_read(TPINIFILE,'DRYMASST',PDRYMASST) ! dry mass -IF (CCONF=='RESTA') THEN - CALL IO_Field_read(TPINIFILE,'DRYMASSS',PDRYMASSS,IRESP) ! dry mass tendency - - ! DRYMASSS was not written in backup files before MesoNH 5.5.1 - IF ( IRESP /= 0 ) THEN - CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PDRYMASSS set to 0 for ' // TRIM( TZFIELD%CMNHNAME ) ) - PDRYMASSS = 0. - END IF -ELSE - PDRYMASSS=XUNDEF ! should not be used -END IF -! -SELECT CASE(HGETSRCT) ! turbulent flux SRC at time t - CASE('READ') - CALL IO_Field_read(TPINIFILE,'SRCT',PSRCT) - CASE('INIT') - PSRCT(:,:,:)=0. -END SELECT -! -SELECT CASE(HGETSIGS) ! subgrid condensation - CASE('READ') - CALL IO_Field_read(TPINIFILE,'SIGS',PSIGS) - CASE('INIT') - PSIGS(:,:,:)=0. -END SELECT -! -SELECT CASE(HGETPHC) ! pH in cloud water - CASE('READ') - CALL IO_Field_read(TPINIFILE,'PHC',PPHC) - CASE('INIT') - PPHC(:,:,:)=0. -END SELECT -! -SELECT CASE(HGETPHR) ! pH in rainwater - CASE('READ') - CALL IO_Field_read(TPINIFILE,'PHR',PPHR) - CASE('INIT') - PPHR(:,:,:)=0. -END SELECT -! -IRESP=0 -IF(HGETCLDFR=='READ') THEN ! cloud fraction - CALL IO_Field_read(TPINIFILE,'CLDFR',PCLDFR,IRESP) -ENDIF -IF(HGETCLDFR=='INIT' .OR. IRESP /= 0) THEN - IF(SIZE(PRT,4) > 3) THEN - WHERE(PRT(:,:,:,2)+PRT(:,:,:,4) > 1.E-30) - PCLDFR(:,:,:) = 1. - ELSEWHERE - PCLDFR(:,:,:) = 0. - ENDWHERE - ELSE - WHERE(PRT(:,:,:,2) > 1.E-30) - PCLDFR(:,:,:) = 1. - ELSEWHERE - PCLDFR(:,:,:) = 0. - ENDWHERE - ENDIF -ENDIF -! -IRESP=0 -IF(HGETICEFR=='READ') THEN ! cloud fraction - CALL IO_Field_read(TPINIFILE,'ICEFR',PICEFR,IRESP) -ENDIF -IF(HGETCLDFR=='INIT' .OR. IRESP /= 0) THEN - IF(SIZE(PRT,4) > 3) THEN - WHERE(PRT(:,:,:,4) > 1.E-30) - PICEFR(:,:,:) = 1. - ELSEWHERE - PICEFR(:,:,:) = 0. - ENDWHERE - ELSE - PICEFR(:,:,:) = 0. - ENDIF -ENDIF -! -!* boundary layer depth -! -IF (HGETBL_DEPTH=='READ') THEN - CALL IO_Field_read(TPINIFILE,'BL_DEPTH',PBL_DEPTH) -ELSE - PBL_DEPTH(:,:)=XUNDEF -END IF -! -!* surface boundary layer depth -! -IF (HGETSBL_DEPTH=='READ') THEN - CALL IO_Field_read(TPINIFILE,'SBL_DEPTH',PSBL_DEPTH) -ELSE - PSBL_DEPTH(:,:)=0. -END IF -! -!* Contribution from MAss Flux parameterizations to vert. flux of buoyancy -! -SELECT CASE(HGETTKET) - CASE('READ') - IF (CSCONV=='EDKF') THEN - CALL IO_Field_read(TPINIFILE,'WTHVMF',PWTHVMF) - ELSE - PWTHVMF(:,:,:)=0 - ENDIF - CASE('INIT') - PWTHVMF(:,:,:)=0. -END SELECT -!------------------------------------------------------------------------------- -! -!* 2.4 READ FORCING VARIABLES -! ---------------------- -! -! READ FIELD ONLY FOR MODEL1 (identical for all model in GN) -IF (LOCEAN .AND. (.NOT.LCOUPLES) .AND. (KOCEMI==1)) THEN -! - CALL IO_Field_read(TPINIFILE,'NFRCLT',NFRCLT) - CALL IO_Field_read(TPINIFILE,'NINFRT',NINFRT) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SSUFL_T', & - CSTDNAME = '', & - CLONGNAME = 'SSUFL', & - CUNITS = 'kg m-1 s-1', & - CDIR = '--', & - CCOMMENT = 'sfc stress along U to force ocean LES', & - NGRID = 0, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - ALLOCATE(XSSUFL_T(NFRCLT)) - CALL IO_Field_read(TPINIFILE,TZFIELD,XSSUFL_T(:)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SSVFL_T', & - CSTDNAME = '', & - CLONGNAME = 'SSVFL', & - CUNITS = 'kg m-1 s-1', & - CDIR = '--', & - CCOMMENT = 'sfc stress along V to force ocean LES', & - NGRID = 0, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - ALLOCATE(XSSVFL_T(NFRCLT)) - CALL IO_Field_read(TPINIFILE,TZFIELD,XSSVFL_T(:)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SSTFL_T', & - CSTDNAME = '', & - CLONGNAME = 'SSTFL', & - CUNITS = 'kg m3 K m s-1', & - CDIR = '--', & - CCOMMENT = 'sfc total heat flux to force ocean LES', & - NGRID = 0, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - ALLOCATE(XSSTFL_T(NFRCLT)) - CALL IO_Field_read(TPINIFILE,TZFIELD,XSSTFL_T(:)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SSOLA_T', & - CSTDNAME = '', & - CLONGNAME = 'SSOLA', & - CUNITS = 'kg m3 K m s-1', & - CDIR = '--', & - CCOMMENT = 'sfc solar flux to force ocean LES', & - NGRID = 0, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - ALLOCATE(XSSOLA_T(NFRCLT)) - CALL IO_Field_read(TPINIFILE,TZFIELD,XSSOLA_T(:)) -! -END IF ! ocean sfc forcing end - -! -IF ( LFORCING ) THEN - DO JT=1,KFRC -! - WRITE (YFRC,'(I3.3)') JT -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'DTFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'DTFRC'//YFRC, & - CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S', & - CDIR = '--', & - CCOMMENT = 'Date of forcing profile '//YFRC, & - NGRID = 0, & - NTYPE = TYPEDATE, & - NDIMS = 0, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,TPDTFRC(JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'UFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'UFRC'//YFRC, & - CUNITS = 'm s-1', & - CDIR = '--', & - CCOMMENT = 'Zonal component of horizontal forcing wind', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PUFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'VFRC'//YFRC, & - CUNITS = 'm s-1', & - CDIR = '--', & - CCOMMENT = 'Meridian component of horizontal forcing wind', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PVFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'WFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'WFRC'//YFRC, & - CUNITS = 'm s-1', & - CDIR = '--', & - CCOMMENT = 'Vertical forcing wind', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PWFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'THFRC'//YFRC, & - CUNITS = 'K', & - CDIR = '--', & - CCOMMENT = 'Forcing potential temperature', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PTHFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'RVFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'RVFRC'//YFRC, & - CUNITS = 'kg kg-1', & - CDIR = '--', & - CCOMMENT = 'Forcing vapor mixing ratio', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PRVFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'TENDTHFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'TENDTHFRC'//YFRC, & - CUNITS = 'K s-1', & - CDIR = '--', & - CCOMMENT = 'Large-scale potential temperature tendency for forcing', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PTENDTHFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'TENDRVFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'TENDRVFRC'//YFRC, & - CUNITS = 'kg kg-1 s-1', & - CDIR = '--', & - CCOMMENT = 'Large-scale vapor mixing ratio tendency for forcing', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PTENDRVFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'GXTHFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'GXTHFRC'//YFRC, & - CUNITS = 'K m-1', & - CDIR = '--', & - CCOMMENT = 'Large-scale potential temperature gradient for forcing', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PGXTHFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'GYTHFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'GYTHFRC'//YFRC, & - CUNITS = 'K m-1', & - CDIR = '--', & - CCOMMENT = 'Large-scale potential temperature gradient for forcing', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PGYTHFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'PGROUNDFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'PGROUNDFRC'//YFRC, & - CUNITS = 'Pa', & - CDIR = '--', & - CCOMMENT = 'Forcing ground pressure', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 0, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PPGROUNDFRC(JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'TENDUFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'TENDUFRC'//YFRC, & - CUNITS = 'm s-1', & - CDIR = '--', & - CCOMMENT = 'Large-scale U tendency for forcing', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PTENDUFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'TENDVFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'TENDVFRC'//YFRC, & - CUNITS = 'm s-1', & - CDIR = '--', & - CCOMMENT = 'Large-scale V tendency for forcing', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PTENDVFRC(:,JT)) - END DO -END IF -! -!------------------------------------------------------------------------------- -IF (L2D_ADV_FRC) THEN - - DO JT=1,KADVFRC - WRITE (YFRC,'(I3.3)') JT - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'DTADV'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'DTADV'//YFRC, & - CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S', & - CDIR = '--', & - CCOMMENT = 'Date and time of the advecting forcing '//YFRC, & - NGRID = 0, & - NTYPE = TYPEDATE, & - NDIMS = 0, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,TPDTADVFRC(JT)) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'TH_ADV'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'TH_ADV'//YFRC, & - CUNITS = 'K s-1', & - CDIR = '--', & - CCOMMENT = '', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PDTHFRC(:,:,:,JT)) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'Q_ADV'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'Q_ADV'//YFRC, & - CUNITS = 'kg kg-1 s-1', & - CDIR = '--', & - CCOMMENT = '', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PDRVFRC(:,:,:,JT)) - ENDDO -ENDIF -! -IF (L2D_REL_FRC) THEN - - DO JT=1,KRELFRC - WRITE (YFRC,'(I3.3)') JT - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'DTREL'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'DTREL'//YFRC, & - CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S', & - CDIR = '--', & - CCOMMENT = 'Date and time of the relaxation forcing '//YFRC, & - NGRID = 0, & - NTYPE = TYPEDATE, & - NDIMS = 0, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,TPDTRELFRC(JT)) - ! - ! Relaxation - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'TH_REL'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'TH_REL'//YFRC, & - CUNITS = 'K', & - CDIR = '--', & - CCOMMENT = '', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PTHREL(:,:,:,JT)) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'Q_REL'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'Q_REL'//YFRC, & - CUNITS = 'kg kg-1', & - CDIR = '--', & - CCOMMENT = '', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PRVREL(:,:,:,JT)) - ENDDO -ENDIF -! -IF (LUV_FLX) THEN - IF ( CCONF /= 'START' .OR. CPROGRAM=='SPAWN ' ) THEN - CALL IO_Field_read(TPINIFILE,'VU_FLX',PVU_FLUX_M) - ELSE IF (CCONF == 'START') THEN - PVU_FLUX_M(:,:,:)=0. - END IF -ENDIF -! -IF (LTH_FLX) THEN - IF ( CCONF /= 'START' .OR. CPROGRAM=='SPAWN ' ) THEN - CALL IO_Field_read(TPINIFILE,'VT_FLX',PVTH_FLUX_M) - CALL IO_Field_read(TPINIFILE,'WT_FLX',PWTH_FLUX_M) - ELSE IF (CCONF == 'START') THEN - PWTH_FLUX_M(:,:,:)=0. - PVTH_FLUX_M(:,:,:)=0. - END IF -ENDIF -! -!------------------------------------------------------------------------------- -! -! -!* 3. PRINT ON OUTPUT-LISTING -! ---------------------- -! -IF (NVERB >= 10 .AND. .NOT. L1D) THEN - IIUP = SIZE(PUT,1) - IJUP = SIZE(PVT,2) - ILUOUT= TLUOUT%NLU -! - WRITE(ILUOUT,FMT=*) 'READ_FIELD: Some PUT values:' - WRITE(ILUOUT,FMT=*) '(1,1,JK) (IIU/2,IJU/2,JK) (IIU,IJU,JK) JK ' - DO JKLOOP=1,KKU - WRITE(ILUOUT,FMT=*) PUT(1,1,JKLOOP),PUT(IIUP/2,IJUP/2,JKLOOP), & - PUT(IIUP,KJU,JKLOOP),JKLOOP - END DO -! - WRITE(ILUOUT,FMT=*) 'READ_FIELD: Some PVT values:' - WRITE(ILUOUT,FMT=*) '(1,1,JK) (IIU/2,IJU/2,JK) (IIU,IJU,JK) JK ' - DO JKLOOP=1,KKU - WRITE(ILUOUT,FMT=*) PVT(1,1,JKLOOP),PVT(IIUP/2,IJUP/2,JKLOOP), & - PVT(IIUP,IJUP,JKLOOP),JKLOOP - END DO -! - WRITE(ILUOUT,FMT=*) 'READ_FIELD: Some PWT values:' - WRITE(ILUOUT,FMT=*) '(1,1,JK) (IIU/2,IJU/2,JK) (IIU,IJU,JK) JK ' - DO JKLOOP=1,KKU - WRITE(ILUOUT,FMT=*) PWT(1,1,JKLOOP),PWT(IIUP/2,IJUP/2,JKLOOP), & - PWT(IIUP,IJUP,JKLOOP),JKLOOP - END DO -! - WRITE(ILUOUT,FMT=*) 'READ_FIELD: Some PTHT values:' - WRITE(ILUOUT,FMT=*) '(1,1,JK) (IIU/2,IJU/2,JK) (IIU,IJU,JK) JK ' - DO JKLOOP=1,KKU - WRITE(ILUOUT,FMT=*) PTHT(1,1,JKLOOP),PTHT(IIUP/2,IJUP/2,JKLOOP), & - PTHT(IIUP,IJUP,JKLOOP),JKLOOP - END DO -! - IF(SIZE(PTKET,1) /=0) THEN - WRITE(ILUOUT,FMT=*) 'READ_FIELD: Some PTKET values:' - WRITE(ILUOUT,FMT=*) '(1,1,JK) (IIU/2,IJU/2,JK) (IIU,IJU,JK) JK ' - DO JKLOOP=1,KKU - WRITE(ILUOUT,FMT=*) PTKET(1,1,JKLOOP),PTKET(IIUP/2,IJUP/2,JKLOOP), & - PTKET(IIUP,IJUP,JKLOOP),JKLOOP - END DO - END IF -! - IF (SIZE(PRT,4) /= 0) THEN - WRITE(ILUOUT,FMT=*) 'READ_FIELD: Some PRT values:' - DO JRR = 1, SIZE(PRT,4) - WRITE(ILUOUT,FMT=*) 'JRR = ',JRR - WRITE(ILUOUT,FMT=*) '(1,1,JK) (IIU/2,IJU/2,JK) (IIU,IJU,JK) JK ' - DO JKLOOP=1,KKU - WRITE(ILUOUT,FMT=*) PRT(1,1,JKLOOP,JRR),PRT(IIUP/2,IJUP/2,JKLOOP,JRR), & - PRT(IIUP,IJUP,JKLOOP,JRR),JKLOOP - END DO - END DO -! - END IF -! - IF (SIZE(PSVT,4) /= 0) THEN - WRITE(ILUOUT,FMT=*) 'READ_FIELD: Some PSVT values:' - DO JRR = 1, SIZE(PSVT,4) - WRITE(ILUOUT,FMT=*) 'JRR = ',JRR - WRITE(ILUOUT,FMT=*) '(1,1,JK) (IIU/2,IJU/2,JK) (IIU,IJU,JK) JK ' - DO JKLOOP=1,KKU - WRITE(ILUOUT,FMT=*) PSVT(1,1,JKLOOP,JRR),PSVT(IIUP/2,IJUP/2,JKLOOP,JRR), & - PSVT(IIUP,IJUP,JKLOOP,JRR),JKLOOP - END DO - END DO -! - END IF -END IF -!------------------------------------------------------------------------------- -! -! -END SUBROUTINE READ_FIELD diff --git a/src/PHYEX/ext/read_precip_field.f90 b/src/PHYEX/ext/read_precip_field.f90 deleted file mode 100644 index 1267beea7..000000000 --- a/src/PHYEX/ext/read_precip_field.f90 +++ /dev/null @@ -1,299 +0,0 @@ -!MNH_LIC Copyright 1996-2020 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ############################# - MODULE MODI_READ_PRECIP_FIELD -! ############################# -! -! -! -INTERFACE -! - SUBROUTINE READ_PRECIP_FIELD(TPINIFILE,HPROGRAM,HCONF, & - HGETRCT,HGETRRT,HGETRST,HGETRGT,HGETRHT, & - PINPRC,PACPRC,PINDEP,PACDEP,PINPRR,PINPRR3D,PEVAP3D, & - PACPRR,PINPRS,PACPRS,PINPRG,PACPRG,PINPRH,PACPRH ) -! -USE MODD_IO, ONLY : TFILEDATA -! -!* 0.1 declarations of arguments -! -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file -CHARACTER (LEN=*), INTENT(IN) :: HPROGRAM ! -CHARACTER (LEN=*), INTENT(IN) :: HCONF ! -! -CHARACTER (LEN=*), INTENT(IN) :: HGETRCT, HGETRRT, HGETRST, HGETRGT, HGETRHT - ! Get indicator RCT,RRT,RST,RGT,RHT -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Droplet instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PACPRC ! Droplet accumulated precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Droplet instant deposition -REAL, DIMENSION(:,:), INTENT(INOUT) :: PACDEP ! Droplet accumulated dep -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain precipitation flux 3D -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evaporation flux 3D -REAL, DIMENSION(:,:), INTENT(INOUT) :: PACPRR ! Rain accumulated precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PACPRS ! Snow accumulated precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PACPRG ! Graupel accumulated precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PACPRH ! Hail accumulated precip -! -END SUBROUTINE READ_PRECIP_FIELD -! -END INTERFACE -! -END MODULE MODI_READ_PRECIP_FIELD -! -! ############################################################################## - SUBROUTINE READ_PRECIP_FIELD(TPINIFILE,HPROGRAM,HCONF, & - HGETRCT,HGETRRT,HGETRST,HGETRGT,HGETRHT, & - PINPRC,PACPRC,PINDEP,PACDEP,PINPRR,PINPRR3D,PEVAP3D, & - PACPRR,PINPRS,PACPRS,PINPRG,PACPRG,PINPRH,PACPRH ) -! ############################################################################## -! -!!**** *READ_PRECIP_FIELD* - routine to read precipitation surface fields -!! -!! PURPOSE -!! ------- -! Initialize precipitation fields by reading their value in an initial -! MNH file. -! -!!** METHOD -!! ------ -!! -!! -!! -!! EXTERNAL -!! -------- -!! FMREAD : to read data in LFIFM file -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! None -!! -!! REFERENCE -!! --------- -!! Book2 of the documentation (routine READ_PRECIP_FIELD) -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty *Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 13/06/96 -!! (J. Viviand) 04/02/97 convert precipitation rates in m/s -!! (V. Ducrocq) 14/08/98 // remove KIINF,KJINF,KISUP,KJSUP -!! (JP Pinty) 29/11/02 add C3R5, ICE2, ICE4 -!! (C.Lac) 04/03/13 add YGETxxx for FIT scheme -!! 10/2016 (C.Lac) Add droplet deposition -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -!! -!----------------------------------------------------------------------------- -! -!* 0. DECLARATIONS - -use modd_field, only: tfieldmetadata, tfieldlist -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAM_ICE_n, ONLY: LDEPOSC -USE MODD_PARAM_C2R2, ONLY: LDEPOC -USE MODD_PARAM_LIMA, ONLY: MDEPOC=>LDEPOC -! -use mode_field, only: Find_field_id_from_mnhname -USE MODE_IO_FIELD_READ, only: IO_Field_read -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file -CHARACTER (LEN=*), INTENT(IN) :: HPROGRAM ! -CHARACTER (LEN=*), INTENT(IN) :: HCONF ! -! -CHARACTER (LEN=*), INTENT(IN) :: HGETRCT, HGETRRT, HGETRST, HGETRGT, HGETRHT - ! Get indicator RCT,RRT,RST,RGT,RHT -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Droplet instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PACPRC ! Droplet accumulated precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Droplet instant deposition -REAL, DIMENSION(:,:), INTENT(INOUT) :: PACDEP ! Droplet accumulated dep -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain precipitation flux 3D -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evaporation flux 3D -REAL, DIMENSION(:,:), INTENT(INOUT) :: PACPRR ! Rain accumulated precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PACPRS ! Snow accumulated precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PACPRG ! Graupel accumulated precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PACPRH ! Hail accumulated precip -! -!* 0.2 declarations of local variables -! -REAL, DIMENSION(SIZE(PINPRR,1),SIZE(PINPRR,2)) :: Z2D ! 2D array to read data -REAL, DIMENSION(SIZE(PINPRR3D,1),SIZE(PINPRR3D,2),SIZE(PINPRR3D,3)) :: Z3D ! 3D array to read data - ! in initial file -INTEGER :: IID -INTEGER :: IRESP -CHARACTER(LEN=4) :: YGETRCT,YGETRRT,YGETRST,YGETRGT,YGETRHT -TYPE(TFIELDMETADATA) :: TZFIELD -! -!------------------------------------------------------------------------------- -! -!* 1.. INITIALIZATION -! ---------------- -! -IF ((HPROGRAM == 'MESONH') .AND. (HCONF == 'START')) THEN - YGETRCT = 'INIT' - YGETRRT = 'INIT' - YGETRST = 'INIT' - YGETRGT = 'INIT' - YGETRHT = 'INIT' -ELSE - YGETRCT = HGETRCT - YGETRRT = HGETRRT - YGETRST = HGETRST - YGETRGT = HGETRGT - YGETRHT = HGETRHT -END IF -!------------------------------------------------------------------------------- -! -!* 2.. READ PROGNOSTIC VARIABLES -! ------------------------- -! -IF (SIZE(PINPRC) /= 0 ) THEN - SELECT CASE(YGETRCT) - CASE ('READ') - CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) - IF (IRESP == 0) PINPRC(:,:)=Z2D(:,:)/(1000.*3600.) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm' - CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) - IF (IRESP == 0) PACPRC(:,:)=Z2D(:,:)/(1000.) - CASE ('INIT') - PINPRC(:,:) = 0.0 - PACPRC(:,:) = 0.0 - END SELECT -END IF -! -IF (SIZE(PINDEP) /= 0 ) THEN - SELECT CASE(YGETRCT) - CASE ('READ') - CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) - IF (IRESP == 0) PINDEP(:,:)=Z2D(:,:)/(1000.*3600.) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm' - CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) - IF (IRESP == 0) PACDEP(:,:)=Z2D(:,:)/(1000.) - CASE ('INIT') - PINDEP(:,:) = 0.0 - PACDEP(:,:) = 0.0 - END SELECT -END IF -! -IF (SIZE(PINPRR) /= 0 ) THEN - SELECT CASE(YGETRRT) - CASE ('READ') - CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) - IF (IRESP == 0) PINPRR(:,:)=Z2D(:,:)/(1000.*3600.) - ! - CALL IO_Field_read(TPINIFILE,'INPRR3D',Z3D,IRESP) - IF (IRESP == 0) PINPRR3D(:,:,:)=Z3D(:,:,:) - ! - CALL IO_Field_read(TPINIFILE,'EVAP3D',Z3D,IRESP) - IF (IRESP == 0) PEVAP3D(:,:,:)=Z3D(:,:,:) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm' - CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) - IF (IRESP == 0) PACPRR(:,:)=Z2D(:,:)/(1000.) - CASE ('INIT') - PINPRR(:,:) = 0.0 - PINPRR3D(:,:,:) = 0.0 - PEVAP3D(:,:,:) = 0.0 - PACPRR(:,:) = 0.0 - END SELECT -END IF -! -IF (SIZE(PINPRS) /= 0 ) THEN - SELECT CASE(YGETRST) - CASE ('READ') - CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) - IF (IRESP == 0) PINPRS(:,:)=Z2D(:,:)/(1000.*3600.) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm' - CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) - IF (IRESP == 0) PACPRS(:,:)=Z2D(:,:)/(1000.) - CASE ('INIT') - PINPRS(:,:) = 0.0 - PACPRS(:,:) = 0.0 - END SELECT -END IF -! -IF (SIZE(PINPRG) /= 0 ) THEN - SELECT CASE(YGETRGT) - CASE ('READ') - CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) - IF (IRESP == 0) PINPRG(:,:)=Z2D(:,:)/(1000.*3600.) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm' - CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) - IF (IRESP == 0) PACPRG(:,:)=Z2D(:,:)/(1000.) - CASE ('INIT') - PINPRG(:,:) = 0.0 - PACPRG(:,:) = 0.0 - END SELECT -END IF -! -IF (SIZE(PINPRH) /= 0 ) THEN - SELECT CASE(YGETRHT) - CASE ('READ') - CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) - IF (IRESP == 0) PINPRH(:,:)=Z2D(:,:)/(1000.*3600.) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm' - CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) - IF (IRESP == 0) PACPRH(:,:)=Z2D(:,:)/(1000.) - CASE ('INIT') - PINPRH(:,:) = 0.0 - PACPRH(:,:) = 0.0 - END SELECT -END IF -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE READ_PRECIP_FIELD diff --git a/src/PHYEX/ext/resolved_cloud.f90 b/src/PHYEX/ext/resolved_cloud.f90 deleted file mode 100644 index aec42c053..000000000 --- a/src/PHYEX/ext/resolved_cloud.f90 +++ /dev/null @@ -1,1107 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ########################## - MODULE MODI_RESOLVED_CLOUD -! ########################## -INTERFACE - SUBROUTINE RESOLVED_CLOUD ( HCLOUD, HACTCCN, HSCONV, HMF_CLOUD, & - KRR, KSPLITR, KSPLITG, KMI, KTCOUNT, & - HLBCX, HLBCY, TPFILE, HRAD, HTURBDIM, & - OSUBG_COND, OSIGMAS, HSUBG_AUCV, & - PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF, & - PPABST, PTHT, PRT, PSIGS, PSIGQSAT, PMFCONV, & - PTHM, PRCM, PPABSTT, & - PW_ACT,PDTHRAD, PTHS, PRS, PSVT, PSVS, PSRCS, PCLDFR,& - PICEFR, & - PCIT, OSEDIC, OACTIT, OSEDC, OSEDI, & - ORAIN, OWARM, OHHONI, OCONVHG, & - PCF_MF,PRC_MF, PRI_MF, & - PINPRC,PINPRC3D,PINPRR,PINPRR3D, PEVAP3D, & - PINPRS,PINPRS3D,PINPRG,PINPRG3D,PINPRH,PINPRH3D, & - PSOLORG,PMI, & - PSPEEDC, PSPEEDR, PSPEEDS, PSPEEDG, PSPEEDH, & - PINDEP, PSUPSAT, PNACT, PNPRO,PSSPRO, PRAINFR, & - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PSEA,PTOWN ) -! -USE MODD_IO, ONLY: TFILEDATA -! -CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud -CHARACTER(LEN=4), INTENT(IN) :: HACTCCN ! kind of CCN activation scheme - ! paramerization -CHARACTER(LEN=4), INTENT(IN) :: HSCONV ! Shallow convection scheme -CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD! Type of statistical cloud -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step - ! integrations for rain sedimendation -INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step - ! integrations for ice sedimendation -INTEGER, INTENT(IN) :: KMI ! Model index -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter -CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY ! X and Y-direc. LBC type -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Dimensionality of the - ! turbulence scheme -LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid Cond. -LOGICAL, INTENT(IN) :: OSIGMAS ! Switch for Sigma_s: - ! use values computed in CONDENSATION - ! or that from turbulence scheme -CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV - ! Kind of Subgrid autoconversion method -REAL, INTENT(IN) :: PTSTEP ! Time step :XTSTEP in namelist -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ !Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference dry air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PRT ! Moist variables at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t -REAL, INTENT(IN) :: PSIGQSAT! coeff applied to qsat variance contribution -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-Dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSTT ! Pressure time t+Dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at time t-Dt -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_ACT ! W for CCN activation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD! THeta RADiative Tendancy -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable sources -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Scalar variable at time t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable sources -! -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux - ! s'rc'/2Sigma_s2 at time t+1 - ! multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR! Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR! Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice number - ! concentration at time t -LOGICAL, INTENT(IN) :: OSEDIC! Switch to activate the - ! cloud droplet sedimentation - ! for ICE3 -LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the - ! activation through temp. - ! evolution in C2R2 and KHKO -LOGICAL, INTENT(IN) :: OSEDC ! Switch to activate the - ! cloud droplet sedimentation - ! for C2R2 or KHKO -LOGICAL, INTENT(IN) :: OSEDI ! Switch to activate the - ! cloud crystal sedimentation -LOGICAL, INTENT(IN) :: ORAIN ! Switch to activate the - ! raindrop formation -LOGICAL, INTENT(IN) :: OWARM ! Control of the rain formation - ! by slow warm microphysical - ! processes -LOGICAL, INTENT(IN) :: OHHONI! enable haze freezing -LOGICAL, INTENT(IN) :: OCONVHG! Switch for conversion from - ! hail to graupel -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux solid mixing ratio -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! evap profile -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRC3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRS3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRG3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRH3D ! sed flux of precip -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSOLORG ![%] solubility fraction of soa -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PMI -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDC ! Cloud sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDR ! Rain sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDS ! Snow sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDG ! Graupel sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDH ! Hail sedimentation speed -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSUPSAT !sursat -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNACT !concentrtaion d'aérosols activés au temps t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNPRO !concentrtaion d'aérosols activés au temps t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSSPRO !sursat -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR ! Rain fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLC_HRC !HighLow liquid content -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLC_HCF !HighLow liquid cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLI_HRI !HighLow ice content -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLI_HCF !HighLow ice clous fraction -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction -! -END SUBROUTINE RESOLVED_CLOUD -END INTERFACE -END MODULE MODI_RESOLVED_CLOUD -! -! ########################################################################## - SUBROUTINE RESOLVED_CLOUD ( HCLOUD, HACTCCN, HSCONV, HMF_CLOUD, & - KRR, KSPLITR, KSPLITG, KMI, KTCOUNT, & - HLBCX, HLBCY, TPFILE, HRAD, HTURBDIM, & - OSUBG_COND, OSIGMAS, HSUBG_AUCV, & - PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF, & - PPABST, PTHT, PRT, PSIGS, PSIGQSAT, PMFCONV, & - PTHM, PRCM, PPABSTT, & - PW_ACT,PDTHRAD, PTHS, PRS, PSVT, PSVS, PSRCS, PCLDFR,& - PICEFR, & - PCIT, OSEDIC, OACTIT, OSEDC, OSEDI, & - ORAIN, OWARM, OHHONI, OCONVHG, & - PCF_MF,PRC_MF, PRI_MF, & - PINPRC,PINPRC3D,PINPRR,PINPRR3D, PEVAP3D, & - PINPRS,PINPRS3D,PINPRG,PINPRG3D,PINPRH,PINPRH3D, & - PSOLORG,PMI, & - PSPEEDC, PSPEEDR, PSPEEDS, PSPEEDG, PSPEEDH, & - PINDEP, PSUPSAT, PNACT, PNPRO,PSSPRO, PRAINFR, & - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PSEA,PTOWN ) -! ########################################################################## -! -!!**** * - compute the resolved clouds and precipitation -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the microphysical sources -!! related to the resolved clouds and precipitation -!! -!! -!!** METHOD -!! ------ -!! The main actions of this routine is to call the routines computing the -!! microphysical sources. Before that: -!! - it computes the real absolute pressure, -!! - negative values of the current guess of all mixing ratio are removed. -!! This is done by a global filling algorithm based on a multiplicative -!! method (Rood, 1987), in order to conserved the total mass in the -!! simulation domain. -!! - Sources are transformed in physical tendencies, by removing the -!! multiplicative term Rhod*J. -!! - External points values are filled owing to the use of cyclic -!! l.b.c., in order to performe computations on the full domain. -!! After calling to microphysical routines, the physical tendencies are -!! switched back to prognostic variables. -!! -!! -!! EXTERNAL -!! -------- -!! Subroutine SLOW_TERMS: Computes the explicit microphysical sources -!! Subroutine FAST_TERMS: Performs the saturation adjustment for l -!! Subroutine RAIN_ICE : Computes the explicit microphysical sources for i -!! Subroutine ICE_ADJUST: Performs the saturation adjustment for i+l -!! MIN_ll,SUM3D_ll : distributed functions equivalent to MIN and SUM -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_PARAMETERS : contains declarations of parameter variables -!! JPHEXT : Horizontal external points number -!! JPVEXT : Vertical external points number -!! Module MODD_CST -!! CST%XP00 ! Reference pressure -!! CST%XRD ! Gaz constant for dry air -!! CST%XCPD ! Cpd (dry air) -!! -!! REFERENCE -!! --------- -!! -!! Book1 and book2 of documentation ( routine RESOLVED_CLOUD ) -!! -!! AUTHOR -!! ------ -!! E. Richard * Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 21/12/94 -!! Modifications: June 8, 1995 ( J.Stein ) -!! Cleaning to improve efficienty and clarity -!! in agreement with the MESO-NH coding norm -!! March 1, 1996 ( J.Stein ) -!! store the cloud fraction -!! March 18, 1996 ( J.Stein ) -!! check that ZMASSPOS /= 0 -!! Oct. 12, 1996 ( J.Stein ) -!! remove the negative values correction -!! for the KES2 case -!! Modifications: Dec 14, 1995 (J.-P. Pinty) -!! Add the mixed-phase option -!! Modifications: Jul 01, 1996 (J.-P. Pinty) -!! Change arg. list in routine FAST_TERMS -!! Modifications: Jan 27, 1997 (J.-P. Pinty) -!! add W and SV in arg. list -!! Modifications: March 23, 98 (E.Richard) -!! correction of negative value based on -!! rv+rc+ri and thetal or thetail conservation -!! Modifications: April 08, 98 (J.-P. Lafore and V. Ducrocq ) -!! modify the correction of negative values -!! Modifications: June 08, 00 (J.-P. Pinty and J.-M. Cohard) -!! add the C2R2 scheme -!! Modifications: April 08, 01 (J.-P. Pinty) -!! add the C3R5 scheme -!! Modifications: July 21, 01 (J.-P. Pinty) -!! Add OHHONI and PW_ACT (for haze freezing) -!! Modifications: Sept 21, 01 (J.-P. Pinty) -!! Add XCONC_CCN limitation -!! Modifications: Nov 21, 02 (J.-P. Pinty) -!! Add ICE4 and C3R5 options -!! June, 2005 (V. Masson) -!! Technical change in interface for scalar arguments -!! Modifications : March, 2006 (O.Geoffroy) -!! Add KHKO scheme -!! Modifications : March 2013 (O.Thouron) -!! Add prognostic supersaturation -!! July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for -!! aircraft, ballon and profiler -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! M.Mazoyer : 04/2016 : Temperature radiative tendency used for -!! activation by cooling (OACTIT) -!! Modification 01/2016 (JP Pinty) Add LIMA -!! 10/2016 M.Mazoyer New KHKO output fields -!! 10/2016 (C.Lac) Add droplet deposition -!! S.Riette : 11/2016 : ice_adjust before and after rain_ice -!! ICE3/ICE4 modified, old version under LRED=F -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 01/02/2019: ZRSMIN is now allocatable (instead of size of XRTMIN which was sometimes not allocated) -! C. Lac 02/2019: add rain fraction as an output field -! P. Wautelet 02/2020: use the new data structures and subroutines for budgets -! B. Vie 03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets -! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation -! P. Wautelet 11/06/2020: bugfix: correct ZSVS array indices -! P. Wautelet 11/06/2020: bugfix: add "Non local correction for precipitating species" for ICE4 -! P. Wautelet + Benoit Vié 06/2020: improve removal of negative scalar variables + adapt the corresponding budgets -! P. Wautelet 23/06/2020: remove ZSVS and ZSVT to improve code readability -! P. Wautelet 30/06/2020: move removal of negative scalar variables to Sources_neg_correct -! P. Wautelet 30/06/2020: remove non-local corrections -! B. Vie 06/2020: add prognostic supersaturation for LIMA -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -USE MODD_BUDGET, ONLY: TBUDGETS, TBUCONF -USE MODD_CH_AEROSOL, ONLY: LORILAM -USE MODD_DUST, ONLY: LDUST -USE MODD_CST, ONLY: CST -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_DUST , ONLY: LDUST -USE MODD_IO, ONLY: TFILEDATA -USE MODD_NEB_n, ONLY: NEBN, CCONDENS, CLAMBDA3 -USE MODD_NSV, ONLY: NSV, NSV_C1R3END, NSV_C2R2BEG, NSV_C2R2END, & - NSV_LIMA_BEG, NSV_LIMA_END, NSV_LIMA_CCN_FREE, NSV_LIMA_IFN_FREE, & - NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR, NSV_AEREND,NSV_DSTEND,NSV_SLTEND -USE MODD_PARAM_C2R2, ONLY: LSUPSAT -USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT -USE MODD_PARAM_ICE_n, ONLY: CSEDIM, LADJ_BEFORE, LADJ_AFTER, LRED, PARAM_ICEN -USE MODD_PARAM_LIMA, ONLY: LADJ, LPTSPLIT, LSPRO, NMOD_CCN, NMOD_IFN, NMOD_IMM, NMOM_I -USE MODD_RAIN_ICE_DESCR_n, ONLY: XRTMIN, RAIN_ICE_DESCRN -USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAMN -USE MODD_SALT, ONLY: LSALT -USE MODD_TURB_n, ONLY: TURBN -! -USE MODE_ll -USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX -use mode_sources_neg_correct, only: Sources_neg_correct -! -USE MODI_C2R2_ADJUST -USE MODI_FAST_TERMS -USE MODI_GET_HALO -USE MODI_ICE_ADJUST -USE MODI_KHKO_NOTADJUST -USE MODI_LIMA -USE MODI_LIMA_ADJUST -USE MODI_LIMA_ADJUST_SPLIT -USE MODI_LIMA_COLD -USE MODI_LIMA_MIXED -USE MODI_LIMA_NOTADJUST -USE MODI_LIMA_WARM -USE MODI_RAIN_C2R2_KHKO -USE MODI_RAIN_ICE -USE MODI_RAIN_ICE_OLD -USE MODI_SHUMAN -USE MODI_SLOW_TERMS -USE MODI_AER2LIMA -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -! -! -CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud paramerization -CHARACTER(LEN=4), INTENT(IN) :: HACTCCN ! kind of CCN activation scheme -CHARACTER(LEN=4), INTENT(IN) :: HSCONV ! Shallow convection scheme -CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD! Type of statistical cloud -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step - ! integrations for rain sedimendation -INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step - ! integrations for ice sedimendation -INTEGER, INTENT(IN) :: KMI ! Model index -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter -CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY ! X and Y-direc. LBC type -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Dimensionality of the - ! turbulence scheme -LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid Cond. -LOGICAL, INTENT(IN) :: OSIGMAS ! Switch for Sigma_s: - ! use values computed in CONDENSATION - ! or that from turbulence scheme -CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV - ! Kind of Subgrid autoconversion method -REAL, INTENT(IN) :: PTSTEP ! Time step :XTSTEP in namelist -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ !Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference dry air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PRT ! Moist variables at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t -REAL, INTENT(IN) :: PSIGQSAT! coeff applied to qsat variance contribution -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-Dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSTT ! Pressure time t+Dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at time t-Dt -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_ACT ! W for CCN activation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD! THeta RADiative Tendancy -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable sources -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Scalar variable at time t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable sources -! -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux - ! s'rc'/2Sigma_s2 at time t+1 - ! multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR! Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR! Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice number - ! concentration at time t -LOGICAL, INTENT(IN) :: OSEDIC! Switch to activate the - ! cloud droplet sedimentation - ! for ICE3 -LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the - ! activation through temp. - ! evolution in C2R2 and KHKO -LOGICAL, INTENT(IN) :: OSEDC ! Switch to activate the - ! cloud droplet sedimentation -LOGICAL, INTENT(IN) :: OSEDI ! Switch to activate the - ! cloud crystal sedimentation -LOGICAL, INTENT(IN) :: ORAIN ! Switch to activate the - ! raindrop formation -LOGICAL, INTENT(IN) :: OWARM ! Control of the rain formation - ! by slow warm microphysical - ! processes -LOGICAL, INTENT(IN) :: OHHONI! enable haze freezing -LOGICAL, INTENT(IN) :: OCONVHG! Switch for conversion from - ! hail to graupel -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux solid mixing ratio -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! evap profile -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRC3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRS3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRG3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRH3D ! sed flux of precip -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSOLORG ![%] solubility fraction of soa -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PMI -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDC ! Cloud sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDR ! Rain sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDS ! Snow sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDG ! Graupel sedimentation speed -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDH ! Hail sedimentation speed -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSUPSAT !sursat -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNACT !concentrtaion d'aérosols activés au temps t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNPRO !concentrtaion d'aérosols activés au temps t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSSPRO !sursat -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR ! Rain fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLC_HRC !HighLow liquid content -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLC_HCF !HighLow liquid cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLI_HRI !HighLow ice content -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLI_HCF !HighLow ice clous fraction -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction -! -! -!* 0.2 Declarations of local variables : -! -INTEGER :: JRR,JSV ! Loop index for the moist and scalar variables -INTEGER :: IIB ! Define the physical domain -INTEGER :: IIE ! -INTEGER :: IJB ! -INTEGER :: IJE ! -INTEGER :: IKB ! -INTEGER :: IKE ! -INTEGER :: IKU -INTEGER :: IINFO_ll ! return code of parallel routine -INTEGER :: JK,JI,JL -! -! -! -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZDZZ -real, dimension(:,:,:), allocatable :: ZEXN -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZZZ - ! model layer height -! REAL :: ZMASSTOT ! total mass for one water category -! ! including the negative values -! REAL :: ZMASSPOS ! total mass for one water category -! ! after removing the negative values -! REAL :: ZRATIO ! ZMASSTOT / ZMASSCOR -! -INTEGER :: ISVBEG ! first scalar index for microphysics -INTEGER :: ISVEND ! last scalar index for microphysics -!UPG*PT -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVT ! scalar variable for microphysics only -!UPG*PT - -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3), KRR) :: ZFPR -! -INTEGER :: JMOD, JMOD_IFN -LOGICAL :: GWEST,GEAST,GNORTH,GSOUTH -LOGICAL :: LMFCONV ! =SIZE(PMFCONV)!=0 -! BVIE work array waiting for PINPRI -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)):: ZINPRI -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZICEFR -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZPRCFR -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZTM -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZSIGQSAT2D -TYPE(DIMPHYEX_t) :: YLDIMPHYEX -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZDUM -ZSIGQSAT2D(:,:) = PSIGQSAT -! -!------------------------------------------------------------------------------ -! -!* 1. PRELIMINARY COMPUTATIONS -! ------------------------ -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB=1+JPVEXT -IKE=SIZE(PZZ,3) - JPVEXT -IKU=SIZE(PZZ,3) -! -CALL FILL_DIMPHYEX(YLDIMPHYEX, SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3)) -! -GWEST = LWEST_ll() -GEAST = LEAST_ll() -GSOUTH = LSOUTH_ll() -GNORTH = LNORTH_ll() -! -LMFCONV=(SIZE(PMFCONV)/=0) -! -IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO') THEN - ISVBEG = NSV_C2R2BEG - ISVEND = NSV_C2R2END -ELSE IF (HCLOUD == 'C3R5') THEN - ISVBEG = NSV_C2R2BEG - ISVEND = NSV_C1R3END -ELSE IF (HCLOUD == 'LIMA') THEN - ISVBEG = NSV_LIMA_BEG - IF (.NOT. LDUST .AND. .NOT. LSALT .AND. .NOT. LORILAM) THEN - ISVEND = NSV_LIMA_END - ELSE - IF (LORILAM) THEN - ISVEND = NSV_AEREND - END IF - IF (LDUST) THEN - ISVEND = NSV_DSTEND - END IF - IF (LSALT) THEN - ISVEND = NSV_SLTEND - END IF - END IF -ELSE - ISVBEG = 0 - ISVEND = 0 -END IF -! -! -! -!* 1. From ORILAM to LIMA: -! -IF (HCLOUD == 'LIMA' .AND. ((LORILAM).OR.(LDUST).OR.(LSALT))) THEN -! ORILAM : tendance s --> variable instant t -ALLOCATE(ZSVT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),NSV)) - DO JSV = 1, NSV - ZSVT(:,:,:,JSV) = PSVS(:,:,:,JSV) * PTSTEP / PRHODJ(:,:,:) - END DO - -CALL AER2LIMA(ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:),& - PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,1),& - PPABST(IIB:IIE,IJB:IJE,IKB:IKE),& - PTHT(IIB:IIE,IJB:IJE,IKB:IKE), & - PZZ(IIB:IIE,IJB:IJE,IKB:IKE)) - -! LIMA : variable instant t --> tendance s - PSVS(:,:,:,NSV_LIMA_CCN_FREE) = ZSVT(:,:,:,NSV_LIMA_CCN_FREE) * & - PRHODJ(:,:,:) / PTSTEP - PSVS(:,:,:,NSV_LIMA_CCN_FREE+1) = ZSVT(:,:,:,NSV_LIMA_CCN_FREE+1) * & - PRHODJ(:,:,:) / PTSTEP - PSVS(:,:,:,NSV_LIMA_CCN_FREE+2) = ZSVT(:,:,:,NSV_LIMA_CCN_FREE+2) * & - PRHODJ(:,:,:) / PTSTEP - - PSVS(:,:,:,NSV_LIMA_IFN_FREE) = ZSVT(:,:,:,NSV_LIMA_IFN_FREE) * & - PRHODJ(:,:,:) / PTSTEP - PSVS(:,:,:,NSV_LIMA_IFN_FREE+1) = ZSVT(:,:,:,NSV_LIMA_IFN_FREE+1) * & - PRHODJ(:,:,:) / PTSTEP - -DEALLOCATE(ZSVT) -END IF - -!UPG*PT -! -! -!* 2. TRANSFORMATION INTO PHYSICAL TENDENCIES -! --------------------------------------- -! -PTHS(:,:,:) = PTHS(:,:,:) / PRHODJ(:,:,:) -DO JRR = 1,KRR - PRS(:,:,:,JRR) = PRS(:,:,:,JRR) / PRHODJ(:,:,:) -END DO -! -IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN - DO JSV = ISVBEG, ISVEND - PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) / PRHODJ(:,:,:) - ENDDO -ENDIF -! -! complete the lateral boundaries to avoid possible problems -! -DO JI=1,JPHEXT - PTHS(JI,:,:) = PTHS(IIB,:,:) - PTHS(IIE+JI,:,:) = PTHS(IIE,:,:) - PTHS(:,JI,:) = PTHS(:,IJB,:) - PTHS(:,IJE+JI,:) = PTHS(:,IJE,:) -! - PRS(JI,:,:,:) = PRS(IIB,:,:,:) - PRS(IIE+JI,:,:,:) = PRS(IIE,:,:,:) - PRS(:,JI,:,:) = PRS(:,IJB,:,:) - PRS(:,IJE+JI,:,:) = PRS(:,IJE,:,:) -END DO -! -! complete the physical boundaries to avoid some computations -! -IF(GWEST .AND. HLBCX(1) /= 'CYCL') PRT(:IIB-1,:,:,2:) = 0.0 -IF(GEAST .AND. HLBCX(2) /= 'CYCL') PRT(IIE+1:,:,:,2:) = 0.0 -IF(GSOUTH .AND. HLBCY(1) /= 'CYCL') PRT(:,:IJB-1,:,2:) = 0.0 -IF(GNORTH .AND. HLBCY(2) /= 'CYCL') PRT(:,IJE+1:,:,2:) = 0.0 -! -IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN -DO JI=1,JPHEXT - PSVS(JI, :, :, ISVBEG:ISVEND) = PSVS(IIB, :, :, ISVBEG:ISVEND) - PSVS(IIE+JI, :, :, ISVBEG:ISVEND) = PSVS(IIE, :, :, ISVBEG:ISVEND) - PSVS(:, JI, :, ISVBEG:ISVEND) = PSVS(:, IJB, :, ISVBEG:ISVEND) - PSVS(:, IJE+JI, :, ISVBEG:ISVEND) = PSVS(:, IJE, :, ISVBEG:ISVEND) -END DO - ! -! complete the physical boundaries to avoid some computations -! - IF(GWEST .AND. HLBCX(1) /= 'CYCL') PSVT(:IIB-1, :, :, ISVBEG:ISVEND) = 0.0 - IF(GEAST .AND. HLBCX(2) /= 'CYCL') PSVT(IIE+1:, :, :, ISVBEG:ISVEND) = 0.0 - IF(GSOUTH .AND. HLBCY(1) /= 'CYCL') PSVT(:, :IJB-1, :, ISVBEG:ISVEND) = 0.0 - IF(GNORTH .AND. HLBCY(2) /= 'CYCL') PSVT(:, IJE+1:, :, ISVBEG:ISVEND) = 0.0 -ENDIF -! -! complete the vertical boundaries -! -PTHS(:,:,IKB-1) = PTHS(:,:,IKB) -PTHS(:,:,IKE+1) = PTHS(:,:,IKE) -! -PRS(:,:,IKB-1,:) = PRS(:,:,IKB,:) -PRS(:,:,IKE+1,:) = PRS(:,:,IKE,:) -! -PRT(:,:,IKB-1,:) = PRT(:,:,IKB,:) -PRT(:,:,IKE+1,:) = PRT(:,:,IKE,:) -! -IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' .OR. HCLOUD == 'KHKO' & - .OR. HCLOUD == 'LIMA') THEN - PSVS(:,:,IKB-1,ISVBEG:ISVEND) = PSVS(:,:,IKB,ISVBEG:ISVEND) - PSVS(:,:,IKE+1,ISVBEG:ISVEND) = PSVS(:,:,IKE,ISVBEG:ISVEND) - PSVT(:,:,IKB-1,ISVBEG:ISVEND) = PSVT(:,:,IKB,ISVBEG:ISVEND) - PSVT(:,:,IKE+1,ISVBEG:ISVEND) = PSVT(:,:,IKE,ISVBEG:ISVEND) -ENDIF -! -! -!* 3. REMOVE NEGATIVE VALUES -! ---------------------- -! -!* 3.1 Non local correction for precipitating species (Rood 87) -! -! IF ( HCLOUD == 'KESS' & -! .OR. HCLOUD == 'ICE3' .OR. HCLOUD == 'ICE4' & -! .OR. HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' & -! .OR. HCLOUD == 'KHKO' .OR. HCLOUD == 'LIMA' ) THEN -! ! -! DO JRR = 3,KRR -! SELECT CASE (JRR) -! CASE(3,5,6,7) ! rain, snow, graupel and hail -! -! IF ( MIN_ll( PRS(:,:,:,JRR), IINFO_ll) < 0.0 ) THEN -! ! -! ! compute the total water mass computation -! ! -! ZMASSTOT = MAX( 0. , SUM3D_ll( PRS(:,:,:,JRR), IINFO_ll ) ) -! ! -! ! remove the negative values -! ! -! PRS(:,:,:,JRR) = MAX( 0., PRS(:,:,:,JRR) ) -! ! -! ! compute the new total mass -! ! -! ZMASSPOS = MAX(XMNH_TINY,SUM3D_ll( PRS(:,:,:,JRR), IINFO_ll ) ) -! ! -! ! correct again in such a way to conserve the total mass -! ! -! ZRATIO = ZMASSTOT / ZMASSPOS -! PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * ZRATIO -! ! -! END IF -! END SELECT -! END DO -! END IF -! -!* 3.2 Adjustement for liquid and solid cloud -! -! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets -call Sources_neg_correct( hcloud, 'NEGA', krr, ptstep, ppabst, ptht, prt, pths, prs, psvs, prhodj ) -! -!* 3.4 Limitations of Na and Nc to the CCN max number concentration -! -! Commented by O.Thouron 03/2013 -!IF ((HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' .OR. HCLOUD == 'KHKO') & -! .AND.(XCONC_CCN > 0)) THEN -! IF ((HACTCCN /= 'ABRK')) THEN -! ZSVT(:,:,:,1) = MIN( ZSVT(:,:,:,1),XCONC_CCN ) -! ZSVT(:,:,:,2) = MIN( ZSVT(:,:,:,2),XCONC_CCN ) -! ZSVS(:,:,:,1) = MIN( ZSVS(:,:,:,1),XCONC_CCN ) -! ZSVS(:,:,:,2) = MIN( ZSVS(:,:,:,2),XCONC_CCN ) -! END IF -!END IF -! -! -!------------------------------------------------------------------------------- -! -SELECT CASE ( HCLOUD ) - CASE ('REVE') -! -!* 4. REVERSIBLE MICROPHYSICAL SCHEME -! ------------------------------- -! - CALL FAST_TERMS ( KRR, KMI, HRAD, HTURBDIM, & - HSCONV, HMF_CLOUD, OSUBG_COND, PTSTEP, & - PRHODJ, PSIGS, PPABST, & - PCF_MF,PRC_MF, & - PRVT=PRT(:,:,:,1), PRCT=PRT(:,:,:,2), & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR ) -! - CASE ('KESS') -! -!* 5. KESSLER MICROPHYSICAL SCHEME -! ---------------------------- -! -! -!* 5.1 Compute the explicit microphysical sources -! - CALL SLOW_TERMS ( KSPLITR, PTSTEP, KMI, HSUBG_AUCV, & - PZZ, PRHODJ, PRHODREF, PCLDFR, & - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), PRT(:,:,:,3), PPABST, & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PINPRR, PINPRR3D, PEVAP3D ) -! -!* 5.2 Perform the saturation adjustment -! - CALL FAST_TERMS ( KRR, KMI, HRAD, HTURBDIM, & - HSCONV, HMF_CLOUD, OSUBG_COND, PTSTEP, & - PRHODJ, PSIGS, PPABST, & - PCF_MF,PRC_MF, & - PRVT=PRT(:,:,:,1), PRCT=PRT(:,:,:,2), & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), PRRS=PRS(:,:,:,3), & - PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR ) -! -! - CASE ('C2R2','KHKO') -! -!* 7. 2-MOMENT WARM MICROPHYSICAL SCHEME C2R2 or KHKO -! --------------------------------------- -! -! -!* 7.1 Compute the explicit microphysical sources -! -! - CALL RAIN_C2R2_KHKO ( HCLOUD, OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & - TPFILE, PZZ, PRHODJ, PRHODREF, PEXNREF, & - PPABST, PTHT, PRT(:,:,:,1), PRT(:,:,:,2), PRT(:,:,:,3), & - PTHM, PRCM, PPABSTT, & - PW_ACT,PDTHRAD,PTHS, PRS(:,:,:,1),PRS(:,:,:,2),PRS(:,:,:,3), & - PSVT(:,:,:,NSV_C2R2BEG), PSVT(:,:,:,NSV_C2R2BEG+1), & - PSVT(:,:,:,NSV_C2R2BEG+2), PSVS(:,:,:,NSV_C2R2BEG), & - PSVS(:,:,:,NSV_C2R2BEG+1), PSVS(:,:,:,NSV_C2R2BEG+2), & - PINPRC, PINPRR, PINPRR3D, PEVAP3D , & - PSVT(:,:,:,:), PSOLORG, PMI, HACTCCN, & - PINDEP, PSUPSAT, PNACT ) -! -! -!* 7.2 Perform the saturation adjustment -! - IF (LSUPSAT) THEN - CALL KHKO_NOTADJUST (KRR, KTCOUNT,TPFILE, HRAD, & - PTSTEP, PRHODJ, PPABSTT, PPABST, PRHODREF, PZZ, & - PTHT,PRT(:,:,:,1),PRT(:,:,:,2),PRT(:,:,:,3), & - PTHS,PRS(:,:,:,1),PRS(:,:,:,2),PRS(:,:,:,3), & - PSVS(:,:,:,NSV_C2R2BEG+1), PSVS(:,:,:,NSV_C2R2BEG), & - PSVS(:,:,:,NSV_C2R2BEG+3), PCLDFR, PSRCS, PNPRO, PSSPRO ) -! - ELSE - CALL C2R2_ADJUST ( KRR,TPFILE, HRAD, & - HTURBDIM, OSUBG_COND, PTSTEP, & - PRHODJ, PSIGS, PPABST, & - PTHS=PTHS, PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PCNUCS=PSVS(:,:,:,NSV_C2R2BEG), & - PCCS=PSVS(:,:,:,NSV_C2R2BEG+1), & - PSRCS=PSRCS, PCLDFR=PCLDFR, PRRS=PRS(:,:,:,3) ) -! - END IF -! - CASE ('ICE3') -! -!* 9. MIXED-PHASE MICROPHYSICAL SCHEME (WITH 3 ICE SPECIES) -! ----------------------------------------------------- -! - allocate( zexn( size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) ) - ZEXN(:,:,:)= (PPABST(:,:,:)/CST%XP00)**(CST%XRD/CST%XCPD) -! -!* 9.1 Compute the explicit microphysical sources -! -! - DO JK=IKB,IKE - ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) - ENDDO - ZZZ = MZF( PZZ ) - IF(LRED .AND. LADJ_BEFORE) THEN - CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN, & - PARAM_ICEN, TBUCONF, KRR, & - 'ADJU', & - PTSTEP, ZSIGQSAT2D, & - PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV,PMFCONV, PPABST, ZZZ, & - ZEXN, PCF_MF, PRC_MF, PRI_MF, & - ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & - PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PTH=PTHS*PTSTEP, PTHS=PTHS, & - OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, & - PRR=PRS(:,:,:,3)*PTSTEP, & - PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & - PRS=PRS(:,:,:,5)*PTSTEP, & - PRG=PRS(:,:,:,6)*PTSTEP, & - TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & - PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & - PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) - ENDIF - IF (LRED) THEN - CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICEN, RAIN_ICE_PARAMN, & - RAIN_ICE_DESCRN, TBUCONF, & - PTSTEP, KRR, ZEXN, & - ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT,PCLDFR,& - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & - PRT(:,:,:,3), PRT(:,:,:,4), & - PRT(:,:,:,5), PRT(:,:,:,6), & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC,PINPRR, PEVAP3D, & - PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & - TBUDGETS,SIZE(TBUDGETS), & - PSEA,PTOWN, PFPR=ZFPR ) - ELSE - CALL RAIN_ICE_OLD (YLDIMPHYEX, OSEDIC, CSEDIM, HSUBG_AUCV, OWARM, 1, IKU, 1, & - KSPLITR, PTSTEP, KRR, & - ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & - PRT(:,:,:,3), PRT(:,:,:,4), & - PRT(:,:,:,5), PRT(:,:,:,6), & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC,PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS,PINDEP, PRAINFR, & - PSEA, PTOWN, PFPR=ZFPR) - END IF - -! -!* 9.2 Perform the saturation adjustment over cloud ice and cloud water -! -! - IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN - CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN, & - PARAM_ICEN, TBUCONF, KRR, & - 'DEPI', & - PTSTEP, ZSIGQSAT2D, & - PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,PPABST, ZZZ, & - ZEXN, PCF_MF, PRC_MF, PRI_MF, & - ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & - PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PTH=PTHS*PTSTEP, PTHS=PTHS, & - OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, & - PRR=PRS(:,:,:,3)*PTSTEP, & - PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & - PRS=PRS(:,:,:,5)*PTSTEP, & - PRG=PRS(:,:,:,6)*PTSTEP, & - TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & - PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & - PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) - END IF - - deallocate( zexn ) -! - CASE ('ICE4') -! -!* 10. MIXED-PHASE MICROPHYSICAL SCHEME (WITH 4 ICE SPECIES) -! ----------------------------------------------------- -! - allocate( zexn( size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) ) - ZEXN(:,:,:)= (PPABST(:,:,:)/CST%XP00)**(CST%XRD/CST%XCPD) -! -!* 10.1 Compute the explicit microphysical sources -! -! - DO JK=IKB,IKE - ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) - ENDDO - ZZZ = MZF( PZZ ) - IF(LRED .AND. LADJ_BEFORE) THEN - CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN, & - PARAM_ICEN, TBUCONF, KRR, & - 'ADJU', & - PTSTEP, ZSIGQSAT2D, & - PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV,PMFCONV, PPABST, ZZZ, & - ZEXN, PCF_MF, PRC_MF, PRI_MF, & - ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & - PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PTH=PTHS*PTSTEP, PTHS=PTHS, & - OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, & - PRR=PRS(:,:,:,3)*PTSTEP, & - PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & - PRS=PRS(:,:,:,5)*PTSTEP, & - PRG=PRS(:,:,:,6)*PTSTEP, & - TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & - PRH=PRS(:,:,:,7)*PTSTEP, & - PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & - PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) - ENDIF - IF (LRED) THEN - CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICEN, RAIN_ICE_PARAMN, & - RAIN_ICE_DESCRN, TBUCONF, & - PTSTEP, KRR, ZEXN, & - ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & - PRT(:,:,:,3), PRT(:,:,:,4), & - PRT(:,:,:,5), PRT(:,:,:,6), & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC, PINPRR, PEVAP3D, & - PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & - TBUDGETS,SIZE(TBUDGETS), & - PSEA, PTOWN, & - PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR ) - ELSE - CALL RAIN_ICE_OLD (YLDIMPHYEX, OSEDIC, CSEDIM, HSUBG_AUCV, OWARM, 1, IKU, 1, & - KSPLITR, PTSTEP, KRR, & - ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & - PRT(:,:,:,3), PRT(:,:,:,4), & - PRT(:,:,:,5), PRT(:,:,:,6), & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC,PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS,PINDEP, PRAINFR, & - PSEA, PTOWN, & - PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR) - END IF - - -! -!* 10.2 Perform the saturation adjustment over cloud ice and cloud water -! - IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN - CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN, & - PARAM_ICEN, TBUCONF, KRR, & - 'DEPI', & - PTSTEP, ZSIGQSAT2D, & - PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,PPABST, ZZZ, & - ZEXN, PCF_MF, PRC_MF, PRI_MF, & - ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & - PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PTH=PTHS*PTSTEP, PTHS=PTHS, & - OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, & - PRR=PRS(:,:,:,3)*PTSTEP, & - PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & - PRS=PRS(:,:,:,5)*PTSTEP, & - PRG=PRS(:,:,:,6)*PTSTEP, & - TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & - PRH=PRS(:,:,:,7)*PTSTEP, & - PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & - PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) - END IF - - deallocate( zexn ) -! -! -!* 12. 2-MOMENT MIXED-PHASE MICROPHYSICAL SCHEME LIMA -! -------------------------------------------------------------- -! -! -!* 12.1 Compute the explicit microphysical sources -! - CASE ('LIMA') - ! - DO JK=IKB,IKE - ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) - ENDDO - ZZZ = MZF( PZZ ) - IF (LPTSPLIT) THEN - CALL LIMA (YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS), & - PTSTEP, & - PRHODREF, PEXNREF, ZDZZ, & - PRHODJ, PPABST, & - NMOD_CCN, NMOD_IFN, NMOD_IMM, & - PDTHRAD, PTHT, PRT, & - PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), PW_ACT, & - PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, PINPRH, & - PEVAP3D, PCLDFR, PICEFR, PRAINFR, ZFPR ) - ELSE - - IF (OWARM) CALL LIMA_WARM(OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & - TPFILE, KRR, PZZ, PRHODJ, & - PRHODREF, PEXNREF, PW_ACT, PPABST, & - PDTHRAD, & - PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PINPRC, PINPRR, PINDEP, PINPRR3D, PEVAP3D ) -! - IF (NMOM_I.GE.1) CALL LIMA_COLD(CST, OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & - KRR, PZZ, PRHODJ, & - PRHODREF, PEXNREF, PPABST, PW_ACT, & - PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PINPRS, PINPRG, PINPRH ) -! - IF (OWARM .AND. NMOM_I.GE.1) CALL LIMA_MIXED(OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & - KRR, PZZ, PRHODJ, & - PRHODREF, PEXNREF, PPABST, PW_ACT, & - PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END) ) - ENDIF -! -!* 12.2 Perform the saturation adjustment -! - IF (LSPRO) THEN - CALL LIMA_NOTADJUST (KMI, TPFILE, HRAD, & - PTSTEP, PRHODJ, PPABSTT, PPABST, PRHODREF, PEXNREF, PZZ, & - PTHT,PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS,PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PCLDFR, PICEFR, PRAINFR, PSRCS ) - ELSE IF (LPTSPLIT) THEN - CALL LIMA_ADJUST_SPLIT(YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS), & - KRR, KMI, CCONDENS, CLAMBDA3, & - OSUBG_COND, OSIGMAS, PTSTEP, PSIGQSAT, & - PRHODREF, PRHODJ, PEXNREF, PSIGS, PMFCONV, PPABST, PPABSTT, ZZZ,& - PDTHRAD, PW_ACT, & - PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PSRCS, PCLDFR, PICEFR, PRC_MF, PRI_MF, PCF_MF ) - ELSE - CALL LIMA_ADJUST(KRR, KMI, TPFILE, & - OSUBG_COND, PTSTEP, & - PRHODREF, PRHODJ, PEXNREF, PPABST, PPABSTT, & - PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PSRCS, PCLDFR, PICEFR, PRAINFR ) - ENDIF -! -END SELECT -! -IF(HCLOUD=='ICE3' .OR. HCLOUD=='ICE4' ) THEN -! TODO: code a generic routine to update vertical lower and upper levels to 0, a -! specific value or to IKB or IKE and apply it to every output prognostic variable of physics - PCIT(:,:,1) = 0. - PCIT(:,:,IKE+1) = 0. - - PINPRC3D=ZFPR(:,:,:,2) / CST%XRHOLW - PINPRR3D=ZFPR(:,:,:,3) / CST%XRHOLW - PINPRS3D=ZFPR(:,:,:,5) / CST%XRHOLW - PINPRG3D=ZFPR(:,:,:,6) / CST%XRHOLW - IF(KRR==7) PINPRH3D=ZFPR(:,:,:,7) / CST%XRHOLW - WHERE (PRT(:,:,:,2) > 1.E-04 ) - PSPEEDC=ZFPR(:,:,:,2) / (PRT(:,:,:,2) * PRHODREF(:,:,:)) - ENDWHERE - WHERE (PRT(:,:,:,3) > 1.E-04 ) - PSPEEDR=ZFPR(:,:,:,3) / (PRT(:,:,:,3) * PRHODREF(:,:,:)) - ENDWHERE - WHERE (PRT(:,:,:,5) > 1.E-04 ) - PSPEEDS=ZFPR(:,:,:,5) / (PRT(:,:,:,5) * PRHODREF(:,:,:)) - ENDWHERE - WHERE (PRT(:,:,:,6) > 1.E-04 ) - PSPEEDG=ZFPR(:,:,:,6) / (PRT(:,:,:,6) * PRHODREF(:,:,:)) - ENDWHERE - IF(KRR==7) THEN - WHERE (PRT(:,:,:,7) > 1.E-04 ) - PSPEEDH=ZFPR(:,:,:,7) / (PRT(:,:,:,7) * PRHODREF(:,:,:)) - ENDWHERE - ENDIF -ENDIF - -! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets -call Sources_neg_correct( hcloud, 'NECON', krr, ptstep, ppabst, ptht, prt, pths, prs, psvs, prhodj ) - -!------------------------------------------------------------------------------- -! -! -!* 13. SWITCH BACK TO THE PROGNOSTIC VARIABLES -! --------------------------------------- -! -PTHS(:,:,:) = PTHS(:,:,:) * PRHODJ(:,:,:) -! -DO JRR = 1,KRR - PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * PRHODJ(:,:,:) -END DO -! -IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN - DO JSV = ISVBEG, ISVEND - PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) * PRHODJ(:,:,:) - ENDDO -ENDIF - -!------------------------------------------------------------------------------- -! -END SUBROUTINE RESOLVED_CLOUD diff --git a/src/PHYEX/ext/series_cloud_elec.f90 b/src/PHYEX/ext/series_cloud_elec.f90 deleted file mode 100644 index c740922db..000000000 --- a/src/PHYEX/ext/series_cloud_elec.f90 +++ /dev/null @@ -1,618 +0,0 @@ -!MNH_LIC Copyright 2010-2022 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ############################# - MODULE MODI_SERIES_CLOUD_ELEC -! ############################# -! -INTERFACE - SUBROUTINE SERIES_CLOUD_ELEC (KTCOUNT, PTSTEP, & - PZZ, PRHODJ, PRHODREF, PEXNREF, & - PRT, PRS, PSVT, & - PTHT, PWT, PPABST, PCIT, & - TPFILE_SERIES_CLOUD_ELEC, & - PINPRR ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter -! -REAL, INTENT(IN) :: PTSTEP ! Double time step except for cold start -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function -! -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Moist variables at time t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRS ! Moist variable sources -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Scalar variable at time t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWT ! Vertical velocity at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! ab. pressure at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine ice number - ! concentration at time t -TYPE(TFILEDATA), INTENT(IN) :: TPFILE_SERIES_CLOUD_ELEC -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip -! -END SUBROUTINE SERIES_CLOUD_ELEC -END INTERFACE -END MODULE MODI_SERIES_CLOUD_ELEC -! -! -! ############################################################### - SUBROUTINE SERIES_CLOUD_ELEC (KTCOUNT, PTSTEP, & - PZZ, PRHODJ, PRHODREF, PEXNREF, & - PRT, PRS, PSVT, & - PTHT, PWT, PPABST, PCIT, & - TPFILE_SERIES_CLOUD_ELEC, & - PINPRR ) -! ############################################################### -! -!!**** * - -!! -!! PURPOSE -!! ------- -!! -!! METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! C. Bovalo * LA * -!! -!! MODIFICATIONS -!! ------------- -!! Original : Avril 2010 -!! Modifications: -!! C. Barthe * LACy * Dec. 2010 add some parameters -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! Philippe Wautelet: 10/01/2019: use NEWUNIT argument of OPEN -!! Philippe Wautelet: 22/01/2019: use standard FLUSH statement instead of non standard intrinsics -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 -! -!------------------------------------------------------------------------------- -! -! 0. DECLARATIONS -! ------------ -! -USE MODD_CONF, ONLY: CEXP -USE MODD_CST -USE MODD_DYN_n, ONLY: XDXHATM, XDYHATM -USE MODD_ELEC_DESCR -USE MODD_ELEC_PARAM -USE MODD_IO, ONLY: TFILEDATA -USE MODD_NSV, ONLY: NSV_ELECBEG, NSV_ELECEND -USE MODD_PARAMETERS -USE MODD_RAIN_ICE_DESCR_n -USE MODD_RAIN_ICE_PARAM_n -USE MODD_REF - -USE MODI_MOMG -USE MODI_RADAR_RAIN_ICE - -USE MODE_ELEC_ll -USE MODE_ll -use mode_tools, only: Countjv - -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter -! -REAL, INTENT(IN) :: PTSTEP ! Double time step except for cold start -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function -! -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Moist variables at time t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRS ! Moist variable sources -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Scalar variable at time t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWT ! Vertical velocity at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! ab. pressure at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine ice number - ! concentration at time t -TYPE(TFILEDATA), INTENT(IN) :: TPFILE_SERIES_CLOUD_ELEC -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip -! -! -!* 0.2 Declarations of local variables : -! -INTEGER :: II, IJ, IK -INTEGER :: IIB,IIE ! Indices for the first and last inner mass point along x -INTEGER :: IJB,IJE ! Indices for the first and last inner mass point along y -INTEGER :: IKB,IKE ! Indices for the first and last inner mass point along z -INTEGER :: JCOUNT_STOP -INTEGER :: ICOUNT ! counter for iwp computation -INTEGER :: IPROC ! my proc number -INTEGER :: IPROC_MAX ! proc that contains max value -INTEGER :: IINFO_ll ! return code of parallel routine -INTEGER :: ILU ! unit number for IO -! -INTEGER, SAVE :: JCOUNT -! -INTEGER, DIMENSION(SIZE(PRT,1),SIZE(PRT,2)) :: IFLAG -! -REAL :: ZRHO00 ! Surface reference air density -REAL :: ZMASS_SP ! Precipitation snow mass (kg) -REAL :: ZMASS_GP ! Precipitation graupel mass (kg) -REAL :: ZFLUX_I ! Ice crystal mass flux (kg m/s) -REAL :: ZFLUX_SP ! Precipitation snow mass flux (kg m/s) -REAL :: ZFLUX_SNP ! Non precipitation snow mass flux (kg m/s) -REAL :: ZFLUX_G ! Graupel mass flux (kg m/s) -REAL :: ZCLD_TOP_REF ! Cloud top height (m) from radar refl. -REAL :: ZCLD_TOP_MR ! Cloud top height (m) from mixing ratio -REAL :: ZICE_MASS ! Ice mass (kg) -! -REAL, SAVE :: ZMASS_C ! Cloud water mass (kg) -REAL, SAVE :: ZMASS_R ! Rain water mass (kg) -REAL, SAVE :: ZMASS_I ! Ice crystal mass (kg) -REAL, SAVE :: ZMASS_S ! Snow mass (kg) -REAL, SAVE :: ZMASS_G ! Graupel mass (kg) -REAL, SAVE :: ZMASS_ICE_P ! Precipitation ice mass (kg) -REAL, SAVE :: ZFLUX_PROD ! Ice mass flux product (kg^2 m^2/s^2) -REAL, SAVE :: ZFLUX_PRECIP ! Precipitation ice mass flux (kg m/s) -REAL, SAVE :: ZFLUX_NPRECIP ! Non-precipitation ice mass flux (kg m/s) -REAL, SAVE :: ZVOL_UP5 ! Updraft volume for W > 5 m/s (m^3) -REAL, SAVE :: ZVOL_UP10 ! Updraft volume for W > 10 m/s (m^3) -REAL, SAVE :: ZWMAX ! Maximum vertical velocity (m/s) -REAL, SAVE :: ZVOL_G ! Graupel volume (m^3) -REAL, SAVE :: ZIWP ! Ice water path (kg/m^2) -REAL, SAVE :: ZCTH_MR ! Cloud top height / m.r. > 1.e-4 kg/kg (m) -REAL, SAVE :: ZCTH_REF ! Cloud top height / Z > 20 dBZ (m) -REAL, SAVE :: ZCLD_VOL ! Cloud volume (m^3) -REAL, SAVE :: ZDBZMAX ! Max radar reflectivity (dBZ) -REAL, SAVE :: ZINPRR ! Rain instant precip. (mm/H) -REAL, SAVE :: ZMAX_INPRR ! Maximum rain instant. precip. (mm/H) -! -REAL, DIMENSION(SIZE(XRTMIN)) :: ZRTMIN -! XRTMIN = Minimum value for the mixing ratio -! ZRTMIN = Minimum value for the source (tendency) -! -REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: & - ZTCT ! Temperature in Degrees Celsius -REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: & - ZWORK31, ZWORK32, ZWORK33, ZWORK34 -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCLOUD -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLAMBDAS -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLAMBDAG -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZVTS -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZVTG -! -LOGICAL, SAVE :: GFIRSTCALL = .TRUE. -! -! -!------------------------------------------------------------------------------- -! -!* 1. COMPUTE THE LOOP BOUNDS AND SOME PARAMETERS -! ------------------------------------------- -! -JCOUNT_STOP = INT(NTSAVE_SERIES/PTSTEP) -! -!* 1.1 beginning and end indexes of the physical subdomain -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB = 1 + JPVEXT -IKE = SIZE(PZZ,3) - JPVEXT -! -! -!* 1.2 compute some parameters -! -! temperature : K -> C -ZTCT(:,:,:) = (PTHT(:,:,:) * (PPABST(:,:,:) / XP00)**(XRD/XCPD)) - XTT -! -! total mixing ratio -ALLOCATE(ZCLOUD(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) -ZCLOUD(:,:,:) = 0. -ZCLOUD(IIB:IIE,IJB:IJE,IKB:IKE) = PRT(IIB:IIE,IJB:IJE,IKB:IKE,2) + & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,3) + & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,4) + & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,5) + & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,6) -! -! -!* 1.3 compute the terminal fall speed -! -! the mean terminal fall speed is computed following: -! V_mean = Int(v(D) n(D) dD) / Int(n(D) dD) -! -ALLOCATE(ZLAMBDAS(SIZE(PRT,1), SIZE(PRT,2), SIZE(PRT,3))) -ALLOCATE(ZLAMBDAG(SIZE(PRT,1), SIZE(PRT,2), SIZE(PRT,3))) -ALLOCATE(ZVTS(SIZE(PRT,1), SIZE(PRT,2), SIZE(PRT,3))) -ALLOCATE(ZVTG(SIZE(PRT,1), SIZE(PRT,2), SIZE(PRT,3))) -! -ZLAMBDAS(:,:,:) = 0. -ZLAMBDAG(:,:,:) = 0. -ZVTS(:,:,:) = 0. -ZVTG(:,:,:) = 0. -! -! Surface reference air density -ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB)) -! -! for snow -WHERE (PRT(:,:,:,5) .GT. 1.E-12) - ZLAMBDAS(:,:,:) = MIN(XLBDAS_MAX, & - XLBS * (PRHODREF(:,:,:) * & - MAX(PRT(:,:,:,5), XRTMIN(5)))**XLBEXS) - ZVTS(:,:,:) = XCS * MOMG(XALPHAS, XNUS, XBS+XDS) * ZLAMBDAS(:,:,:)**(-XDS) * & - (ZRHO00 / PRHODREF(:,:,:))**XCEXVT / MOMG(XALPHAS, XNUS, XBS) -ELSEWHERE - ZLAMBDAS(:,:,:) = 0. - ZVTS(:,:,:) = 0. -END WHERE -! -! for graupel -WHERE(PRT(:,:,:,6) .GT. 1.E-12) - ZLAMBDAG(:,:,:) = XLBG * (PRHODREF(:,:,:) * & - MAX(PRT(:,:,:,6), XRTMIN(6)))**XLBEXG - ZVTG(:,:,:) = XCG * MOMG(XALPHAG, XNUG, XBG+XDG) * ZLAMBDAG(:,:,:)**(-XDG) * & - (ZRHO00 / PRHODREF(:,:,:))**XCEXVT / MOMG(XALPHAG, XNUG, XBG) -ELSEWHERE - ZLAMBDAG(:,:,:) = 0. - ZVTG(:,:,:) = 0. -END WHERE -! -DEALLOCATE(ZLAMBDAS) -DEALLOCATE(ZLAMBDAG) -! -! -!------------------------------------------------------------------------------- -! -!* 2. INITIALIZE THE VARIABLES -! ------------------------ -! -IF (GFIRSTCALL) THEN - GFIRSTCALL = .FALSE. -! - JCOUNT = 0 - ZMASS_C = 0. - ZMASS_R = 0. - ZMASS_I = 0. - ZMASS_S = 0. - ZMASS_G = 0. - ZMASS_ICE_P = 0. - ZFLUX_PROD = 0. - ZFLUX_PRECIP = 0. - ZFLUX_NPRECIP = 0. - ZVOL_UP5 = 0. - ZVOL_UP10 = 0. - ZVOL_G = 0. - ZWMAX = 0. - ZDBZMAX = 0. - ZCTH_REF = 0. - ZCTH_MR = 0. - ZCLD_VOL = 0. - ZINPRR = 0. - ZMAX_INPRR = 0. -END IF -! -ZICE_MASS = 0. -ZMASS_SP = 0. -ZMASS_GP = 0. -ZFLUX_I = 0. -ZFLUX_SP = 0. -ZFLUX_SNP = 0. -ZFLUX_G = 0. -ZCLD_TOP_REF = 0. -ZCLD_TOP_MR = 0. -! -!------------------------------------------------------------------------------- -! -!* 3. COMPUTE THE DYNAMICAL AND MICROPHYSICAL PARAMETERS -! -------------------------------------------------- -! -JCOUNT = JCOUNT + 1 -! -!* 3.1 compute the maximum vertical velocity -! -ZWMAX = ZWMAX + MAXVAL(PWT(IIB:IIE,IJB:IJE,IKB:IKE)) -! -! -!* 3.2 compute the maximum radar reflectivity -! -CALL RADAR_RAIN_ICE (PRT, PCIT, PRHODREF, ZTCT, & - ZWORK31, ZWORK32, ZWORK33, ZWORK34) -! -ZDBZMAX = ZDBZMAX + MAXVAL(ZWORK31(IIB:IIE,IJB:IJE,IKB:IKE)) -! -! -!* 3.3 compute the mass of the different microphysical species -! -ZMASS_C = ZMASS_C + SUM(PRT(IIB:IIE,IJB:IJE,IKB:IKE,2) * & - PRHODJ(IIB:IIE,IJB:IJE,IKB:IKE)) -! -ZMASS_R = ZMASS_R + SUM(PRT(IIB:IIE,IJB:IJE,IKB:IKE,3) * & - PRHODJ(IIB:IIE,IJB:IJE,IKB:IKE)) -! -ZMASS_I = ZMASS_I + SUM(PRT(IIB:IIE,IJB:IJE,IKB:IKE,4) * & - PRHODJ(IIB:IIE,IJB:IJE,IKB:IKE)) -! -ZMASS_S = ZMASS_S + SUM(PRT(IIB:IIE,IJB:IJE,IKB:IKE,5) * & - PRHODJ(IIB:IIE,IJB:IJE,IKB:IKE)) -! -ZMASS_G = ZMASS_G + SUM(PRT(IIB:IIE,IJB:IJE,IKB:IKE,6) * & - PRHODJ(IIB:IIE,IJB:IJE,IKB:IKE)) -! -! -!* 3.4 compute the ice mass fluxes -! -!* 3.4.1 non-precipitation ice mass flux -! -IFLAG(:,:) = 0 -ICOUNT = 0 -! -DO II = IIB, IIE - DO IJ = IJB, IJE - DO IK = IKB, IKE -! -!* 3.4.1 non-precipitation ice crystal mass flux -! - IF (ZTCT(II,IJ,IK) .LT. 0. .AND. PWT(II,IJ,IK) .GT. 0.) THEN - ZFLUX_I = ZFLUX_I + & - PWT(II,IJ,IK) * PRT(II,IJ,IK,4) * PRHODJ(II,IJ,IK) - END IF -! -!* 3.4.2 non-precipitation snow mass flux -! - IF (ZTCT(II,IJ,IK) .LT. 0. .AND. PWT(II,IJ,IK) .GT. ZVTS(II,IJ,IK)) THEN - ZFLUX_SNP = ZFLUX_SNP + & - (PWT(II,IJ,IK) - ZVTS(II,IJ,IK)) * PRT(II,IJ,IK,5) * & - PRHODJ(II,IJ,IK) - END IF -! -!* 3.4.3 precipitation snow mass flux -! - IF (ZTCT(II,IJ,IK) .LT. 0. .AND. PWT(II,IJ,IK) .LT. ZVTS(II,IJ,IK)) THEN - ZMASS_SP = ZMASS_SP + PRT(II,IJ,IK,5) * PRHODJ(II,IJ,IK) - ZFLUX_SP = ZFLUX_SP + & - (PWT(II,IJ,IK) - ZVTS(II,IJ,IK)) * PRT(II,IJ,IK,5) * & - PRHODJ(II,IJ,IK) - END IF -! -!* 3.4.4 precipitation graupel mass flux -! - IF (ZTCT(II,IJ,IK) .LT. 0. .AND. PWT(II,IJ,IK) .LT. ZVTG(II,IJ,IK)) THEN - ZMASS_GP = ZMASS_GP + PRT(II,IJ,IK,6) * PRHODJ(II,IJ,IK) - ZFLUX_G = ZFLUX_G + & - (PWT(II,IJ,IK) - ZVTG(II,IJ,IK)) * PRT(II,IJ,IK,6) * & - PRHODJ(II,IJ,IK) - END IF -! -! -!* 3.5 compute the updraft volume -! -! Updraft volume for W > 5 m/s - IF (ZTCT(II,IJ,IK) .LT. -5. .AND. PWT(II,IJ,IK) .GT. 5.) THEN - ZVOL_UP5 = ZVOL_UP5 + XDXHATM * XDYHATM * & - (PZZ(II,IJ,IK+1) - PZZ(II,IJ,IK-1)) / 2. - END IF -! -! Updraft volume for W > 10 m/s - IF (ZTCT(II,IJ,IK) .LT. -5. .AND. PWT(II,IJ,IK) .GT. 10.) THEN - ZVOL_UP10 = ZVOL_UP10 + XDXHATM * XDYHATM * & - (PZZ(II,IJ,IK+1) - PZZ(II,IJ,IK-1)) / 2. - END IF -! -! -!* 3.6 total ice mass -! - IF (ZTCT(II,IJ,IK) .LT. -10. .AND. ZWORK31(II,IJ,IK) .GT. 18.) THEN - ZICE_MASS = ZICE_MASS + (PRT(II,IJ,IK,4) + PRT(II,IJ,IK,5) + PRT(II,IJ,IK,6)) * & - PRHODJ(II,IJ,IK) - IFLAG(II,IJ) = IFLAG(II,IJ) + 1 - END IF - END DO ! end loop ik -! - IF (IFLAG(II,IJ) .GE. 1) THEN - ICOUNT = ICOUNT + 1 - END IF - END DO ! end loop ij -END DO ! end loop ii -! -DEALLOCATE(ZVTS) -DEALLOCATE(ZVTG) -! -! -!* 3.7 precipitation and non precipitation ice mass flux product -! -IF (ZFLUX_G .LT. 0. .AND. ZFLUX_I .GT. 0.) THEN - ZFLUX_PROD = ZFLUX_PROD - (ZFLUX_I + ZFLUX_SNP) * (ZFLUX_G + ZFLUX_SP) -END IF -! -! precipitation ice mass flux -IF ((ZFLUX_G+ZFLUX_SP) .LT. 0.) THEN - ZFLUX_PRECIP = ZFLUX_PRECIP - (ZFLUX_G + ZFLUX_SP) -END IF -! -! non-precipitation ice mass flux -IF ((ZFLUX_I+ZFLUX_SNP) .GT. 0.) THEN - ZFLUX_NPRECIP = ZFLUX_NPRECIP + (ZFLUX_I + ZFLUX_SNP) -END IF -! -! -!* 3.8 compute the precipitation ice mass -! -IF ((ZMASS_GP .GT. 0.) .OR. (ZMASS_SP .GT. 0.)) THEN - ZMASS_ICE_P = ZMASS_ICE_P + ZMASS_GP + ZMASS_SP -END IF -! -! -!* 3.9 compute the ice water path -! -CALL SUM_ELEC_ll(ZICE_MASS) -CALL SUM_ELEC_ll(ICOUNT) -! -IF (ICOUNT .GT. 0) THEN - ZIWP = ZIWP + ZICE_MASS / (REAL(ICOUNT) * XDXHATM * XDYHATM) -END IF -! -! -!* 3.10 compute the cloud top height -! -DO II = IIB, IIE - DO IJ = IJB, IJE - DO IK = IKB, IKE -! maximum height of the 20 dBZ echo - IF (ZWORK31(II,IJ,IK) .GT. 20. .AND. PZZ(II,IJ,IK) .GT. ZCLD_TOP_REF) THEN - ZCLD_TOP_REF = PZZ(II,IJ,IK) - END IF -! -! maximum height with mixing ratio > 1.e-4 - IF (ZCLOUD(II,IJ,IK) .GT. 1.E-4 .AND. PZZ(II,IJ,IK) .GT. ZCLD_TOP_REF) THEN - ZCLD_TOP_MR = PZZ(II,IJ,IK) - END IF -! -! -!* 3.11 compute the cloud volume -! - IF (ZCLOUD(II,IJ,IK) .GT. 1.E-4) THEN - ZCLD_VOL = ZCLD_VOL + XDXHATM * XDYHATM * & - (PZZ(II,IJ,IK+1) - PZZ(II,IJ,IK-1)) / 2. - END IF -! - END DO - END DO -END DO -! -DEALLOCATE(ZCLOUD) -! -ZCTH_MR = ZCTH_MR + ZCLD_TOP_MR -ZCTH_REF = ZCTH_REF + ZCLD_TOP_REF -! -! -!* 3.12 compute the instantaneous precipitation rate -! -ZMAX_INPRR = ZMAX_INPRR + MAXVAL(PINPRR(IIB:IIE,IJB:IJE)) -ZINPRR = ZINPRR + SUM(PINPRR(IIB:IIE,IJB:IJE)) -! -!------------------------------------------------------------------------------- -! -!* 4. FROM LOCAL TO GLOBAL VARIABLES -! ------------------------------ -! -CALL MAX_ELEC_ll (ZCTH_REF, IPROC_MAX) -CALL MAX_ELEC_ll (ZCTH_MR, IPROC_MAX) -CALL MAX_ELEC_ll (ZDBZMAX, IPROC_MAX) -CALL MAX_ELEC_ll (ZMAX_INPRR,IPROC_MAX) -CALL MAX_ELEC_ll (ZWMAX, IPROC_MAX) -! -! -!------------------------------------------------------------------------------- -! -!* 5. SAVE THE DATA IN AN ASCII FILE -! ------------------------------ -! -CALL MYPROC_ELEC_ll(IPROC) -! -IF (JCOUNT == JCOUNT_STOP) THEN -! - ZINPRR = ZINPRR * 3.6E6 ! m/s --> mm/H - ZMAX_INPRR = ZMAX_INPRR * 3.6E6 ! m/s --> mm/H -! - CALL REDUCESUM_ll (ZVOL_UP5, IINFO_ll) - CALL REDUCESUM_ll (ZVOL_UP10, IINFO_ll) - CALL REDUCESUM_ll (ZMASS_C, IINFO_ll) - CALL REDUCESUM_ll (ZMASS_R, IINFO_ll) - CALL REDUCESUM_ll (ZMASS_I, IINFO_ll) - CALL REDUCESUM_ll (ZMASS_S, IINFO_ll) - CALL REDUCESUM_ll (ZMASS_G, IINFO_ll) - CALL REDUCESUM_ll (ZMASS_ICE_P, IINFO_ll) - CALL REDUCESUM_ll (ZFLUX_PROD, IINFO_ll) - CALL REDUCESUM_ll (ZFLUX_PRECIP, IINFO_ll) - CALL REDUCESUM_ll (ZFLUX_NPRECIP, IINFO_ll) - CALL REDUCESUM_ll (ZCLD_VOL, IINFO_ll) - CALL REDUCESUM_ll (ZINPRR, IINFO_ll) -! - IF (IPROC == 0) THEN - ILU = TPFILE_SERIES_CLOUD_ELEC%NLU - WRITE (ILU, FMT='(I6,19(E12.4))') & - INT(KTCOUNT*PTSTEP), & ! time - ZCTH_REF/REAL(JCOUNT), & ! cloud top height from Z - ZCTH_MR/REAL(JCOUNT), & ! cloud top height from m.r. - ZDBZMAX/REAL(JCOUNT), & ! maximum radar reflectivity - ZWMAX/REAL(JCOUNT), & ! maximum vertical velocity - ZVOL_UP5/REAL(JCOUNT), & ! updraft volume for W > 5 m/s - ZVOL_UP10/REAL(JCOUNT), & ! updraft volume for W > 10 m/s - ZMASS_C/REAL(JCOUNT), & ! cloud droplets mass - ZMASS_R/REAL(JCOUNT), & ! rain mass - ZMASS_I/REAL(JCOUNT), & ! ice crystal mass - ZMASS_S/REAL(JCOUNT), & ! snow mass - ZMASS_G/REAL(JCOUNT), & ! graupel mass - ZMASS_ICE_P/REAL(JCOUNT), & ! precipitation ice mass - ZFLUX_PROD/REAL(JCOUNT), & ! ice mass flux product - ZFLUX_PRECIP/REAL(JCOUNT), & ! precipitation ice mass flux - ZFLUX_NPRECIP/REAL(JCOUNT), & ! non-precipitation ice mass flux - ZIWP/REAL(JCOUNT), & ! ice water path - ZCLD_VOL/REAL(JCOUNT), & ! cloud volume - ZINPRR/REAL(JCOUNT), & ! Rain instant precip - ZMAX_INPRR/REAL(JCOUNT) ! maximum rain instant. precip. - FLUSH(UNIT=ILU) - END IF -! - JCOUNT = 0 - ZMASS_C = 0. - ZMASS_R = 0. - ZMASS_I = 0. - ZMASS_S = 0. - ZMASS_G = 0. - ZMASS_ICE_P = 0. - ZFLUX_PROD = 0. - ZFLUX_PRECIP = 0. - ZFLUX_NPRECIP = 0. - ZVOL_UP5 = 0. - ZVOL_UP10 = 0. - ZWMAX = 0. - ZDBZMAX = 0. - ZCTH_REF = 0. - ZCTH_MR = 0. - ZIWP = 0. - ZCLD_VOL = 0. - ZINPRR = 0. - ZMAX_INPRR = 0. -END IF -! -!------------------------------------------------------------------------------- -! -CONTAINS -! -!------------------------------------------------------------------------------- -! ############################################## - FUNCTION MOMG0D(PALPHA, PNU, PP) RESULT(PMOMG) -! ############################################## -! -USE MODI_GAMMA -! -IMPLICIT NONE -! -REAL, INTENT(IN) :: PALPHA, PNU -REAL, INTENT(IN) :: PP -REAL :: PMOMG -! -! -PMOMG = GAMMA(PNU+PP/PALPHA) / GAMMA(PNU) -! -END FUNCTION MOMG0D -! -!------------------------------------------------------------------------------- - -! -END SUBROUTINE SERIES_CLOUD_ELEC diff --git a/src/PHYEX/ext/set_conc_ice_c1r3.f90 b/src/PHYEX/ext/set_conc_ice_c1r3.f90 deleted file mode 100644 index 0dfe34119..000000000 --- a/src/PHYEX/ext/set_conc_ice_c1r3.f90 +++ /dev/null @@ -1,129 +0,0 @@ -!MNH_LIC Copyright 2001-2018 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ############################# - MODULE MODI_SET_CONC_ICE_C1R3 -! ############################# -! -INTERFACE -! - SUBROUTINE SET_CONC_ICE_C1R3 (PRHODREF,PRT,PSVT) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT ! microphysical mixing ratios -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! microphys. concentrations -! -! -END SUBROUTINE SET_CONC_ICE_C1R3 -! -END INTERFACE -! -END MODULE MODI_SET_CONC_ICE_C1R3 -! -! ########################################################## - SUBROUTINE SET_CONC_ICE_C1R3 (PRHODREF,PRT,PSVT) -! ########################################################## -! -!!**** *SET_CONC_ICE_C1R3 * - initialize the ice crystal -!! concentration for a RESTArt simulation of the C1R3 scheme -!! -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to initialize the pristine ice crystal -!! concentrations when the cloud ice mixing ratios are only available. -!! This routine is used to initialize the small ice crystal concentrations -!! using the r_i of a previous ICE3 run but also to compute the LB tendencies -!! in ONE_WAY$n in case of grid-nesting when the optional argument PTIME is -!! set (a C3R5 run embedded in a ICE3 run). -!! -!!** METHOD -!! ------ -!! The method uses the contact nucleation formulation of Meyers as a rough -!! estimate (a function of the temperature). A limiting value of XCONCI_MAX -!! is also assumed in the case of very cold temperatures -!! -!! EXTERNAL -!! -------- -!! None -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_ICE_C1R3_DESCR, ONLY : XRTMIN, XCTMIN -!! Module MODD_ICE_C1R3_PARAM, ONLY : XCONCI_INI -!! Module MODD_CONF, ONLY : NVERB -!! -!! REFERENCE -!! --------- -!! Book2 of documentation ( routine SET_CONC_ICE_C1R3 ) -!! -!! AUTHOR -!! ------ -!! J.-P. Pinty * Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/04/01 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY : XRHOLI -USE MODD_CONF, ONLY : NVERB -USE MODD_ICE_C1R3_DESCR, ONLY : XRTMIN, XCTMIN -USE MODD_ICE_C1R3_PARAM, ONLY : XCONCI_MAX, XNUC_CON, XEXTT_CON, XEX_CON -USE MODD_LUNIT_n, ONLY : TLUOUT -USE MODD_RAIN_ICE_DESCR_n, ONLY : XAI, XBI -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT ! microphysical mixing ratios -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! microphys. concentrations -! -!* 0.2 Declarations of local variables : -! -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: ILUOUT ! Logical unit number of output-listing -! -! -!------------------------------------------------------------------------------- -!* 1. RETRIEVE LOGICAL UNIT NUMBER -! ---------------------------- -! -ILUOUT = TLUOUT%NLU -! -!* 2. INITIALIZATION -! -------------- -! -! Assume the ice crystal concentration according to the -! contact nucleation formulation of Meyers et al. (1992) -! -WHERE ( PRT(:,:,:,4) > XRTMIN(4) ) - PSVT(:,:,:,4) = MIN( PRHODREF(:,:,:) / & - ( XRHOLI * XAI*(10.E-06)**XBI * PRT(:,:,:,4) ), & - XCONCI_MAX ) - PSVT(:,:,:,5) = 0.0 -END WHERE -WHERE ( PRT(:,:,:,4) <= XRTMIN(4) ) - PRT(:,:,:,4) = 0.0 - PSVT(:,:,:,4) = 0.0 - PSVT(:,:,:,5) = 0.0 -END WHERE -IF( NVERB >= 5 ) THEN - WRITE (UNIT=ILUOUT,FMT=*) "!INI_MODEL$n: The cloud ice concentration has " - WRITE (UNIT=ILUOUT,FMT=*) "been roughly initialised to a value of 1 per liter" -END IF -! -END SUBROUTINE SET_CONC_ICE_C1R3 diff --git a/src/PHYEX/ext/set_msk.f90 b/src/PHYEX/ext/set_msk.f90 deleted file mode 100644 index ba4da88bf..000000000 --- a/src/PHYEX/ext/set_msk.f90 +++ /dev/null @@ -1,286 +0,0 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ######spl - MODULE MODI_SET_MSK -!#################### -! -INTERFACE -! -SUBROUTINE SET_MSK(PRT,PRHODREF,OBU_MSK) -! -REAL , DIMENSION (:,:,:,:),INTENT(IN) :: PRT -REAL , DIMENSION (:,:,:),INTENT(IN) :: PRHODREF -LOGICAL , DIMENSION (:,:,:),INTENT(OUT) :: OBU_MSK -! -END SUBROUTINE SET_MSK -! -END INTERFACE -! -END MODULE MODI_SET_MSK -! -! ######spl - SUBROUTINE SET_MSK(PRT,PRHODREF,OBU_MSK) -! ############################### -! -!!****SET_MSK** -routine to define the mask based on SET_MASK -!! -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to test the occurence or not of the -! different criteria, used to compute the budgets. It also updates the -! number of occurence of the different criteria. -! -!!** METHOD -!! ------ -!! According to each criterion associated to one zone, the mask is -!! set to TRUE at each point where the criterion is confirmed, at each -!! time step of the model. -!! -!! -!! EXTERNAL -!! -------- -!! NONE -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! Book2 of MESO-NH documentation (routine BUDGET) -!! -!! -!! AUTHOR -!! ------ -!! J. Nicolau * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 27/02/95 -!! T.Montmerle 15/07/96 Computation of masks for convective and stratiform parts -!! Biju Thomas 29/03/99 Identified nonprecipitating convective cells and only -!! precipitating anvils as stratiform part -!! O. Caumont 09/04/08 Use in RADAR_SIMULATOR -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_FIELD_n -USE MODD_RAIN_ICE_PARAM_n , ONLY : XFSEDR,XEXSEDR -USE MODD_RAIN_ICE_DESCR_n , ONLY : XCEXVT -USE MODD_CST , ONLY : XRHOLW -USE MODD_PARAMETERS -USE MODD_CONF -USE MODE_ll -USE MODD_LUNIT, ONLY : TLUOUT0 -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -! -! -IMPLICIT NONE -! -! -!* 0.1 Declarations of arguments : -! -REAL , DIMENSION (:,:,:,:),INTENT(IN) :: PRT -REAL , DIMENSION (:,:,:),INTENT(IN) :: PRHODREF -LOGICAL , DIMENSION (:,:,:),INTENT(OUT) :: OBU_MSK -! -!* 0.2 Declarations of local variables : -! -INTEGER :: IIB,IJB ! Lower bounds and Upper bounds -INTEGER :: IIE,IJE ! of the physical sub-domain -INTEGER :: IKB,IKE ! in x, y and z directions -INTEGER :: IIU,IJU!,IKU -! -REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZMASK ! signature de l'insertion - ! dans un masque (0 ou 1.) -REAL,DIMENSION(:,:), ALLOCATABLE :: ZCONVECT ! signature du domaine convectif -REAL,DIMENSION(:,:), ALLOCATABLE :: ZSURFPP ! precipitation au sol -REAL,DIMENSION(:,:), ALLOCATABLE :: ZMAXWATER ! teneur maximale en eau - ! recensee sur la verticale -REAL,DIMENSION(:,:), ALLOCATABLE :: ZMIMX,ZMIPX ! I,I+1 and I,I-1 precipitation sums -REAL,DIMENSION(:,:), ALLOCATABLE :: ZMEANX_MY,ZMEANX_PY ! J,J+1 and J,J-1 precipitation sums -REAL,DIMENSION(:,:), ALLOCATABLE :: ZMEANX, ZMEANXY -REAL :: ZAVER_PR,ZREPSILON,ZTOTWATER,ZREPSILON1 -REAL :: ZCRS,ZCEXRS,ZCEXVT,ZREPSILON2,ZREPSILON3 -INTEGER :: I,J,JILOOP,JJLOOP,JKLOOP -INTEGER :: ILUOUT0 -INTEGER :: IRESP -INTEGER :: IBUIL,IBUJL,IBUIH,IBUJH -!INTEGER :: IBUSIL,IBUSJL,IBUSIH,IBUSJH -!INTEGER :: IINFO_ll ! return code of parallel routine -!TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange -!------------------------------------------------------------------------------- -! -ILUOUT0 = TLUOUT0%NLU -! -!* 1. COMPUTES THE PHYSICAL SUBDOMAIN BOUNDS -! --------------------------------------- -! -IKB = 1 + JPVEXT -IKE = SIZE(PRT,3) - JPVEXT -IIU = SIZE(PRT,1) -IJU = SIZE(PRT,2) -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -! ---------------------- -ALLOCATE( ZMASK(IIU,IJU,4) ) -ALLOCATE( ZSURFPP(IIU,IJU) ) -ALLOCATE(ZMIMX(IIU,IJU),ZMIPX(IIU,IJU),ZMEANX(IIU,IJU)) -ALLOCATE(ZMEANX_MY(IIU,IJU),ZMEANX_PY(IIU,IJU),ZMEANXY(IIU,IJU)) -ALLOCATE( ZCONVECT(IIU,IJU) ) -ALLOCATE( ZMAXWATER(IIU,IJU) ) -! -!* 2. DEFINITION OF THE MASK -! ---------------------- -! initialization to FALSE on the extended subdomain -OBU_MSK(:,:,:)=.FALSE. -ZMASK(:,:,:)=0. -ZSURFPP(:,:)=0. -ZCONVECT(:,:)=0. -ZMAXWATER(:,:)=0. -ZREPSILON=5.E-6 -ZREPSILON1=5.E-4 -ZREPSILON2=5.0 -ZREPSILON3=5.E-6 -ZAVER_PR=0. - -!********************************************************************** -! CAUTION: Definition of parameters -! depends on the model configuration WARM or COLD -! ----------------------------------------------- - -!********************************************************************** -!partie a activer pour le cas chaud, en activant USE MODD_CLOUDPAR et en -!desactivant USE MODD_RAIN_ICE_PARAM et USE MODD_RAIN_ICE_DESCR qui servent -!au cas froid. En activant tout, XCEXVT est defini deux fois, donc une fois -!de trop. -!********************************************************************** -!IF (CCLOUD == 'REVE' .OR. CCLOUD == 'KESS' .OR. CCLOUD == 'KES2') THEN -! ZCRS=XCRS -! ZCEXRS=XCEXRS -! ZCEXVT=XCEXVT -!ELSE IF (CCLOUD == 'ICE3') THEN -!********************************************************************** - - ZCRS=XFSEDR - ZCEXRS=XEXSEDR - ZCEXVT=XCEXVT -!END IF - -! Total solid and liquid water (qr+qc+qs+qi+qg) (= cloudy area) -! ------------------------------------------------------------- - -DO JKLOOP=IKB,IKE - DO JJLOOP=IJB,IJE - DO JILOOP=IIB,IIE - ZTOTWATER = PRT(JILOOP,JJLOOP,JKLOOP,2) & - +PRT(JILOOP,JJLOOP,JKLOOP,3) & - +PRT(JILOOP,JJLOOP,JKLOOP,4) & - +PRT(JILOOP,JJLOOP,JKLOOP,5) & - +PRT(JILOOP,JJLOOP,JKLOOP,6) - ZMAXWATER(JILOOP,JJLOOP)=MAX(ZMAXWATER(JILOOP,JJLOOP),ZTOTWATER) - END DO - END DO -END DO - -! Computation of ground precipitation -! ----------------------------------- - -! Precipitation (mm/h) -ZSURFPP(IIB:IIE,IJB:IJE)=ZCRS*PRT(IIB:IIE,IJB:IJE,IKB,3)**ZCEXRS & - *PRHODREF(IIB:IIE,IJB:IJE,IKB)**(ZCEXRS-ZCEXVT)*3.6E6/XRHOLW - -! Lateral Boundaries for Precipitation -! (cyclic case in Y-direction, OPEN in X-direction) - ZSURFPP(1,IJB:IJE)=ZSURFPP(IIB,IJB:IJE) - ZSURFPP(IIU,IJB:IJE)=ZSURFPP(IIE,IJB:IJE) - ZSURFPP(1:IIU,1)=ZSURFPP(1:IIU,IJB) - ZSURFPP(1:IIU,IJU)=ZSURFPP(1:IIU,IJE) - -! -! Predefinition of the Convective region criteria -! ------------------------------------------------ -ZMIPX(:,:)=0. -ZMIMX(:,:)=0. -ZMEANX(:,:)=0. -! -ZMIPX(1:IIU-1,:)=ZSURFPP(1:IIU-1,:)+ZSURFPP(2:IIU,:) -ZMIMX(2:IIU,:)=ZSURFPP(2:IIU,:)+ZSURFPP(1:IIU-1,:) - -DO J=IJB+1,IJE-1 - DO I=3,IIE-1 - ZAVER_PR=(SUM(ZSURFPP(I-2:I+2,J-2:J+2))-ZSURFPP(I,J))/24. - -! threshold at 4 mm/h - IF(ZSURFPP(I,J) >= MAX(4.,2.*ZAVER_PR) & - .AND.(ZMAXWATER(I,J) >= ZREPSILON)) ZCONVECT(I-1:I+1,J-1:J+1)=1. - IF(ZSURFPP(I,J) >= 20.) ZCONVECT(I,J)=1. - IF(ZMAXWATER(I,J) >= ZREPSILON)THEN - DO JKLOOP=2,IKE - IF(PRT(I,J,JKLOOP,2) >= ZREPSILON1) ZCONVECT(I,J)=1. - IF(XWT(I,J,JKLOOP) >= ZREPSILON2) ZCONVECT(I,J)=1. - END DO - END IF - END DO -END DO - -!------------------------------------------ -!* MASK Definition -!------------------------------------------ -IBUIL=IIB+1 -IBUIH = IIE-1 -IBUJL = IJB+1 -IBUJH = IJE-1 -DO JILOOP=IBUIL,IBUIH - DO JJLOOP=IBUJL,IBUJH -!------------------------------------------ -!* Zone 1: Convective Zone -!------------------------------------------ - ZMASK(JILOOP,JJLOOP,1)=ZCONVECT(JILOOP,JJLOOP) -!------------------------------------------ -!* Zone 2: Stratiforme Zone -!------------------------------------------ - IF (ZMAXWATER(JILOOP,JJLOOP) >= 10.*ZREPSILON.AND.ZMASK(JILOOP,JJLOOP,1)/=1.) THEN - DO JKLOOP=IKB,IKE - IF(PRT(JILOOP,JJLOOP,JKLOOP,3) >= ZREPSILON3) ZMASK(JILOOP,JJLOOP,2)=1. - END DO - END IF -!------------------------------------------ -!* Zone 3: Clear air Zone -!------------------------------------------ - IF (ZMASK(JILOOP,JJLOOP,1)/=1. .AND. ZMASK(JILOOP,JJLOOP,2)/=1.) ZMASK(JILOOP,JJLOOP,3)=1. -!------------------------------------------ -!* Zone 4: Total Domain -!------------------------------------------ - ZMASK(JILOOP,JJLOOP,4)=1. - - END DO -END DO -! -!----------------------------------------------------------------------- -! - -OBU_MSK(IIB:IIE,IJB:IJE,:)=ZMASK(IIB:IIE,IJB:IJE,:)>0.8 - - -! -!* 2. INCREASE IN SURFACE ARRAY -! ------------------------- -! -DEALLOCATE( ZMASK ) -DEALLOCATE( ZCONVECT ) -DEALLOCATE( ZSURFPP ) -DEALLOCATE( ZMAXWATER ) -DEALLOCATE(ZMIMX,ZMIPX,ZMEANX) -DEALLOCATE(ZMEANX_MY,ZMEANX_PY,ZMEANXY) -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE SET_MSK diff --git a/src/PHYEX/ext/set_rsou.f90 b/src/PHYEX/ext/set_rsou.f90 deleted file mode 100644 index 6c2ea6b2f..000000000 --- a/src/PHYEX/ext/set_rsou.f90 +++ /dev/null @@ -1,1640 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! #################### - MODULE MODI_SET_RSOU -! #################### -! -INTERFACE -! - SUBROUTINE SET_RSOU(TPFILE,TPEXPREFILE,HFUNU,HFUNV,KILOC,KJLOC,OBOUSS,& - PJ,OSHIFT,PCORIOZ) -! -USE MODD_IO, ONLY : TFILEDATA -! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! outpput data file -TYPE(TFILEDATA), INTENT(IN) :: TPEXPREFILE ! input data file -CHARACTER(LEN=*), INTENT(IN) :: HFUNU ! type of variation of U - ! in y direction -CHARACTER(LEN=*), INTENT(IN) :: HFUNV ! type of variation of V - ! in x direction -INTEGER, INTENT(IN) :: KILOC ! I Localisation of vertical profile -INTEGER, INTENT(IN) :: KJLOC ! J Localisation of vertical profile -LOGICAL, INTENT(IN) :: OBOUSS ! logical switch for Boussinesq version -REAL, DIMENSION(:,:,:), INTENT(IN) :: PJ ! jacobien -LOGICAL, INTENT(IN) :: OSHIFT ! logical switch for vertical shift -! -REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCORIOZ ! Coriolis parameter - ! (exceptionnaly 3D array) -! -END SUBROUTINE SET_RSOU -! -END INTERFACE -! -END MODULE MODI_SET_RSOU -! -! ######################################################################## - SUBROUTINE SET_RSOU(TPFILE,TPEXPREFILE,HFUNU,HFUNV,KILOC,KJLOC,OBOUSS, & - PJ,OSHIFT,PCORIOZ) -! ######################################################################## -! -!!**** *SET_RSOU * - to initialize mass fiels from a radiosounding -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to initialize the mass field (theta,r, -! thetavrefz,rhorefz) on model grid from a radiosounding located at point -! (KILOC,KJLOC). -! -! The free-formatted part of EXPRE file contains the radiosounding data.The data -! are stored in following order : -! -! - year,month,day, time (these variables are read in PREINIT program) -! - kind of data in EXPRE file (see below for more explanations about -! YKIND) -! - ZGROUND -! - PGROUND -! - temperature variable at ground ( depending on the data Kind ) -! - moist variable at ground ( depending on the data Kind ) -! - number of wind data levels ( variable ILEVELU) -! - height , dd , ff | -! or or | ILEVELU times -! pressure, U , V | -! - number of mass levels ( variable ILEVELM), including the ground -! level -! - height , T , Td | -! or or or | (ILEVELM-1) times -! pressure, THeta_Dry , Mixing Ratio | -! or or | -! THeta_V , relative HUmidity| -! -! NB : the first mass level is at ground -! -! The following kind of data is permitted : -! YKIND = 'STANDARD' : ZGROUND, PGROUND, TGROUND, TDGROUND -! (Pressure, dd, ff) , -! (Pressure, T, Td) -! YKIND = 'PUVTHVMR' : zGROUND, PGROUND, ThvGROUND, RGROUND -! (Pressure, U, V) , -! (Pressure, THv, R) -! YKIND = 'PUVTHVHU' : zGROUND, PGROUND, ThvGROUND, HuGROUND -! (Pressure, U, V) , -! (Pressure, THv, Hu) -! YKIND = 'ZUVTHVHU' : zGROUND, PGROUND, ThvGROUND, HuGROUND -! (height, U, V) , -! (height, THv, Hu) -! YKIND = 'ZUVTHVMR' : zGROUND, PGROUND, ThvGROUND, RGROUND -! (height, U, V) , -! (height, THv, R) -! YKIND = 'PUVTHDMR' : zGROUND, PGROUND, ThdGROUND, RGROUND -! (Pressure, U, V) , -! (Pressure, THd, R) -! YKIND = 'PUVTHDHU' : zGROUND, PGROUND, ThdGROUND, HuGROUND -! (Pressure, U, V) , -! (Pressure, THd, Hu) -! YKIND = 'ZUVTHDMR' : zGROUND, PGROUND, ThdGROUND, -! RGROUND -! (height, U, V) , -! (height, THd, R) -! YKIND = 'PUVTHU' : ZGROUND, PGROUND, TGROUND, HuGROUND -! (Pressure, U, V) , -! (Pressure, T, Hu) -! -! For ocean-LES case the following kind of data is permitted -! -! YKIND = 'IDEALOCE' : ZGROUND (Water depth),PGROUND(Sfc Atmos Press), -! TGROUND (SST), RGROUND (SSS) -! (Depth , U, V) starting from sfc -! (Depth, T, S) -! (Time, LE, H, SW_d,SW_u,LW_d,LW_u,Stress_X,Stress_Y) -! -! YKIND = 'STANDOCE' : (Depth , Temp, Salinity, U, V) starting from sfc -! (Time, LE, H, SW_d,SW_u,LW_d,LW_u,Stress_X,Stress_Y) -! -!!** METHOD -!! ------ -!! The radiosounding is first read, then data are converted in order to -!! always obtain the following variables (case YKIND = 'ZUVTHVMR') : -!! (height,U,V) and (height,Thetav,r) which are the model variables. -!! That is to say : -!! - YKIND = 'STANDARD' : -!! dd,ff converted in U,V -!! Td + pressure ----> r -!! T,r ---> Tv + pressure ----> thetav -!! Pressure + thetav + ZGROUND ----> height (for mass levels) -!! Thetav at mass levels ----> thetav at wind levels -!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) -!! - YKIND = 'PUVTHVMR' : -!! Pressure + thetav + ZGROUND ----> height (for mass levels) -!! Thetav at mass levels ----> thetav at wind levels -!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) -!! - YKIND = 'PUVTHVHU' : -!! thetav + pressure ----> Tv +pressure +Hu ----> r -!! Pressure + thetav + ZGROUND ----> height (for mass levels) -!! Thetav at mass levels ----> thetav at wind levels -!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) -!! - YKIND = 'ZUVTHVHU' : -!! height +thetav + PGROUND -----> pressure (for mass levels) -!! thetav + pressure ----> Tv +pressure +Hu ----> r -!! - YKIND = 'PUVTHDVMR' : -!! thetad + r ----> thetav -!! pressure + thetav + ZGROUND ----> height (for mass levels) -!! Thetav at mass levels ----> thetav at wind levels -!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) -!! - YKIND = 'PUVTHDHU' : -!! thetad + pressure -----> T -!! T + pressure + Hu -----> r -!! thetad + r -----> thetav -!! pressure + thetav + ZGROUND ----> height (for mass levels) -!! Thetav at mass levels ----> thetav at wind levels -!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) -!! - YKIND = 'ZUVTHDHU' : -!! thetad + r -----> thetav -!! - YKIND = 'PUVTHU' : -!! T + pressure -----> thetad -!! T + pressure + Hu -----> r -!! thetad + r -----> thetav -!! pressure + thetav + ZGROUND ----> height (for mass levels) -!! Thetav at mass levels ----> thetav at wind levels -!! -!! The following basic formula are used : -!! Rd es(Td) -!! r = -- ---------- -!! Rv P - es(Td) -!! -!! 1 + (Rv/Rd) r -!! Tv = -------------- T -!! 1 + r -!! -!! P00 Rd/Cpd 1 + (Rv/Rd) r -!! Thetav = Tv ( ---- ) = Thetad ( --------------) -!! P 1 + r -!! The integration of hydrostatic relation is used to compute height from -!! pressure and vice-versa. This is done by HEIGHT_PRESS and PRESS_HEIGHT -!! routines. -!! -!! Then, these data are interpolated on a vertical grid which is -!! a mixed grid calaculated with VERT_COORD from the vertical levels of MNH -!! grid and with a constant ororgraphy equal to the altitude of the vertical -!! profile (ZZGROUND) (It permits to keep low levels information with a -!! shifting function (as in PREP_REAL_CASE)) -!! -!! Then, the 3D mass and wind fields are deduced in SET_MASS -!! -!! -!! EXTERNAL -!! -------- -!! SET_MASS : to compute mass field on 3D-model grid -!! Module MODE_THERMO : contains thermodynamic routines -!! SM_FOES : To compute saturation vapor pressure from -!! temperature -!! SM_PMR_HU : to compute vapor mixing ratio from pressure, virtual -!! temperature and relative humidity -!! HEIGHT_PRESS : to compute height from pressure and thetav -!! by integration of hydrostatic relation -!! PRESS_HEIGHT : to compute pressure from height and thetav -!! by integration of hydrostatic relation -!! THETAVPU_THETAVPM : to interpolate thetav on wind levels -!! from thetav on mass levels -!! -!! Module MODI_HEIGHT_PRESS : interface for function HEIGHT_PRESS -!! Module MODI_PRESS_HEIGHT : interface for function PRESS_HEIGHT -!! Module MODI_THETAVPU_THETAVPM : interface for function -!! THETAVPU_THETVPM -!! Module MODI_SET_MASS : interface for subroutine SET_MASS -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : contains physical constants -!! XPI : Pi -!! XRV : Gas constant for vapor -!! XRD : Gas constant for dry air -!! XCPD : Specific heat for dry air at constant pressure -!! -!! Module MODD_LUNIT1 : contains logical unit names -!! TLUOUT : name of output-listing -!! -!! Module MODD_CONF : contains configuration variables for all models. -!! NVERB : verbosity level for output-listing -!! -!! Module MODD_GRID1 : contains grid variables -!! XZHAT : height of w-levels of vertical model grid without orography -!! -!! REFERENCE -!! --------- -!! Book2 of MESO-NH documentation (routine SET_RSOU) -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 25/08/94 -!! J.Stein 06/12/94 change the way to prescribe the horizontal wind -!! variations + cleaning -!! J.Stein 18/01/95 bug corrections in the ILEVELM readings -!! J.Stein 16/04/95 put the same names of the declarative modules -!! in the descriptive part -!! J.Stein 30/01/96 use the RS ground pressure to initialize the -!! hydrostatic pressure computation -!! V.Masson 02/09/96 add allocation of ZTHVU in two cases -!! P.Jabouille 14/02/96 bug in extrapolation of ZMRM below the first level -!! Jabouille/Masson 05/12/02 add ZUVTHLMR case and hydrometeor initialization -!! P.Jabouille 29/10/03 add hydrometeor initialization for ZUVTHDMR case -!! G. Tanguy 26/10/10 change the interpolation of the RS : we use now a -!! mixed grid (PREP_REAL_CASE method) -!! add PUVTHU case -!! V.Masson 12/08/13 Parallelization of the initilization profile -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 19/04/2019: removed unused dummy arguments and variables -! JL Redelsperger 01/2021: Ocean LES cases added -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CONF -USE MODD_CONF_n -USE MODD_CST -USE MODD_NEB_n, ONLY: NEBN -USE MODD_DYN_n, ONLY: LOCEAN -USE MODD_FIELD_n -USE MODD_GRID -USE MODD_GRID_n -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_IO, ONLY: TFILEDATA -USE MODD_NETCDF -USE MODD_OCEANH -USE MODD_PARAMETERS, ONLY: JPHEXT -USE MODD_TYPE_DATE -! -USE MODE_ll -USE MODE_MSG -USE MODE_THERMO -! -USE MODI_COMPUTE_EXNER_FROM_GROUND -USE MODI_HEIGHT_PRESS -USE MODI_PRESS_HEIGHT -USE MODI_SET_MASS -USE MODI_SHUMAN -USE MODI_THETAVPU_THETAVPM -USE MODI_VERT_COORD -! -USE NETCDF ! for reading the NR files -! -IMPLICIT NONE -! -! -!* 0.1 Declarations of arguments : -! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! outpput data file -TYPE(TFILEDATA), INTENT(IN) :: TPEXPREFILE ! input data file -CHARACTER(LEN=*), INTENT(IN) :: HFUNU ! type of variation of U - ! in y direction -CHARACTER(LEN=*), INTENT(IN) :: HFUNV ! type of variation of V - ! in x direction -INTEGER, INTENT(IN) :: KILOC ! I Localisation of vertical profile -INTEGER, INTENT(IN) :: KJLOC ! J Localisation of vertical profile -LOGICAL, INTENT(IN) :: OBOUSS ! logical switch for Boussinesq version -LOGICAL, INTENT(IN) :: OSHIFT ! logical switch for vertical shift -REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCORIOZ ! Coriolis parameter - ! (exceptionnaly 3D array) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PJ ! jacobien -! -! -!* 0.2 Declarations of local variables : -! -INTEGER :: ILUPRE ! logical unit number of the EXPRE return code -INTEGER :: ILUOUT ! Logical unit number for output-listing -! local variables for reading sea sfc flux forcing for ocean model -INTEGER :: IFRCLT -REAL, DIMENSION(:), ALLOCATABLE :: ZSSUFL_T,ZSSVFL_T,ZSSTFL_T,ZSSOLA_T ! -TYPE (DATE_TIME), DIMENSION(:), ALLOCATABLE :: ZFRCLT ! date/time of sea surface forcings -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! variables read in EXPRE file at the RS/CTD levels -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -CHARACTER(LEN=8) :: YKIND ! Kind of variables in - ! EXPRE FILE -INTEGER :: ILEVELU ! number of wind levels -REAL, DIMENSION(:), ALLOCATABLE :: ZHEIGHTU ! Height at wind levels -REAL, DIMENSION(:), ALLOCATABLE :: ZPRESSU ! Pressure at wind levels -REAL, DIMENSION(:), ALLOCATABLE :: ZTHVU ! Thetav at wind levels -REAL, DIMENSION(:), ALLOCATABLE :: ZU,ZV ! wind components -REAL, DIMENSION(:), ALLOCATABLE :: ZDD,ZFF ! dd (direction) and ff(force) - ! for wind -REAL :: ZZGROUND,ZPGROUND ! height and Pressure at ground -REAL :: ZTGROUND,ZTHVGROUND,ZTHDGROUND,ZTHLGROUND, & - ZTDGROUND,ZMRGROUND,ZHUGROUND - ! temperature and moisture - ! variables at ground -INTEGER :: ILEVELM ! number of mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZHEIGHTM ! Height at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZPRESSM ! Pressure at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZTHV ! Thetav at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZTHD ! Theta (dry) at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZTHL ! Thetal at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZTH ! Theta at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZT ! Temperature at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZMR ! Vapor mixing ratio at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZMRC ! cloud mixing ratio at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZMRI ! ice mixing ratio or cloud concentration -REAL, DIMENSION(:), ALLOCATABLE :: ZRT ! total mixing ratio -REAL, DIMENSION(:), ALLOCATABLE :: ZPRESS ! pressure at mass level -REAL, DIMENSION(:), ALLOCATABLE :: ZHU ! relative humidity at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZTD ! Td at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZTV ! Tv at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZEXN -REAL, DIMENSION(:), ALLOCATABLE :: ZCPH -REAL, DIMENSION(:), ALLOCATABLE :: ZLVOCPEXN -REAL, DIMENSION(:), ALLOCATABLE :: ZLSOCPEXN -REAL, DIMENSION(SIZE(XZHAT)) :: ZZFLUX_PROFILE ! altitude of flux points on the initialization columns -REAL, DIMENSION(SIZE(XZHAT)) :: ZZMASS_PROFILE ! altitude of mass points on the initialization columns -! -! fields on the grid of the model without orography -! -REAL, DIMENSION(SIZE(XZHAT)) :: ZUW,ZVW ! Wind at w model grid levels -REAL, DIMENSION(SIZE(XZHAT)) :: ZMRM ! vapor mixing ratio at mass model - !grid levels -REAL, DIMENSION(SIZE(XZHAT)) :: ZMRCM,ZMRIM -REAL, DIMENSION(SIZE(XZHAT)) :: ZTHVM ! Temperature at mass model grid levels -REAL, DIMENSION(SIZE(XZHAT)) :: ZTHLM ! Thetal at mass model grid levels -REAL, DIMENSION(SIZE(XZHAT)) :: ZTHM ! Thetal at mass model grid levels -REAL, DIMENSION(SIZE(XZHAT)) :: ZRHODM ! density at mass model grid level -REAL, DIMENSION(:), ALLOCATABLE :: ZMRT ! Total Vapor mixing ratio at mass levels on mixed grid -REAL, DIMENSION(:), ALLOCATABLE :: ZEXNMASS ! exner fonction at mass level -REAL, DIMENSION(:), ALLOCATABLE :: ZEXNFLUX ! exner fonction at flux level -REAL :: ZEXNSURF ! exner fonction at surface -REAL, DIMENSION(:), ALLOCATABLE :: ZPREFLUX ! pressure at flux model grid level -REAL, DIMENSION(:), ALLOCATABLE :: ZFRAC_ICE ! ice fraction -REAL, DIMENSION(:), ALLOCATABLE :: ZRSATW, ZRSATI -REAL :: ZDZSDH,ZDZ1SDH,ZDZ2SDH ! interpolation - ! working arrays -REAL, DIMENSION(:,:), ALLOCATABLE :: ZBUF -! -INTEGER :: JK,JKLEV,JKU,JKM,JKT,JJ,JI,JO,JLOOP ! Loop indexes -INTEGER :: IKU ! Upper bound in z direction -REAL :: ZRDSCPD,ZRADSDG, & ! Rd/Cpd, Pi/180., - ZRVSRD,ZRDSRV, & ! Rv/Rd, Rd/Rv - ZPTOP ! Pressure at domain top -LOGICAL :: GUSERC ! use of input data cloud -INTEGER :: IIB, IIE, IJB, IJE -INTEGER :: IXOR_ll, IYOR_ll -INTEGER :: IINFO_ll -LOGICAL :: GPROFILE_IN_PROC ! T : initialization profile is in current processor -! -REAL,DIMENSION(SIZE(XXHAT),SIZE(XYHAT)) ::ZZS_LS -REAL,DIMENSION(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)) ::ZZFLUX_MX,ZZMASS_MX ! mixed grid -!------------------------------------------------------------------------------- -! For standard ocean version, reading external files -CHARACTER(LEN=256) :: yinfile, yinfisf ! files to be read -INTEGER :: IDX -INTEGER(KIND=CDFINT) :: INZ, INLATI, INLONGI -INTEGER(KIND=CDFINT) :: incid, ivarid, idimid, idimlen -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZOC_TEMPERATURE,ZOC_SALINITY,ZOC_U,ZOC_V -REAL, DIMENSION(:), ALLOCATABLE :: ZOC_DEPTH -REAL, DIMENSION(:), ALLOCATABLE :: ZOC_LE,ZOC_H -REAL, DIMENSION(:), ALLOCATABLE :: ZOC_SW_DOWN,ZOC_SW_UP,ZOC_LW_DOWN,ZOC_LW_UP -REAL, DIMENSION(:), ALLOCATABLE :: ZOC_TAUX,ZOC_TAUY - -!-------------------------------------------------------------------------------- -! -!* 1. PROLOGUE : INITIALIZE SOME CONSTANTS, RETRIEVE LOGICAL -! UNIT NUMBERS AND READ KIND OF DATA IN EXPRE FILE -! ------------------------------------------------------- -! -CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) -CALL GET_OR_ll('B',IXOR_ll,IYOR_ll) -! -!* 1.1 initialize some constants -! -ZRDSCPD = XRD / XCPD -ZRADSDG = XPI/180. -ZRVSRD = XRV/XRD -ZRDSRV = XRD/XRV -! -!* 1.2 Retrieve logical unit numbers -! -ILUPRE = TPEXPREFILE%NLU -ILUOUT = TLUOUT%NLU -! -!* 1.3 Read data kind in EXPRE file -! -READ(ILUPRE,*) YKIND -WRITE(ILUOUT,*) 'YKIND read in set_rsou: ', YKIND -! -IF(LUSERC .AND. YKIND/='PUVTHDMR' .AND. YKIND/='ZUVTHDMR' .AND. YKIND/='ZUVTHLMR') THEN - CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','hydrometeors are not allowed for YKIND = '//trim(YKIND)) -ENDIF -! -IF(YKIND=='ZUVTHLMR' .AND. .NOT. LUSERC) THEN -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','LUSERC=T is required for YKIND=ZUVTHLMR') -ENDIF -! -GUSERC=.FALSE. -IF(LUSERC .AND. (YKIND == 'PUVTHDMR' .OR. YKIND == 'ZUVTHDMR')) GUSERC=.TRUE. -!------------------------------------------------------------------------------- -! -!* 2. READ DATA AND CONVERT IN (height,U,V), (height,Thetav,r) -! -------------------------------------------------------- -! -SELECT CASE(YKIND) -! -! 2.0.1 Ocean case 1 -! - CASE ('IDEALOCE') -! - XP00=XP00OCEAN - ! Read data in PRE_IDEA1.nam - ! Surface - WRITE(ILUOUT,FMT=*) 'Reading data for ideal ocean :IDEALOCE' - READ(ILUPRE,*) ZPTOP ! P_atmosphere at sfc =P top domain - READ(ILUPRE,*) ZTGROUND ! SST - READ(ILUPRE,*) ZMRGROUND ! SSS - WRITE(ILUOUT,FMT=*) 'Patm SST SSS', ZPTOP,ZTGROUND,ZMRGROUND - READ(ILUPRE,*) ILEVELU ! Read number of Current levels - ! Allocate required memory - ALLOCATE(ZHEIGHTU(ILEVELU),ZU(ILEVELU),ZV(ILEVELU)) - ALLOCATE(ZOC_U(ILEVELU,1,1),ZOC_V(ILEVELU,1,1)) - WRITE(ILUOUT,FMT=*) 'Level number for Current in data', ILEVELU - ! Read U and V at each wind level - DO JKU = 1,ILEVELU - READ(ILUPRE,*) ZHEIGHTU(JKU),ZOC_U(JKU,1,1),ZOC_V(JKU,1,1) - ! WRITE(ILUOUT,FMT=*) 'Leveldata D(m) under sfc: U_cur, V_cur', JKU, ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) - END DO - DO JKU=1,ILEVELU - ! Z axis reoriented as in the model - IDX = ILEVELU-JKU+1 - ZU(JKU) = ZOC_U(IDX,1,1) - ZV(JKU) = ZOC_V(IDX,1,1) - ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model - ! Z oriented in same time to have a model domain axis going - ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top) - END DO - ! Read number of mass levels - READ(ILUPRE,*) ILEVELM - ! Allocate required memory - ALLOCATE(ZOC_DEPTH(ILEVELM)) - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM),ZTH(ILEVELM),ZTHV(ILEVELM)) - ALLOCATE(ZMR(ILEVELM),ZRT(ILEVELM)) - ALLOCATE(ZOC_TEMPERATURE(ILEVELM,1,1),ZOC_SALINITY(ILEVELM,1,1)) - ! Read T and S at each mass level - DO JKM= 2,ILEVELM - READ(ILUPRE,*) ZOC_DEPTH(JKM),ZOC_TEMPERATURE(JKM,1,1),ZOC_SALINITY(JKM,1,1) - END DO - ! Complete the mass arrays with the ground informations read in EXPRE file - ZOC_DEPTH(1) = 0. - ZOC_TEMPERATURE(1,1,1)= ZTGROUND - ZOC_SALINITY(1,1,1)= ZMRGROUND - !!!!!!!!!!!!!!!!!!!!!!!!Inversing Axis!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - ! Going from the data (axis downward i.e inverse model) grid to the model grid (axis upward) - ! Uniform bathymetry; depth goes from ocean sfc downwards (data grid) - ! ZHEIGHT goes from the model domain bottom up to the sfc ocean (top of model domain) - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - ZZGROUND = 0. - ZTGROUND = ZOC_TEMPERATURE(ILEVELM,1,1) - ZMRGROUND = ZOC_SALINITY(ILEVELM,1,1) - DO JKM= 1,ILEVELM - ! Z upward axis (oriented as in the model), i.e. - ! going from 0m (ocean bottom/model bottom) upward to H (ocean sfc/model top) - ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model - IDX = ILEVELM-JKM+1 - ZTH(JKM) = ZOC_TEMPERATURE(IDX,1,1) - ZMR(JKM) = ZOC_SALINITY(IDX,1,1) - ZHEIGHTM(JKM)= ZOC_DEPTH(ILEVELM)- ZOC_DEPTH(IDX) - WRITE(ILUOUT,FMT=*) 'Model oriented initial data: JKM IDX depth T S ZHEIGHTM', & - JKM,IDX,ZOC_DEPTH(IDX),ZTH(JKM),ZMR(JKM),ZHEIGHTM(JKM) - END DO - ! mass levels of the RS - ZTHV = ZTH ! TV==THETA=TL - ZTHL = ZTH - ZRT = ZMR - !!!!!!!!!!!!!!!!!!!!!!!!!!!! - ! READ Sea Surface Forcing ! - !!!!!!!!!!!!!!!!!!!!!!!!!!!! - ! Reading the forcings from prep_idea1.nam - READ(ILUPRE,*) IFRCLT ! Number of time-dependent forcing - IF (IFRCLT > 99*8) THEN - ! CAUTION: number of forcing times is limited by the WRITE format 99(8E10.3) - ! and also by the name of forcing variables (format I3.3) - ! You have to modify those if you need more forcing times - CALL PRINT_MSG(NVERB_FATAL,'IO','SET_RSOU','maximum forcing times NFRCLT is 99*8') - END IF -! - WRITE(UNIT=ILUOUT,FMT='(" THERE ARE ",I2," SFC FLUX FORCINGs AT:")') IFRCLT - ALLOCATE(ZFRCLT(IFRCLT)) - ALLOCATE(ZSSUFL_T(IFRCLT)); ZSSUFL_T = 0.0 - ALLOCATE(ZSSVFL_T(IFRCLT)); ZSSVFL_T = 0.0 - ALLOCATE(ZSSTFL_T(IFRCLT)); ZSSTFL_T = 0.0 - ALLOCATE(ZSSOLA_T(IFRCLT)); ZSSOLA_T = 0.0 - DO JKT = 1,IFRCLT - WRITE(ILUOUT,FMT='(A, I4)') "SET_RSOU/Reading Sea Surface forcing: Number=", JKT - READ(ILUPRE,*) ZFRCLT(JKT)%nyear, ZFRCLT(JKT)%nmonth, & - ZFRCLT(JKT)%nday, ZFRCLT(JKT)%xtime - READ(ILUPRE,*) ZSSUFL_T(JKT) - READ(ILUPRE,*) ZSSVFL_T(JKT) - READ(ILUPRE,*) ZSSTFL_T(JKT) - READ(ILUPRE,*) ZSSOLA_T(JKT) - END DO -! - DO JKT = 1 , IFRCLT - WRITE(UNIT=ILUOUT,FMT='(F9.0, "s, date:", I3, "/", I3, "/", I5)') & - ZFRCLT(JKT)%xtime, ZFRCLT(JKT)%nday, & - ZFRCLT(JKT)%nmonth, ZFRCLT(JKT)%nyear - END DO - NINFRT= INT(ZFRCLT(2)%xtime) - WRITE(ILUOUT,FMT='(A)') & - "Number U-Stress, V-Stress, Heat turb Flux, Solar Flux Interval(s)",NINFRT - DO JKT = 1, IFRCLT - WRITE(ILUOUT,FMT='(I10,99(3F10.2))') JKT, ZSSUFL_T(JKT),ZSSVFL_T(JKT),ZSSTFL_T(JKT) - END DO - NFRCLT = IFRCLT - ALLOCATE(TFRCLT(NFRCLT)) - ALLOCATE(XSSUFL_T(NFRCLT));XSSUFL_T(:)=0. - ALLOCATE(XSSVFL_T(NFRCLT));XSSVFL_T(:)=0. - ALLOCATE(XSSTFL_T(NFRCLT));XSSTFL_T(:)=0. - ALLOCATE(XSSOLA_T(NFRCLT));XSSOLA_T(:)=0. -! - DO JKT=1,NFRCLT - TFRCLT(JKT)= ZFRCLT(JKT) - XSSUFL_T(JKT)=ZSSUFL_T(JKT)/XRH00OCEAN - XSSVFL_T(JKT)=ZSSVFL_T(JKT)/XRH00OCEAN - ! working in SI - XSSTFL_T(JKT)=ZSSTFL_T(JKT) /(3900.*XRH00OCEAN) - XSSOLA_T(JKT)=ZSSOLA_T(JKT) /(3900.*XRH00OCEAN) - END DO - DEALLOCATE(ZFRCLT) - DEALLOCATE(ZSSUFL_T) - DEALLOCATE(ZSSVFL_T) - DEALLOCATE(ZSSTFL_T) - DEALLOCATE(ZSSOLA_T) -! -!-------------------------------------------------------------------------------- -! 2.0.2 Ocean standard initialize from netcdf files -! U,V,T,S at Z levels + Forcings at model TOP (sea surface) -!-------------------------------------------------------------------------------- -! - CASE ('STANDOCE') -! - XP00=XP00OCEAN - READ(ILUPRE,*) ZPTOP ! P_atmosphere at sfc =P top domain - READ(ILUPRE,*) YINFILE, YINFISF - WRITE(ILUOUT,FMT=*) 'Netcdf files to read:', YINFILE, YINFISF - ! Open file containing initial profiles - CALL check(nf90_open(yinfile,NF90_NOWRITE,incid), "opening NC file") - ! Reading dimensions and lengths - CALL check( nf90_inq_dimid(incid, "depth",idimid), "getting depth dimension id" ) - CALL check( nf90_inquire_dimension(incid, idimid, len=INZ), "getting INZ" ) - CALL check( nf90_inquire_dimension(incid, INT(2,KIND=CDFINT), len=INLONGI), "getting NLONG" ) - CALL check( nf90_inquire_dimension(incid, INT(1,KIND=CDFINT), len=INLATI), "getting NLAT" ) -! - WRITE(ILUOUT,FMT=*) 'NB LEVLS READ INZ, NLONG NLAT ', INZ, INLONGI,INLATI - ALLOCATE(ZOC_TEMPERATURE(INLATI,INLONGI,INZ),ZOC_SALINITY(INLATI,INLONGI,INZ)) - ALLOCATE(ZOC_U(INLATI,INLONGI,INZ),ZOC_V(INLATI,INLONGI,INZ)) - ALLOCATE(ZOC_DEPTH(INZ)) - WRITE(ILUOUT,FMT=*) 'NETCDF READING ==> Temp' - CALL check(nf90_inq_varid(incid,"temperature",ivarid), "getting temp ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_TEMPERATURE), "reading temp") - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> salinity' - CALL check(nf90_inq_varid(incid,"salinity",ivarid), "getting salinity ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_SALINITY), "reading salinity") - WRITE(ILUOUT,FMT=*) 'Netcdf ==> Reading depth' - CALL check(nf90_inq_varid(incid,"depth",ivarid), "getting depth ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_DEPTH), "reading depth") - WRITE(ILUOUT,FMT=*) 'depth: max min ', MAXVAL(ZOC_DEPTH),MINVAL(ZOC_DEPTH) - WRITE(ILUOUT,FMT=*) 'depth 1 nz: ', ZOC_DEPTH(1),ZOC_DEPTH(INZ) - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> Currents' - CALL check(nf90_inq_varid(incid,"u",ivarid), "getting u ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_U), "reading u") - CALL check(nf90_inq_varid(incid,"v",ivarid), "getting v ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_V), "reading v") - CALL check(nf90_close(incid), "closing yinfile") - WRITE(ILUOUT,FMT=*) 'End of initial file reading' -! - DO JKM=1,INZ - ZOC_TEMPERATURE(1,1,JKM)=ZOC_TEMPERATURE(1,1,JKM)+273.15 - WRITE(ILUOUT,FMT=*) 'Z T(Kelvin) S(Sverdup) U V K',& - JKM,ZOC_DEPTH(JKM),ZOC_TEMPERATURE(1,1,JKM),ZOC_SALINITY(1,1,JKM),ZOC_U(1,1,JKM),ZOC_V(1,1,JKM), JKM - ENDDO - ! number of data levels - ILEVELM=INZ - ! Model bottom - ZTGROUND = ZOC_TEMPERATURE(1,1,ILEVELM) - ZMRGROUND = ZOC_SALINITY(1,1,ILEVELM) - ZZGROUND=0. - ! Allocate required memory - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZT(ILEVELM)) - ALLOCATE(ZTV(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) - ! Going from the inverse model grid (data) to the normal one - DO JKM= 1,ILEVELM - ! Z axis reoriented as in the model - IDX = ILEVELM-JKM+1 - ZT(JKM) = ZOC_TEMPERATURE(1,1,IDX) - ZMR(JKM) = ZOC_SALINITY(1,1,IDX) - ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model - ! Z oriented in same time to have a model domain axis going - ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top) - ! translation/inversion - ZHEIGHTM(JKM) = -ZOC_DEPTH(IDX) + ZOC_DEPTH(ILEVELM) - WRITE(ILUOUT,FMT=*) 'End gridmodel comput: JKM IDX depth T S ZHEIGHTM', & - JKM,IDX,ZOC_DEPTH(IDX),ZT(JKM),ZMR(JKM),ZHEIGHTM(JKM) - END DO - ! complete ther variables - ZTV = ZT - ZTHV = ZT - ZRT = ZMR - ZTHL = ZT - ZTH = ZT - ! INIT --- U V ----- - ILEVELU = INZ ! Same nb of levels for u,v,T,S - !Assume that current and temp are given at same level - ALLOCATE(ZHEIGHTU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) - ZHEIGHTU=ZHEIGHTM - DO JKM= 1,ILEVELU - ! Z axis reoriented as in the model - IDX = ILEVELU-JKM+1 - ZU(JKM) = ZOC_U(1,1,IDX) - ZV(JKM) = ZOC_V(1,1,IDX) - ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model - ! Z oriented in same time to have a model domain axis going - ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top) - END DO -! - DEALLOCATE(ZOC_TEMPERATURE) - DEALLOCATE(ZOC_SALINITY) - DEALLOCATE(ZOC_U) - DEALLOCATE(ZOC_V) - DEALLOCATE(ZOC_DEPTH) -! - ! Reading/initializing surface forcings -! - WRITE(ILUOUT,FMT=*) 'netcdf sfc forcings file to be read:',yinfisf - ! Open of sfc forcing file - CALL check(nf90_open(yinfisf,NF90_NOWRITE,incid), "opening NC file") - ! Reading dimension and length - CALL check( nf90_inq_dimid(incid,"t",idimid), "getting time dimension id" ) - CALL check( nf90_inquire_dimension(incid, idimid, len=idimlen), "getting idimlen " ) -! - WRITE(ILUOUT,FMT=*) 'nb sfc-forcing time idimlen=',idimlen - ALLOCATE(ZOC_LE(idimlen)) - ALLOCATE(ZOC_H(idimlen)) - ALLOCATE(ZOC_SW_DOWN(idimlen)) - ALLOCATE(ZOC_SW_UP(idimlen)) - ALLOCATE(ZOC_LW_DOWN(idimlen)) - ALLOCATE(ZOC_LW_UP(idimlen)) - ALLOCATE(ZOC_TAUX(idimlen)) - ALLOCATE(ZOC_TAUY(idimlen)) -! - WRITE(ILUOUT,FMT=*)'Netcdf Reading ==> LE' - CALL check(nf90_inq_varid(incid,"LE",ivarid), "getting LE ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_LE), "reading LE flux") - WRITE(ILUOUT,FMT=*)'Netcdf Reading ==> H' - CALL check(nf90_inq_varid(incid,"H",ivarid), "getting H ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_H), "reading H flux") - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> SW_DOWN' - CALL check(nf90_inq_varid(incid,"SW_DOWN",ivarid), "getting SW_DOWN ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_SW_DOWN), "reading SW_DOWN") - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> SW_UP' - CALL check(nf90_inq_varid(incid,"SW_UP",ivarid), "getting SW_UP ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_SW_UP), "reading SW_UP") - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> LW_DOWN' - CALL check(nf90_inq_varid(incid,"LW_DOWN",ivarid), "getting LW_DOWN ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_LW_DOWN), "reading LW_DOWN") - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> LW_UP' - CALL check(nf90_inq_varid(incid,"LW_UP",ivarid), "getting LW_UP ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_LW_UP), "reading LW_UP") - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> TAUX' - CALL check(nf90_inq_varid(incid,"TAUX",ivarid), "getting TAUX ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_TAUX), "reading TAUX") - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> TAUY' - CALL check(nf90_inq_varid(incid,"TAUY",ivarid), "getting TAUY ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_TAUY), "reading TAUY") - CALL check(nf90_close(incid), "closing yinfifs") -! - WRITE(ILUOUT,FMT=*) ' Forcing-Number LE H SW_down SW_up LW_down LW_up TauX TauY' - DO JKM = 1, idimlen - WRITE(ILUOUT,FMT=*) JKM, ZOC_LE(JKM), ZOC_H(JKM),ZOC_SW_DOWN(JKM),ZOC_SW_UP(JKM),& - ZOC_LW_DOWN(JKM),ZOC_LW_UP(JKM),ZOC_TAUX(JKM),ZOC_TAUY(JKM) - ENDDO - ! IFRCLT FORCINGS at sea surface - IFRCLT=idimlen - ALLOCATE(ZFRCLT(IFRCLT)) - ALLOCATE(ZSSUFL_T(IFRCLT)); ZSSUFL_T = 0.0 - ALLOCATE(ZSSVFL_T(IFRCLT)); ZSSVFL_T = 0.0 - ALLOCATE(ZSSTFL_T(IFRCLT)); ZSSTFL_T = 0.0 - ALLOCATE(ZSSOLA_T(IFRCLT)); ZSSOLA_T = 0.0 - DO JKT=1,IFRCLT - ! Initial file for CINDY-DYNAMO: all fluxes correspond to the absolute value (>0) - ! modele ocean: axe z dirigé du bas vers la sfc de l'océan - ! => flux dirigé vers le haut (positif ocean vers l'atmopshere i.e. bas vers le haut) - ZSSOLA_T(JKT)=ZOC_SW_DOWN(JKT)-ZOC_SW_UP(JKT) - ZSSTFL_T(JKT)=(ZOC_LW_DOWN(JKT)-ZOC_LW_UP(JKT)-ZOC_LE(JKT)-ZOC_H(JKT)) - ! assume that Tau given on file is along Ox - ! rho_air UW_air = rho_ocean UW_ocean= N/m2 - ! uw_ocean - ZSSUFL_T(JKT)=ZOC_TAUX(JKT) - ZSSVFL_T(JKT)=ZOC_TAUY(JKT) - WRITE(ILUOUT,FMT=*) 'Forcing Nb Sol NSol UW_oc VW',& - JKT,ZSSOLA_T(JKT),ZSSTFL_T(JKT),ZSSUFL_T(JKT),ZSSVFL_T(JKT) - ENDDO - ! Allocate and Writing the corresponding variables in module MODD_OCEAN_FRC - NFRCLT=IFRCLT - ! value to read later on file ? - NINFRT=600 - ALLOCATE(TFRCLT(NFRCLT)) - ALLOCATE(XSSUFL_T(NFRCLT));XSSUFL_T(:)=0. - ALLOCATE(XSSVFL_T(NFRCLT));XSSVFL_T(:)=0. - ALLOCATE(XSSTFL_T(NFRCLT));XSSTFL_T(:)=0. - ALLOCATE(XSSOLA_T(NFRCLT));XSSOLA_T(:)=0. - ! on passe en unités SI, signe, etc pour le modele ocean - ! W/m2 => SI : /(CP_mer * rho_mer) - ! a revoir dans tt le code pour mettre de svaleurs plus exactes - DO JKT=1,NFRCLT - TFRCLT(JKT)= ZFRCLT(JKT) - XSSUFL_T(JKT)=ZSSUFL_T(JKT)/XRH00OCEAN - XSSVFL_T(JKT)=ZSSVFL_T(JKT)/XRH00OCEAN - XSSTFL_T(JKT)=ZSSTFL_T(JKT) /(3900.*XRH00OCEAN) - XSSOLA_T(JKT)=ZSSOLA_T(JKT) /(3900.*XRH00OCEAN) - END DO - DEALLOCATE(ZFRCLT) - DEALLOCATE(ZSSUFL_T) - DEALLOCATE(ZSSVFL_T) - DEALLOCATE(ZSSTFL_T) - DEALLOCATE(ZSSOLA_T) - DEALLOCATE(ZOC_LE) - DEALLOCATE(ZOC_H) - DEALLOCATE(ZOC_SW_DOWN) - DEALLOCATE(ZOC_SW_UP) - DEALLOCATE(ZOC_LW_DOWN) - DEALLOCATE(ZOC_LW_UP) - DEALLOCATE(ZOC_TAUX) - DEALLOCATE(ZOC_TAUY) - ! END OCEAN STANDARD -! -! -!* 2.1 ATMOSPHERIC STANDARD case : ZGROUND, PGROUND, TGROUND, TDGROUND -! (Pressure, dd, ff) , -! (Pressure, T, Td) -! - CASE ('STANDARD') - - READ(ILUPRE,*) ZZGROUND ! Read data at ground level - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTGROUND - READ(ILUPRE,*) ZTDGROUND -! - READ(ILUPRE,*) ILEVELU ! Read number of wind levels - ALLOCATE(ZPRESSU(ILEVELU)) ! Allocate memory for arrays to be read - ALLOCATE(ZDD(ILEVELU),ZFF(ILEVELU)) - ALLOCATE(ZHEIGHTU(ILEVELU)) ! Allocate memory for needed - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) ! arrays - ALLOCATE(ZTHVU(ILEVELU)) ! Allocate memory for intermediate - ! arrays -! - DO JKU = 1,ILEVELU ! Read data at wind levels - READ(ILUPRE,*) ZPRESSU(JKU),ZDD(JKU),ZFF(JKU) - END DO -! - READ(ILUPRE,*) ILEVELM ! Read number of mass levels - ! including the ground level - ALLOCATE(ZPRESSM(ILEVELM)) ! Allocate memory for arrays to be read - ALLOCATE(ZT(ILEVELM)) - ALLOCATE(ZTD(ILEVELM)) - ALLOCATE(ZHEIGHTM(ILEVELM)) ! Allocate memory for needed - ALLOCATE(ZTHV(ILEVELM)) ! arrays - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZTV(ILEVELM)) ! Allocate memory for intermediate arrays - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! - DO JKM= 2,ILEVELM ! Read data at mass levels - READ(ILUPRE,*) ZPRESSM(JKM),ZT(JKM),ZTD(JKM) - END DO - ZPRESSM(1)=ZPGROUND ! Mass level 1 is at the ground - ZT(1)=ZTGROUND - ZTD(1)=ZTDGROUND -! -! recover the North-South and West-East wind components - ZU(:) = ZFF(:)*COS(ZRADSDG*(270.-ZDD(:)) ) - ZV(:) = ZFF(:)*SIN(ZRADSDG*(270.-ZDD(:)) ) -! -! compute vapor mixing ratio - ZMR(:) = SM_FOES(ZTD(:)) & - / ( (ZPRESSM(:) - SM_FOES(ZTD(:))) * ZRVSRD ) -! -! compute Tv - ZTV(:) = ZT(:) * (1. + ZRVSRD * ZMR(:))/(1.+ZMR(:)) -! -! compute thetav - ZTHV(:) = ZTV(:) * (XP00/ ZPRESSM(:)) **(ZRDSCPD) -! -! compute height at the mass levels of the RS - ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) -! -! compute thetav and height at the wind levels of the RS - ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) - ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute Thetal and Rt - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) -! -!* 2.2 PUVTHVMR case : zGROUND, PGROUND, ThvGROUND, RGROUND -! (Pressure, U, V) , -! (Pressure, THv, R) -! - CASE ('PUVTHVMR') -! -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHVGROUND - READ(ILUPRE,*) ZMRGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate the required memory - ALLOCATE(ZPRESSU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) - ALLOCATE(ZHEIGHTU(ILEVELU)) - ALLOCATE(ZTHVU(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU =1,ILEVELU - READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate the required memory - ALLOCATE(ZPRESSM(ILEVELM)) - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM = 2,ILEVELM - READ(ILUPRE,*) ZPRESSM(JKM),ZTHV(JKM),ZMR(JKM) - END DO -! -! Complete the mass arrays with the ground informations read in EXPRE file - ZPRESSM(1) = ZPGROUND - ZTHV(1) = ZTHVGROUND - ZMR(1) = ZMRGROUND -! -! Compute height of the mass levels of the RS - ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute thetav and heigth at the wind levels of the RS - ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) - ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) -! -! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) -! -!* 2.3 PUVTHVHU case : zGROUND, PGROUND, ThvGROUND, HuGROUND -! (Pressure, U, V) , -! (Pressure, THv, Hu) -! - CASE ('PUVTHVHU') -! -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHVGROUND - READ(ILUPRE,*) ZHUGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate the required memory - ALLOCATE(ZPRESSU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) - ALLOCATE(ZHEIGHTU(ILEVELU)) - ALLOCATE(ZTHVU(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU =1,ILEVELU - READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate the required memory - ALLOCATE(ZPRESSM(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZHU(ILEVELM)) - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZTV(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM = 2,ILEVELM - READ(ILUPRE,*) ZPRESSM(JKM),ZTHV(JKM),ZHU(JKM) - END DO -! -! Complete the mass arrays with the ground informations read in EXPRE file - ZPRESSM(1) = ZPGROUND ! Mass level 1 is at the ground - ZTHV(1) = ZTHVGROUND - ZHU(1) = ZHUGROUND -! -! Compute Tv - ZTV(:)=ZTHV(:) * (ZPRESSM(:) / XP00) ** ZRDSCPD -! -! Compte mixing ratio - ZMR(:)=SM_PMR_HU(ZPRESSM(:),ZTV(:),ZHU(:),SPREAD(ZMR(:),2,1)) -! -! Compute height of the mass levels of the RS - ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute thetav and height of the wind levels of the RS - ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) - ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) -! -! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) -! -!* 2.4 ZUVTHVHU case : zGROUND, PGROUND, ThvGROUND, HuGROUND -! (height, U, V) , -! (height, THv, Hu) -! - CASE ('ZUVTHVHU') -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHVGROUND - READ(ILUPRE,*) ZHUGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate the required memory - ALLOCATE(ZPRESSU(ILEVELU)) - ALLOCATE(ZHEIGHTU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) -! -! -! Read the data at each wind level of the RS - DO JKU = 1,ILEVELU - READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate the required memory - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZHU(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZPRESSM(ILEVELM)) - ALLOCATE(ZTV(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM = 2,ILEVELM - READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHV(JKM),ZHU(JKM) - END DO -! -! Complete the mass arrays with the ground informations read in EXPRE file - ZHEIGHTM(1) = ZZGROUND ! Mass level 1 is at the ground - ZTHV(1) = ZTHVGROUND - ZHU(1) = ZHUGROUND -! -! Compute Pressure at the mass levels of the RS - ZPRESSM= PRESS_HEIGHT(ZHEIGHTM,ZTHV,ZPGROUND,ZTHV(1),ZHEIGHTM(1)) -! -! Compute Tv and the mixing ratio at the mass levels of the RS - ZTV(:)=ZTHV(:) * (ZPRESSM(:) / XP00) ** ZRDSCPD - ZMR(:)=SM_PMR_HU(ZPRESSM(:),ZTV(:),ZHU(:),SPREAD(ZMR(:),2,1)) -! -! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) -! -! -!* 2.5 ZUVTHVMR case : zGROUND, PGROUND, ThvGROUND, RGROUND -! (height, U, V) , -! (height, THv, R) -! -! - CASE ('ZUVTHVMR') -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHVGROUND - READ(ILUPRE,*) ZMRGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate the required memory - ALLOCATE(ZHEIGHTU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU = 1,ILEVELU - READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate the required memory - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM=2,ILEVELM - READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHV(JKM),ZMR(JKM) - END DO -! -! Complete the mass arrays with the ground informations read in EXPRE file - ZHEIGHTM(1)= ZZGROUND ! Mass level 1 is at the ground - ZTHV(1) = ZTHVGROUND - ZMR(1) = ZMRGROUND -! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) -! -! -!* 2.6 PUVTHDMR case : zGROUND, PGROUND, ThdGROUND, RGROUND -! (Pressure, U, V) , -! (Pressure, THd, R) -! - CASE ('PUVTHDMR') -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHDGROUND - READ(ILUPRE,*) ZMRGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate the required memory - ALLOCATE(ZPRESSU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) - ALLOCATE(ZTHVU(ILEVELU)) - ALLOCATE(ZHEIGHTU(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU =1,ILEVELU - READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate the required memory - ALLOCATE(ZPRESSM(ILEVELM)) - ALLOCATE(ZTHD(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZMRC(ILEVELM)) - ZMRC=0 - ALLOCATE(ZMRI(ILEVELM)) - ZMRI=0 - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM=2,ILEVELM - IF(LUSERI) THEN - READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM) - ELSEIF (GUSERC) THEN - READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM) - ELSE - READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM) - ENDIF - END DO -! -! Complete the mass arrays with the ground informations read in EXPRE file - ZPRESSM(1) = ZPGROUND ! Mass level 1 is at the ground - ZTHD(1) = ZTHDGROUND - ZMR(1) = ZMRGROUND - IF(GUSERC) ZMRC(1) = ZMRC(2) - IF(LUSERI) ZMRI(1) = ZMRI(2) -! -! Compute thetav at the mass levels of the RS - ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:)+ZMRI(:)) -! -! Compute the heights at the mass levels of the RS - ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute thetav and heights of the wind levels - ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) - ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute Theta l and Rt - IF (.NOT. GUSERC .AND. .NOT. LUSERI) THEN - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) - ELSE - ALLOCATE(ZEXN(ILEVELM)) - ALLOCATE(ZT(ILEVELM)) - ALLOCATE(ZCPH(ILEVELM)) - ALLOCATE(ZLVOCPEXN(ILEVELM)) - ALLOCATE(ZLSOCPEXN(ILEVELM)) - ZRT(:)=ZMR(:)+ZMRI(:)+ZMRC(:) - ZEXN(:)=(ZPRESSM/XP00) ** (XRD/XCPD) - ZT(:)=ZTHV*(ZPRESSM(:)/XP00)**(ZRDSCPD)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) - ZCPH(:)=XCPD+ XCPV * ZMR(:)+ XCL *ZMRC(:) + XCI * ZMRI(:) - ZLVOCPEXN(:) = (XLVTT + (XCPV-XCL) * (ZT(:)-XTT))/(ZCPH*ZEXN(:)) - ZLSOCPEXN(:) = (XLSTT + (XCPV-XCI) * (ZT(:)-XTT))/(ZCPH*ZEXN(:)) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))-ZLVOCPEXN(:)*ZMRC(:)-ZLSOCPEXN(:)*ZMRI(:) - DEALLOCATE(ZEXN) - DEALLOCATE(ZT) - DEALLOCATE(ZCPH) - DEALLOCATE(ZLVOCPEXN) - DEALLOCATE(ZLSOCPEXN) - ENDIF -! -! -!* 2.7 PUVTHDHU case : zGROUND, PGROUND, ThdGROUND, HuGROUND -! (Pressure, U, V) , -! (Pressure, THd, Hu) -! - CASE ('PUVTHDHU') -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHDGROUND - READ(ILUPRE,*) ZHUGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate the required memory - ALLOCATE(ZPRESSU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) - ALLOCATE(ZTHVU(ILEVELU)) - ALLOCATE(ZHEIGHTU(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU = 1,ILEVELU - READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate the required memory - ALLOCATE(ZPRESSM(ILEVELM)) - ALLOCATE(ZTHD(ILEVELM)) - ALLOCATE(ZHU(ILEVELM)) - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZT(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM =2,ILEVELM - READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM), ZHU(JKM) - END DO -! Complete the mass arrays with the ground informations read in EXPRE file - ZPRESSM(1) = ZPGROUND ! Mass level 1 is at the ground - ZTHD(1) = ZTHDGROUND - ZHU(1) = ZHUGROUND -! - ZT(:) = ZTHD(:) * (ZPRESSM(:)/XP00)**ZRDSCPD ! compute T and mixing ratio - ZMR(:) = ZRDSRV*SM_FOES(ZT(:))/((ZPRESSM(:)*100./ZHU(:)) -SM_FOES(ZT(:))) - -! Compute thetav at the mass levels of the RS - ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)) -! -! Compute height at mass levels - ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute thetav and heights of the wind levels - ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) - ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute thetal and Rt - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) -! -!* 2.8 ZUVTHDMR case : zGROUND, PGROUND, ThdGROUND, RGROUND -! (height, U, V) , -! (height, THd, R) -! - CASE ('ZUVTHDMR') -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHDGROUND - READ(ILUPRE,*) ZMRGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate required memory - ALLOCATE(ZHEIGHTU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU = 1,ILEVELU - READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate required memory - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHD(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZMRC(ILEVELM)) - ZMRC=0 - ALLOCATE(ZMRI(ILEVELM)) - ZMRI=0 - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM= 2,ILEVELM - IF(LUSERI) THEN - READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM) - ELSEIF (GUSERC) THEN - READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM) - ELSE - READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM) - ENDIF - END DO -! Complete the mass arrays with the ground informations read in EXPRE file - ZHEIGHTM(1) = ZZGROUND ! Mass level 1 is at ground - ZTHD(1) = ZTHDGROUND - ZMR(1) = ZMRGROUND - IF(GUSERC) ZMRC(1) = ZMRC(2) - IF(LUSERI) ZMRI(1) = ZMRI(2) -! Compute thetav at the mass levels of the RS - IF(LUSERI) THEN - ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:)+ZMRI(:)) - ELSEIF (GUSERC) THEN - ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:)) - ELSE - ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)) - ENDIF -! -! Compute Theta l and Rt - IF (.NOT. GUSERC .AND. .NOT. LUSERI) THEN - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) - ELSE - ALLOCATE(ZEXN(ILEVELM)) - ALLOCATE(ZEXNFLUX(ILEVELM)) - ALLOCATE(ZT(ILEVELM)) - ALLOCATE(ZCPH(ILEVELM)) - ALLOCATE(ZLVOCPEXN(ILEVELM)) - ALLOCATE(ZLSOCPEXN(ILEVELM)) - ZRT(:)=ZMR(:)+ZMRI(:)+ZMRC(:) - ZEXNSURF=(ZPGROUND/XP00) ** (XRD/XCPD) - CALL COMPUTE_EXNER_FROM_GROUND(ZTHV,ZHEIGHTM,ZEXNSURF,ZEXNFLUX,ZEXN) - ZT(:)=ZTHV*ZEXN(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) - ZCPH(:)=XCPD+ XCPV * ZMR(:)+ XCL *ZMRC(:) + XCI * ZMRI(:) - ZLVOCPEXN(:) = (XLVTT + (XCPV-XCL) * (ZT(:)-XTT))/(ZCPH*ZEXN(:)) - ZLSOCPEXN(:) = (XLSTT + (XCPV-XCI) * (ZT(:)-XTT))/(ZCPH*ZEXN(:)) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))-ZLVOCPEXN(:)*ZMRC(:)-ZLSOCPEXN(:)*ZMRI(:) - DEALLOCATE(ZEXN) - DEALLOCATE(ZEXNFLUX) - DEALLOCATE(ZT) - DEALLOCATE(ZCPH) - DEALLOCATE(ZLVOCPEXN) - DEALLOCATE(ZLSOCPEXN) - ENDIF -! -! 2.9 ZUVTHLMR case : zGROUND, PGROUND, ThdGROUND, RGROUND -! (height, U, V) -! (height, THL, Rt) - -! - CASE ('ZUVTHLMR') -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHLGROUND - READ(ILUPRE,*) ZMRGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate required memory - ALLOCATE(ZHEIGHTU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU = 1,ILEVELU - READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate required memory - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZTH(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZMRC(ILEVELM)) - ZMRC=0 - ALLOCATE(ZMRI(ILEVELM)) - ZMRI=0 - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM= 2,ILEVELM -! IF(LUSERI) THEN -! READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM) -! ELSEIF (GUSERC) THEN - IF (GUSERC) THEN - READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM),ZMRC(JKM) - ELSE - READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM) - ENDIF - END DO -! Complete the mass arrays with the ground informations read in EXPRE file - ZHEIGHTM(1) = ZZGROUND ! Mass level 1 is at ground - ZTHL(1) = ZTHLGROUND - ZMR(1) = ZMRGROUND - IF(GUSERC) ZMRC(1) = ZMRC(2) -! IF(LUSERI) ZMRI(1) = ZMRI(2) -! -! Compute Rt - ZRT(:)=ZMR+ZMRC+ZMRI -! -!* 2.10 PUVTHU case : zGROUND, PGROUND, TempGROUND, HuGROUND -! (Pressure, U, V) , -! (Pressure, Temp, Hu) -! - CASE ('PUVTHU') -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTGROUND - READ(ILUPRE,*) ZHUGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate the required memory - ALLOCATE(ZPRESSU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) - ALLOCATE(ZTHVU(ILEVELU)) - ALLOCATE(ZHEIGHTU(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU = 1,ILEVELU - READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate the required memory - ALLOCATE(ZPRESSM(ILEVELM)) - ALLOCATE(ZTHD(ILEVELM)) - ALLOCATE(ZHU(ILEVELM)) - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZT(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) - -! -! Read the data at each mass level of the RS - DO JKM =2,ILEVELM - READ(ILUPRE,*) ZPRESSM(JKM),ZT(JKM), ZHU(JKM) - END DO -! Complete the mass arrays with the ground informations read in EXPRE file - ZPRESSM(1) = ZPGROUND ! Mass level 1 is at the ground - ZT(1) = ZTGROUND - ZHU(1) = ZHUGROUND -! - ZTHD(:) = ZT(:) / (ZPRESSM(:)/XP00)**ZRDSCPD ! compute THD and mixing ratio - ZMR(:) = ZRDSRV*SM_FOES(ZT(:))/((ZPRESSM(:)*100./ZHU(:)) -SM_FOES(ZT(:))) -! Compute thetav at the mass levels of the RS - ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)) -! -! Compute height at mass levels - ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute thetav and heights of the wind levels - ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) - ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) -! -! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) - CASE DEFAULT - CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','data type YKIND='//TRIM(YKIND)//' in PREFILE unknown') -END SELECT -! -!------------------------------------------------------------------------------- -! -!* 3. INTERPOLATE ON THE VERTICAL MIXED MODEL GRID -! --------------------------------------------------------- -! -! -! -IKU=SIZE(XZHAT) -! -!* 3.1 Compute mixed grid -! -IF (PRESENT(PCORIOZ)) THEN -! LGEOSBAL=T (no shift allowed, MNH grid without ororgraphy) - ZZS_LS(:,:)=0 -ELSE - IF (OSHIFT) THEN - ZZS_LS(:,:)=ZZGROUND - ELSE - ZZS_LS(:,:)=0 - ENDIF -ENDIF -CALL VERT_COORD(LSLEVE,ZZS_LS,ZZS_LS,XLEN1,XLEN2,XZHAT,ZZFLUX_MX) -ZZMASS_MX(:,:,:)=MZF(ZZFLUX_MX) -ZZMASS_MX(:,:,IKU)=1.5*ZZFLUX_MX(:,:,IKU)-0.5*ZZFLUX_MX(:,:,IKU-1) -! -!* 3.2 Interpolate and extrapolate U and V on w- mixed grid levels -! -!* vertical grid at initialization profile location -GPROFILE_IN_PROC=(KILOC+JPHEXT-IXOR_ll+1>=IIB .AND. KILOC+JPHEXT-IXOR_ll+1<=IIE) & - & .AND. (KJLOC+JPHEXT-IYOR_ll+1>=IJB .AND. KJLOC+JPHEXT-IYOR_ll+1<=IJE) -! -IF (GPROFILE_IN_PROC) THEN - ZZMASS_PROFILE(:) = ZZMASS_MX(KILOC+JPHEXT-IXOR_ll+1,KJLOC+JPHEXT-IYOR_ll+1,:) - ZZFLUX_PROFILE(:) = ZZFLUX_MX(KILOC+JPHEXT-IXOR_ll+1,KJLOC+JPHEXT-IYOR_ll+1,:) -ELSE - ZZMASS_PROFILE(:) = 0. - ZZFLUX_PROFILE(:) = 0. -END IF -DO JK = 1,IKU - CALL REDUCESUM_ll(ZZMASS_PROFILE(JK), IINFO_ll) - CALL REDUCESUM_ll(ZZFLUX_PROFILE(JK), IINFO_ll) -END DO - -! interpolation of U and V -DO JK = 1,IKU - IF (ZZFLUX_PROFILE(JK) <= ZHEIGHTU(1)) THEN ! extrapolation below the first level - ZDZSDH = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(1)) / (ZHEIGHTU(2) - ZHEIGHTU(1)) - ZUW(JK) = ZU(1) + (ZU(2) - ZU(1)) * ZDZSDH - ZVW(JK) = ZV(1) + (ZV(2) - ZV(1)) * ZDZSDH - ELSE IF (ZZFLUX_PROFILE(JK) > ZHEIGHTU(ILEVELU) ) THEN ! extrapolation above the last - ZDZSDH = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(ILEVELU)) & ! level - / (ZHEIGHTU(ILEVELU) - ZHEIGHTU(ILEVELU-1)) - ZUW(JK) = ZU(ILEVELU) + (ZU(ILEVELU) -ZU(ILEVELU -1)) * ZDZSDH - ZVW(JK) = ZV(ILEVELU) + (ZV(ILEVELU) -ZV(ILEVELU -1)) * ZDZSDH - ELSE ! interpolation between the first and last levels - DO JKLEV = 1,ILEVELU-1 - IF ( (ZZFLUX_PROFILE(JK) > ZHEIGHTU(JKLEV)).AND. & - (ZZFLUX_PROFILE(JK) <= ZHEIGHTU(JKLEV+1)) )THEN - ZDZ1SDH = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(JKLEV)) & - / (ZHEIGHTU(JKLEV+1)-ZHEIGHTU(JKLEV)) - ZDZ2SDH = (ZHEIGHTU(JKLEV+1) - ZZFLUX_PROFILE(JK) ) & - / (ZHEIGHTU(JKLEV+1)-ZHEIGHTU(JKLEV)) - ZUW(JK) = (ZU(JKLEV) * ZDZ2SDH) + (ZU(JKLEV+1) *ZDZ1SDH) - ZVW(JK) = (ZV(JKLEV) * ZDZ2SDH) + (ZV(JKLEV+1) *ZDZ1SDH) - END IF - END DO - END IF -END DO -! -!* 3.3 Interpolate and extrapolate Thetav and r on mass mixed grid levels -! -ZMRCM=0 -ZMRIM=0 -DO JK = 1,IKU - IF (ZZMASS_PROFILE(JK) <= ZHEIGHTM(1)) THEN ! extrapolation below the first level - ZDZSDH = (ZZMASS_PROFILE(JK) - ZHEIGHTM(1)) / (ZHEIGHTM(2) - ZHEIGHTM(1)) - ZTHLM(JK) = ZTHL(1) + (ZTHL(2) - ZTHL(1)) * ZDZSDH - ZMRM(JK) = ZRT(1) + (ZRT(2) - ZRT(1)) * ZDZSDH - IF (GUSERC) ZMRCM(JK) = ZMRC(1) + (ZMRC(2) - ZMRC(1)) * ZDZSDH - IF (LUSERI) ZMRIM(JK) = ZMRI(1) + (ZMRI(2) - ZMRI(1)) * ZDZSDH - ELSE IF (ZZMASS_PROFILE(JK) > ZHEIGHTM(ILEVELM) ) THEN ! extrapolation above the last - ZDZSDH = (ZZMASS_PROFILE(JK) - ZHEIGHTM(ILEVELM)) & ! level - / (ZHEIGHTM(ILEVELM) - ZHEIGHTM(ILEVELM-1)) - ZTHLM(JK) = ZTHL(ILEVELM) + (ZTHL(ILEVELM) -ZTHL(ILEVELM -1)) * ZDZSDH - ZMRM(JK) = ZRT(ILEVELM) + (ZRT(ILEVELM) -ZRT(ILEVELM -1)) * ZDZSDH - IF (GUSERC) ZMRCM(JK) = ZMRC(ILEVELM) + (ZMRC(ILEVELM) -ZMRC(ILEVELM -1)) * ZDZSDH - IF (LUSERI) ZMRIM(JK) = ZMRI(ILEVELM) + (ZMRI(ILEVELM) -ZMRI(ILEVELM -1)) * ZDZSDH - ELSE ! interpolation between the first and last levels - DO JKLEV = 1,ILEVELM-1 - IF ( (ZZMASS_PROFILE(JK) > ZHEIGHTM(JKLEV)).AND. & - (ZZMASS_PROFILE(JK) <= ZHEIGHTM(JKLEV+1)) )THEN - ZDZ1SDH = (ZZMASS_PROFILE(JK) - ZHEIGHTM(JKLEV)) & - / (ZHEIGHTM(JKLEV+1)-ZHEIGHTM(JKLEV)) - ZDZ2SDH = (ZHEIGHTM(JKLEV+1) - ZZMASS_PROFILE(JK) ) & - / (ZHEIGHTM(JKLEV+1)-ZHEIGHTM(JKLEV)) - ZTHLM(JK) = (ZTHL(JKLEV) * ZDZ2SDH) + (ZTHL(JKLEV+1) *ZDZ1SDH) - ZMRM(JK) = (ZRT(JKLEV) * ZDZ2SDH) + (ZRT(JKLEV+1) *ZDZ1SDH) - IF (GUSERC) ZMRCM(JK) = (ZMRC(JKLEV) * ZDZ2SDH) + (ZMRC(JKLEV+1) *ZDZ1SDH) - IF (LUSERI) ZMRIM(JK) = (ZMRI(JKLEV) * ZDZ2SDH) + (ZMRI(JKLEV+1) *ZDZ1SDH) - END IF - END DO - END IF -END DO -! -! Compute thetaV rv ri and Rc with adjustement -ALLOCATE(ZEXNFLUX(IKU)) -ALLOCATE(ZEXNMASS(IKU)) -ALLOCATE(ZPRESS(IKU)) -ALLOCATE(ZPREFLUX(IKU)) -ALLOCATE(ZFRAC_ICE(IKU)) -ALLOCATE(ZRSATW(IKU)) -ALLOCATE(ZRSATI(IKU)) -ALLOCATE(ZMRT(IKU)) -ALLOCATE(ZBUF(IKU,16)) -ZMRT=ZMRM+ZMRCM+ZMRIM -ZTHVM=ZTHLM -! -IF (LOCEAN) THEN - ZRHODM(:)=XRH00OCEAN*(1.-XALPHAOC*(ZTHLM(:) - XTH00OCEAN)& - +XBETAOC* (ZMRM(:) - XSA00OCEAN)) - ZPREFLUX(IKU)=ZPTOP - DO JK=IKU-1,2,-1 - ZPREFLUX(JK) = ZPREFLUX(JK+1) + XG*ZRHODM(JK)*(ZZFLUX_PROFILE(JK+1)-ZZFLUX_PROFILE(JK)) - END DO - ZPGROUND=ZPREFLUX(2) - WRITE(ILUOUT,FMT=*)'ZPGROUND i.e. Pressure at ocean domain bottom',ZPGROUND - ZTHM=ZTHVM -ELSE -! Atmospheric case - ZEXNSURF=(ZPGROUND/XP00)**(XRD/XCPD) - DO JLOOP=1,20 ! loop for pression - CALL COMPUTE_EXNER_FROM_GROUND(ZTHVM,ZZMASS_PROFILE(:),ZEXNSURF,ZEXNFLUX,ZEXNMASS) - ZPRESS(:)=XP00*(ZEXNMASS(:))**(XCPD/XRD) - CALL TH_R_FROM_THL_RT(CST,NEBN,SIZE(ZPRESS,1),'T',ZFRAC_ICE,ZPRESS,ZTHLM,ZMRT,ZTHM,ZMRM,ZMRCM,ZMRIM, & - ZRSATW, ZRSATI,OOCEAN=.FALSE.,& - PBUF=ZBUF) - ZTHVM(:)=ZTHM(:)*(1.+XRV/XRD*ZMRM(:))/(1.+(ZMRM(:)+ZMRIM(:)+ZMRCM(:))) - ENDDO -ENDIF -! -DEALLOCATE(ZEXNFLUX) -DEALLOCATE(ZEXNMASS) -DEALLOCATE(ZPRESS) -DEALLOCATE(ZFRAC_ICE) -DEALLOCATE(ZRSATW) -DEALLOCATE(ZRSATI) -DEALLOCATE(ZMRT) -DEALLOCATE(ZBUF) -!------------------------------------------------------------------------------- -! -!* 4. COMPUTE FIELDS ON THE MODEL GRID (WITH OROGRAPHY) -! ------------------------------------------------- -CALL SET_MASS(TPFILE,GPROFILE_IN_PROC, ZZFLUX_PROFILE, & - KILOC+JPHEXT,KJLOC+JPHEXT,ZZS_LS,ZZMASS_MX,ZZFLUX_MX,ZPGROUND,& - ZTHVM,ZMRM,ZUW,ZVW,OSHIFT,OBOUSS,PJ,HFUNU,HFUNV, & - PMRCM=ZMRCM,PMRIM=ZMRIM,PCORIOZ=PCORIOZ) -! -DEALLOCATE(ZPREFLUX) -DEALLOCATE(ZHEIGHTM) -DEALLOCATE(ZTHV) -DEALLOCATE(ZMR) -DEALLOCATE(ZTHL) -!------------------------------------------------------------------------------- -CONTAINS - SUBROUTINE CHECK( ISTATUS, YLOC ) - INTEGER(KIND=CDFINT), INTENT(IN) :: ISTATUS - CHARACTER(LEN=*), INTENT(IN) :: YLOC - - IF( ISTATUS /= NF90_NOERR ) THEN - CALL PRINT_MSG( NVERB_ERROR, 'IO', 'SET_RSOU', 'error at ' // Trim( yloc) // ': ' // NF90_STRERROR( ISTATUS ) ) - END IF - END SUBROUTINE check - ! - INCLUDE "th_r_from_thl_rt.func.h" - INCLUDE "compute_frac_ice.func.h" - ! -END SUBROUTINE SET_RSOU diff --git a/src/PHYEX/ext/shallow_mf_pack.f90 b/src/PHYEX/ext/shallow_mf_pack.f90 deleted file mode 100644 index 1f76d9759..000000000 --- a/src/PHYEX/ext/shallow_mf_pack.f90 +++ /dev/null @@ -1,381 +0,0 @@ -!MNH_LIC Copyright 2010-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ###################### - MODULE MODI_SHALLOW_MF_PACK -! ###################### -! -INTERFACE -! ################################################################# - SUBROUTINE SHALLOW_MF_PACK(KRR,KRRL,KRRI, & - TPFILE,PTIME_LES, & - PTSTEP, & - PDZZ, PZZ, PDX,PDY, & - PRHODJ, PRHODREF, & - PPABSM, PEXN, & - PSFTH,PSFRV, & - PTHM,PRM,PUM,PVM,PTKEM,PSVM, & - PRTHS,PRRS,PRUS,PRVS,PRSVS, & - PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF ) -! ################################################################# -!! -use MODD_IO, only: TFILEDATA -use modd_precision, only: MNHTIME -! -!* 1.1 Declaration of Arguments -! -! -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. -INTEGER, INTENT(IN) :: KRRI ! number of ice water var. -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -REAL(kind=MNHTIME),DIMENSION(2), INTENT(OUT) :: PTIME_LES ! time spent in LES computations -REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height of flux point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry density of the - ! reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXN ! Exner function at t-dt - -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at t-dt -REAL, DIMENSION(:,:,:,:),INTENT(IN):: PRM ! water var. at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM ! wind components at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! tke at t-dt - -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar variable a t-dt - -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS,PRVS,PRTHS ! Meso-NH sources -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Scalar sources -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme -! -REAL, INTENT(IN) :: PDX,PDY ! Size of mesh in X/Y directions -END SUBROUTINE SHALLOW_MF_PACK - -END INTERFACE -! -END MODULE MODI_SHALLOW_MF_PACK - -! ################################################################# - SUBROUTINE SHALLOW_MF_PACK(KRR,KRRL,KRRI, & - TPFILE,PTIME_LES, & - PTSTEP, & - PDZZ, PZZ, PDX,PDY, & - PRHODJ, PRHODREF, & - PPABSM, PEXN, & - PSFTH,PSFRV, & - PTHM,PRM,PUM,PVM,PTKEM,PSVM, & - PRTHS,PRRS,PRUS,PRVS,PRSVS, & - PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF ) -! ################################################################# -!! -!!**** *SHALLOW_MF_PACK* - -!! -!! -!! PURPOSE -!! ------- -!!**** The purpose of this routine is -!! -! -!!** METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! V.Masson 09/2010 -! -------------------------------------------------------------------------- -! Modifications: -! R. Honnert 07/2012: introduction of vertical wind for the height of the thermal -! M. Leriche 02/2017: avoid negative values for sv tendencies -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! S. Riette 11/2016: support for CFRAC_ICE_SHALLOW_MF -! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables -! P. Wautelet 02/2020: use the new data structures and subroutines for budgets -! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY: CST -USE MODD_NEB_n, ONLY: NEBN -USE MODD_TURB_n, ONLY: TURBN -USE MODD_CTURB, ONLY: CSTURB -USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN, LMF_FLX -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -! -USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX -! -USE MODD_BUDGET, ONLY: TBUDGETS,TBUCONF,lbudget_th,nbudget_th -USE MODD_CONF -USE MODD_IO, ONLY: TFILEDATA -use modd_field, ONLY: tfieldmetadata, TYPEREAL -USE MODD_NSV, ONLY: XSVMIN, NSV_LGBEG, NSV_LGEND -USE MODD_PARAMETERS -USE MODD_PARAM_MFSHALL_n -USE modd_precision, ONLY: MNHTIME - -USE mode_budget, ONLY: Budget_store_init, Budget_store_end, Budget_store_add -USE MODE_IO_FIELD_WRITE, ONLY: IO_Field_write - -USE MODI_DIAGNOS_LES_MF -USE MODI_SHALLOW_MF -USE MODI_SHUMAN -! -IMPLICIT NONE - -!* 0.1 Declaration of Arguments -! -! -! -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. -INTEGER, INTENT(IN) :: KRRI ! number of ice water var. -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -REAL(kind=MNHTIME),DIMENSION(2), INTENT(OUT) :: PTIME_LES ! time spent in LES computations -REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height of flux point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry density of the - ! reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXN ! Exner function at t-dt - -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at t-dt -REAL, DIMENSION(:,:,:,:),INTENT(IN):: PRM ! water var. at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM ! wind components at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! tke at t-dt - -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar variable a t-dt - -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS,PRVS,PRTHS ! Meso-NH sources -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Scalar sources -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme -! -REAL, INTENT(IN) :: PDX,PDY ! Size of mesh in X/Y directions -! -! 0.2 Declaration of local variables -! -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDUDT_TURB ! tendency of U by turbulence only -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDVDT_TURB ! tendency of V by turbulence only -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDTHLDT_TURB ! tendency of thl by turbulence only -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDRTDT_TURB ! tendency of rt by turbulence only -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) :: ZDSVDT_TURB ! tendency of Sv by turbulence only -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDUDT_MF ! tendency of U by massflux scheme -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDVDT_MF ! tendency of V by massflux scheme -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDTHLDT_MF ! tendency of thl by massflux scheme -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDRTDT_MF ! tendency of Rt by massflux scheme -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) :: ZDSVDT_MF ! tendency of Sv by massflux scheme -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZSIGMF,ZRC_MF,ZRI_MF,ZCF_MF ! cloud info for the cloud scheme -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZTHVMF ! Thermal production for TKE scheme -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZTHMF -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZRMF -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZUMF -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZVMF -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZTHL_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRT_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRV_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZU_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZV_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRC_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRI_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZTHV_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZW_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFRAC_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZEMF ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDETR ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZENTR ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZUMM ! wind on mass point -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZVMM ! wind on mass point -! -INTEGER,DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2)) :: IKLCL,IKETL,IKCTL ! level of LCL,ETL and CTL -INTEGER :: IIU, IJU, IKU, IKB, IKE, IRR, ISV -INTEGER :: JK,JRR,JSV ! Loop counters - -LOGICAL :: LSTATNW ! switch for HARMONIE-AROME turb physics option - ! TODO: linked with modd_turbn + init at default_desfmn - -TYPE(TFIELDMETADATA) :: TZFIELD -TYPE(DIMPHYEX_t) :: YLDIMPHYEXPACK -!------------------------------------------------------------------------ -! -!!! 1. Initialisation -CALL FILL_DIMPHYEX(YLDIMPHYEXPACK, SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3)) -! -! Internal Domain -IIU=SIZE(PTHM,1) -IJU=SIZE(PTHM,2) -IKU=SIZE(PTHM,3) -IKB=1+JPVEXT -IKE=IKU-JPVEXT -! -! number of moist var -IRR=SIZE(PRM,4) -! number of scalar var -ISV=SIZE(PSVM,4) -! -! wind on mass points -ZUMM=MXF(PUM) -ZVMM=MYF(PVM) -! -!!! 2. Call of the physical parameterization of massflux vertical transport -! -LSTATNW = .FALSE. -! -CALL SHALLOW_MF(YLDIMPHYEXPACK, CST, NEBN, PARAM_MFSHALLN, TURBN, CSTURB,& - KRR,KRRL,KRRI,ISV, & - LNOMIXLG,NSV_LGBEG,NSV_LGEND, & - PTSTEP, & - PDZZ, PZZ, & - PRHODJ,PRHODREF, & - PPABSM, PEXN, & - PSFTH,PSFRV, & - PTHM,PRM,ZUMM,ZVMM,PTKEM,PSVM, & - ZDUDT_MF,ZDVDT_MF, & - ZDTHLDT_MF,ZDRTDT_MF,ZDSVDT_MF, & - ZSIGMF,ZRC_MF,ZRI_MF,ZCF_MF,ZFLXZTHVMF, & - ZFLXZTHMF,ZFLXZRMF,ZFLXZUMF,ZFLXZVMF, & - ZTHL_UP,ZRT_UP,ZRV_UP,ZRC_UP,ZRI_UP, & - ZU_UP, ZV_UP, ZTHV_UP, ZW_UP, & - ZFRAC_UP,ZEMF,ZDETR,ZENTR, & - IKLCL,IKETL,IKCTL,PDX,PDY,PRSVS,XSVMIN, & - TBUCONF, TBUDGETS,SIZE(TBUDGETS) ) -! -! Fill non-declared-explicit-dimensions output variables -PSIGMF(:,:,:) = ZSIGMF(:,:,:) -PRC_MF(:,:,:) = ZRC_MF(:,:,:) -PRI_MF(:,:,:) = ZRI_MF(:,:,:) -PCF_MF(:,:,:) = ZCF_MF(:,:,:) -PFLXZTHVMF(:,:,:) = ZFLXZTHVMF(:,:,:) -! -!!! 3. Compute source terms for Meso-NH pronostic variables -!!! ---------------------------------------------------- -! -! As the pronostic variable of Meso-Nh are not (yet) the conservative variables -! the thl tendency is put in th and the rt tendency in rv -! the adjustment will do later the repartition between vapor and cloud -PRTHS(:,:,:) = PRTHS(:,:,:) + & - PRHODJ(:,:,:)*ZDTHLDT_MF(:,:,:) -PRRS(:,:,:,1) = PRRS(:,:,:,1) + & - PRHODJ(:,:,:)*ZDRTDT_MF(:,:,:) -PRUS(:,:,:) = PRUS(:,:,:) +MXM( & - PRHODJ(:,:,:)*ZDUDT_MF(:,:,:)) -PRVS(:,:,:) = PRVS(:,:,:) +MYM( & - PRHODJ(:,:,:)*ZDVDT_MF(:,:,:)) -! -DO JSV=1,ISV - IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE - PRSVS(:,:,:,JSV) = MAX((PRSVS(:,:,:,JSV) + & - PRHODJ(:,:,:)*ZDSVDT_MF(:,:,:,JSV)),XSVMIN(JSV)) -END DO -! -!!! 4. Prints the fluxes in output file -! -IF ( LMF_FLX .AND. tpfile%lopened ) THEN - ! stores the conservative potential temperature vertical flux - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'MF_THW_FLX', & - CSTDNAME = '', & - CLONGNAME = 'MF_THW_FLX', & - CUNITS = 'K m s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_MF_THW_FLX', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZTHMF) - ! - ! stores the conservative mixing ratio vertical flux - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'MF_RCONSW_FLX', & - CSTDNAME = '', & - CLONGNAME = 'MF_RCONSW_FLX', & - CUNITS = 'K m s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_MF_RCONSW_FLX', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZRMF) - ! - ! stores the theta_v vertical flux - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'MF_THVW_FLX', & - CSTDNAME = '', & - CLONGNAME = 'MF_THVW_FLX', & - CUNITS = 'K m s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_MF_THVW_FLX', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,PFLXZTHVMF) - ! - IF (PARAM_MFSHALLN%LMIXUV) THEN - ! stores the U momentum vertical flux - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'MF_UW_FLX', & - CSTDNAME = '', & - CLONGNAME = 'MF_UW_FLX', & - CUNITS = 'm2 s-2', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_MF_UW_FLX', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZUMF) - ! - ! stores the V momentum vertical flux - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'MF_VW_FLX', & - CSTDNAME = '', & - CLONGNAME = 'MF_VW_FLX', & - CUNITS = 'm2 s-2', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_MF_VW_FLX', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZVMF) - ! - END IF -END IF -! -!!! 5. Externalised LES Diagnostic for Mass Flux Scheme -!!! ------------------------------------------------ -! - CALL DIAGNOS_LES_MF(IIU,IJU,IKU,PTIME_LES, & - ZTHL_UP,ZRT_UP,ZRV_UP,ZRC_UP,ZRI_UP, & - ZU_UP,ZV_UP,ZTHV_UP,ZW_UP, & - ZFRAC_UP,ZEMF,ZDETR,ZENTR, & - ZFLXZTHMF,ZFLXZTHVMF,ZFLXZRMF, & - ZFLXZUMF,ZFLXZVMF, & - IKLCL,IKETL,IKCTL ) -! -END SUBROUTINE SHALLOW_MF_PACK diff --git a/src/PHYEX/ext/spawn_model2.f90 b/src/PHYEX/ext/spawn_model2.f90 deleted file mode 100644 index 3511cd27f..000000000 --- a/src/PHYEX/ext/spawn_model2.f90 +++ /dev/null @@ -1,1696 +0,0 @@ -!MNH_LIC Copyright 1995-2022 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!######################## -MODULE MODI_SPAWN_MODEL2 -!######################## -! -INTERFACE -! - SUBROUTINE SPAWN_MODEL2 (KRR,KSV_USER,HTURB,HSURF,HCLOUD, & - HCHEM_INPUT_FILE,HSPAFILE,HSPANBR, & - HSONFILE,HINIFILE,HINIFILEPGD,OSPAWN_SURF ) -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSV_USER ! Number of Users Scalar Variables -CHARACTER (LEN=4), INTENT(IN) :: HTURB ! Kind of turbulence parameterization -CHARACTER (LEN=4), INTENT(IN) :: HSURF ! Kind of surface parameterization -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of cloud parameterization - ! model 2 physical domain -CHARACTER (LEN=*), INTENT(IN) :: HSPAFILE ! possible name of the output FM-file -CHARACTER (LEN=*), INTENT(IN) :: HSPANBR ! NumBeR associated to the SPAwned file -CHARACTER (LEN=*), INTENT(IN) :: HSONFILE ! name of the input FM-file SON -CHARACTER (LEN=80), INTENT(IN) :: HCHEM_INPUT_FILE -CHARACTER (LEN=*), INTENT(IN) :: HINIFILE ! Input file -CHARACTER (LEN=*), INTENT(IN) :: HINIFILEPGD ! Input pgd file -LOGICAL, INTENT(IN) :: OSPAWN_SURF ! flag to spawn surface fields -! -END SUBROUTINE SPAWN_MODEL2 -! -END INTERFACE -! -END MODULE MODI_SPAWN_MODEL2 -! ######spl - SUBROUTINE SPAWN_MODEL2 (KRR,KSV_USER,HTURB,HSURF,HCLOUD, & - HCHEM_INPUT_FILE,HSPAFILE,HSPANBR, & - HSONFILE,HINIFILE,HINIFILEPGD,OSPAWN_SURF ) -! ####################################################################### -! -!!**** *SPAWN_MODEL2 * - subroutine to prepare by horizontal interpolation and -!! write an initial FM-file spawned from an other FM-file. -!! -!! PURPOSE -!! ------- -!! -!! Initializes by horizontal interpolation, the model 2 in a sub-domain of -!! model 1, possibly overwrites model 2 information by model SON1, -!! and writes the resulting fields in a FM-file. -!! -!! -!!** METHOD -!! ------ -!! -!! In this routine, only the model 2 variables are known through the -!! MODD_... calls. -!! -!! The directives to perform the preparation of the initial FM -!! file are stored in EXSPA.nam file. -!! -!! The following SPAWN_MODEL2 routine : -!! -!! - sets default values of DESFM files -!! - reads the namelists part of EXSPA file which gives the -!! directives concerning the spawning to perform -!! - controls the domain size of model 2 and initializes its -!! configuration for parameterizations and LBC -!! - allocates memory for arrays -!! - computes the interpolation coefficients needed to spawn model 2 -!! 2 types of interpolations are used: -!! 1. Clark and Farley (JAS 1984) on 9 points -!! 2. Bikhardt on 16 points -!! - initializes fields -!! - reads SON1 fields and overwrites on common domain -!! - writes the DESFM file (variables written have been initialized -!! by reading the DESFM file concerning the model 1) -!! - writes the LFIFM file. -!! -!! Finally some control prints are performed on the output listing. -!! -!! EXTERNAL -!! -------- -!! -!! Module MODE_GRIDPROJ : contains conformal projection routines -!! SM_GRIDPROJ : to compute some grid variables, in -!! case of conformal projection. -!! Module MODE_GRIDCART : contains cartesian geometry routines -!! SM_GRIDCART : to compute some grid variables, in -!! case of cartesian geometry. -!! SET_REF : to compute rhoJ -!! TOTAL_DMASS : to compute the total mass of dry air -!! ANEL_BALANCE2 : to apply an anelastic correction in the case of changing -!! resolution between the two models -!! IO_File_open : to open a FM-file (DESFM + LFIFM) -!! WRITE_DESFM : to write the DESFM file -!! WRITE_LFIFM : to write the LFIFM file -!! IO_File_close : to close a FM-file (DESFM + LFIFM) -!! INI_BIKHARDT2 : initializes Bikhardt coefficients -!! -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! Module MODD_PARAMETERS : contains parameters -!! Module MODD_CONF : contains configuration variables for all models -!! Module MODD_CTURB : -!! XTKEMIN : mimimum value for the TKE -!! Module MODD_GRID : contains grid variables for all models -!! Module USE MODD_DYN : contains configuration for the dynamics -!! Module MODD_REF : contains reference state variables for -!! all models -!! -!! Module MODD_DIM2 : contains dimensions -!! Module MODD_CONF2 : contains configuration variables -!! Module MODD_GRID2 : contains grid variables -!! Module MODD_TIME2 : contains time variables and uses MODD_TIME -!! Module MODD_REF2 : contains reference state variables -!! Module MODD_FIELD2 : contains prognostic variables -!! Module MODD_LSFIELD2 : contains Larger Scale fields -!! Module MODD_GR_FIELD2 : contains surface fields -!! Module MODD_DYN2 : contains dynamic control variables for model 2 -!! Module MODD_LBC2 : contains lbc control variables for model 2 -!! Module MODD_PARAM2 : contains configuration for physical parameterizations -!! -!! REFERENCE -!! --------- -!! -!! PROGRAM SPAWN_MODEL2 (Book2 of the documentation) -!! -!! -!! AUTHOR -!! ------ -!! -!! J.P. Lafore * METEO-FRANCE * -!! -!! MODIFICATIONS -!! ------------- -!! -!! Original 11/01/95 -!! Modification 27/04/95 (I.Mallet) remove R from the historical variables -!! Modification 16/04/96 (Lafore) Different resolution ratio case introduction -!! Modification 24/04/96 (Lafore & Masson) Initialization of LUSERWs -!! Modification 24/04/96 (Masson) Correction of positivity on Rw and TKE -!! Modification 25/04/96 (Masson) Copies of internal zs on external points -!! Modification 02/05/96 (Stein Jabouille) initialize CCONF -!! Modification 31/05/96 (Lafore) Cumputing time analysis -!! Modification 10/06/96 (Masson) Call to anel_balance in all cases -!! Modification 10/06/96 (Masson) Bikhardt and Clark_and_Farley coefficients -!! incorporated in modules -!! Modification 12/06/96 (Masson) default values of NJMAX and KDYRATIO -!! if 2D version of the model -!! Modification 13/06/96 (Masson) choice of the name of the spawned file -!! Modification 30/07/96 (Lafore) MY_NAME and DAD_NAME writing for nesting -!! Modification 25/09/96 (Masson) grid optionnaly given by a fm file -!! and number of points given relatively -!! to model 1 -!! Modification 10/10/96 (Masson) L1D and L2D verifications -!! Modification 12/11/96 (Masson) allocations of XSRCM and XSRCT -!! Modification 19/11/96 (Masson) add deep convection -!! Modification 26/11/96 (Lafore) spawning configuration writing on the FM-file -!! Modification 26/11/96 (Lafore) replacing of TOTAL_DMASS by REAL_DMASS -!! Modification 27/02/97 (Lafore) "surfacic" LS fields -!! Modification 10/04/97 (Lafore) proper treatment of minima -!! Modification 09/07/97 (Masson) absolute pressure and directional z0 -!! Modification 10/07/97 (Masson) routines SPAWN_PRESSURE2 and DRY_MASS -!! Modification 17/07/97 (Masson) vertical interpolations and EPS -!! Modification 29/07/97 (Masson) split mode_lfifm_pgd -!! Modification 10/08/97 (Lafore) initialization of LUSERV -!! Modification 14/09/97 (Masson) use of relative humidity -!! Modification 08/12/97 (Masson) deallocation of model 1 variables -!! Modification 24/12/97 (Masson) directional z0 parameters and orographies -!! Modification 20/07/98 (Stein ) add the LB fields -!! Modification 15/03/99 (Masson) cover types -!! Modification 15/07/99 (Jabouille) shift domain initialization in INI_SIZE_SPAWN -!! Modification 04/01/00 (Masson) removes TSZ0 option -!! Modification 29/11/02 (Pinty) add C3R5, ICE2, ICE4 -!! Modification 07/07/05 (D.Barbary) spawn with 2 input files (father+son1) -!! Modification 20/05/06 Remove EPS, Clark and Farley interpolation -!! Replace DRY_MASS by TOTAL_DMASS -!! Modification 06/12 (M.Tomasini) Interpolation of the advective forcing (ADVFRC) -!! and of the turbulent fluxes (EDDY_FLUX) -!! Modification 07/13 (Bosseur & Filippi) Adds Forefire -!! 24/04/2014 (J.escobar) bypass CRAY internal compiler error on IIJ computation -!! Modification 06/2014 (C.Lac) Initialization of physical param of -!! model2 before the call to ini_nsv -!! Modification 05/02/2015 (M.Moge) parallelization of SPAWNING -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! J.Escobar 02/05/2016 : test ZZS_MAX in // -!! P.Wautelet 08/07/2016 : removed MNH_NCWRIT define -!! J.Escobar 12/07/2016 : add test on NRIMY & change the one on NRIMX with >= -!! Modification 01/2016 (JP Pinty) Add LIMA -!! 10/2016 (C.Lac) Add droplet deposition -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -! S. Bielli 02/2019: sea salt: significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 22/02/2019: replace Hollerith edit descriptor (deleted from Fortran 95 standard) -! P. Wautelet 14/03/2019: correct ZWS when variable not present in file -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv -! P. Wautelet 24/03/2021: bugfix: allocate XLSRVM, XINPAP and XACPAP to zero size when not needed -!! 03/2021 (JL Redelsperger) Ocean model case -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS ! Declarative modules -USE MODD_CST -USE MODD_CONF -USE MODD_CTURB -USE MODD_GRID -USE MODD_REF -USE MODD_DYN -USE MODD_NESTING -USE MODD_SPAWN -USE MODD_NSV -USE MODD_PASPOL -! -USE MODD_DIM_n -USE MODD_DYN_n -USE MODD_CONF_n -USE MODD_LBC_n -USE MODD_GRID_n -USE MODD_TIME_n -USE MODD_REF_n -USE MODD_FIELD_n -USE MODD_LSFIELD_n -USE MODD_DUMMY_GR_FIELD_n -USE MODD_PRECIP_n -USE MODD_ELEC_n -USE MODD_LUNIT_n -USE MODD_PARAM_n -USE MODD_TURB_n -USE MODD_METRICS_n -USE MODD_CH_MNHC_n -USE MODD_PASPOL_n -!$20140515 -USE MODD_VAR_ll, ONLY : NPROC -USE MODD_IO, ONLY: TFILEDATA,TFILE_DUMMY,TFILE_SURFEX -use modd_precision, only: MNHREAL_MPI -! -USE MODE_GRIDCART ! Executive modules -USE MODE_GRIDPROJ -USE MODE_ll -USE MODE_MSG -! -USE MODI_READ_HGRID -USE MODI_SPAWN_GRID2 -USE MODI_SPAWN_FIELD2 -USE MODI_SPAWN_SURF -USE MODI_VER_INTERP_FIELD -USE MODI_SPAWN_PRESSURE2 -USE MODI_SPAWN_SURF2_RAIN -USE MODI_SET_REF -USE MODI_TOTAL_DMASS -USE MODI_ANEL_BALANCE_n -USE MODI_WRITE_DESFM_n -USE MODI_WRITE_LFIFM_n -USE MODI_METRICS -USE MODI_INI_BIKHARDT_n -USE MODI_DEALLOCATE_MODEL1 -USE MODI_BOUNDARIES -USE MODI_INI_NSV -!$20140710 -USE MODI_UPDATE_METRICS -! -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_IO_FIELD_WRITE, only: IO_Header_write -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -USE MODE_MODELN_HANDLER -USE MODE_MPPDB -! -USE MODE_THERMO -! -USE MODI_SECOND_MNH -! -! Modules for EDDY_FLUX -USE MODD_LATZ_EDFLX -USE MODD_DEF_EDDY_FLUX_n -USE MODD_DEF_EDDYUV_FLUX_n -USE MODD_ADVFRC_n -USE MODD_RELFRC_n -USE MODD_2D_FRC -! -!USE MODE_LB_ll, ONLY : SET_LB_FIELD_ll -USE MODI_GET_SIZEX_LB -USE MODI_GET_SIZEY_LB -! -USE MODD_LIMA_PRECIP_SCAVENGING_n -USE MODD_PARAM_LIMA, ONLY : MDEPOC=>LDEPOC, LSCAV -USE MODD_PARAM_ICE_n, ONLY : LDEPOSC -USE MODD_PARAM_C2R2, ONLY : LDEPOC -USE MODD_PASPOL, ONLY : LPASPOL -! -USE MODD_MPIF -USE MODD_VAR_ll -use modd_precision, only: LFIINT -! -IMPLICIT NONE -! -!* 0.1.1 Declarations of global variables not declared in the modules : -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZJ ! Jacobian -! -! -!* 0.1.2 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSV_USER ! Number of Users Scalar Variables -CHARACTER (LEN=4), INTENT(IN) :: HTURB ! Kind of turbulence parameterization -CHARACTER (LEN=4), INTENT(IN) :: HSURF ! Kind of surface parameterization -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of cloud parameterization -CHARACTER (LEN=*), INTENT(IN) :: HSPAFILE ! possible name of the output FM-file -CHARACTER (LEN=*), INTENT(IN) :: HSPANBR ! NumBeR associated to the SPAwned file -CHARACTER (LEN=*), INTENT(IN) :: HSONFILE ! name of the input FM-file SON -CHARACTER (LEN=80), INTENT(IN) :: HCHEM_INPUT_FILE -CHARACTER (LEN=*), INTENT(IN) :: HINIFILE ! Input file -CHARACTER (LEN=*), INTENT(IN) :: HINIFILEPGD ! Input pgd file -LOGICAL, INTENT(IN) :: OSPAWN_SURF ! flag to spawn surface fields -! -!* 0.1.3 Declarations of local variables : -! -! -INTEGER :: ILUOUT ! Logical unit number for the output listing -INTEGER(KIND=LFIINT) :: INPRAR ! Number of articles predicted in the LFIFM file -! -! -INTEGER :: IIU ! Upper dimension in x direction -INTEGER :: IJU ! Upper dimension in y direction -INTEGER :: IKU ! Upper dimension in z direction -INTEGER :: IIB ! indice I Beginning in x direction -INTEGER :: IJB ! indice J Beginning in y direction -INTEGER :: IKB ! indice K Beginning in z direction -INTEGER :: IIE ! indice I End in x direction -INTEGER :: IJE ! indice J End in y direction -INTEGER :: IKE ! indice K End in z direction -INTEGER :: JK ! Loop index in z direction -INTEGER :: JLOOP,JKLOOP ! Loop indexes -INTEGER :: JSV ! loop index for scalar variables -INTEGER :: JRR ! loop index for moist variables -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZZS_LS ! large scale interpolated zs -REAL, DIMENSION(:,:), ALLOCATABLE :: ZZSMT_LS ! large scale interpolated smooth zs -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZZ_LS ! large scale interpolated z -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHVT ! virtual potential temperature -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZHUT ! relative humidity -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSUMRT ! sum of water ratios -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHOD ! dry density -! -REAL :: ZTIME1,ZTIME2,ZSTART,ZEND,ZTOT,ZALL,ZPERCALL ! for computing time analysis -REAL :: ZGRID2, ZSURF2, ZFIELD2, ZVER, & - ZPRESSURE2, ZANEL, ZWRITE, ZMISC -REAL :: ZPERCGRID2,ZPERCSURF2,ZPERCFIELD2, ZPERCVER, & - ZPERCPRESSURE2, ZPERCANEL, ZPERCWRITE,ZPERCMISC -! -INTEGER, DIMENSION(2) :: IIJ -INTEGER :: IK4000 -INTEGER :: IMI ! Old Model index -! -! Spawning variables for the SON 1 (input one) -INTEGER :: IIMAXSON,IJMAXSON ! physical dimensions -INTEGER :: IIUSON,IJUSON ! upper dimensions -INTEGER :: IXSIZESON,IYSIZESON ! sizes according to model1 grid -INTEGER :: IDXRATIOSON,IDYRATIOSON ! x and y-resolution ratios -INTEGER :: IXORSON,IYORSON ! horizontal position -INTEGER :: IXENDSON,IYENDSON !in x and y directions -! Common indexes for the SON 2 (output one, model2) -INTEGER :: IIB2 ! indice I Beginning in x direction -INTEGER :: IJB2 ! indice J Beginning in y direction -INTEGER :: IIE2 ! indice I End in x direction -INTEGER :: IJE2 ! indice J End in y direction -! Common indexes for the SON 1 (input one) -INTEGER :: IIB1 ! indice I Beginning in x direction -INTEGER :: IJB1 ! indice J Beginning in y direction -INTEGER :: IIE1 ! indice I End in x direction -INTEGER :: IJE1 ! indice J End in y direction -! Logical for no common domain between the 2 sons or no input son -LOGICAL :: GNOSON = .TRUE. -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D ! working array -CHARACTER(LEN=28) :: YDAD_SON -!$ -INTEGER :: IINFO_ll -TYPE(LIST_ll), POINTER :: TZFIELDS_ll=>NULL() ! list of fields to exchange -INTEGER :: NXOR_TMP, NYOR_TMP, NXEND_TMP, NYEND_TMP -INTEGER :: IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU ! dimensions of the -INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2 ! West-east LB arrays -INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV ! dimensions of the -INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2 ! North-south LB arrays -! -CHARACTER(LEN=4) :: YLBTYPE -! -INTEGER,DIMENSION(:,:),ALLOCATABLE :: IJCOUNT -! -REAL :: ZZS_MAX, ZZS_MAX_ll -! -TYPE(TFILEDATA),POINTER :: TZFILE => NULL() -TYPE(TFILEDATA),POINTER :: TZSONFILE => NULL() -!------------------------------------------------------------------------------- -! -! Save model index and switch to model 2 variables -IMI = GET_CURRENT_MODEL_INDEX() -CALL GOTO_MODEL(2) -CSTORAGE_TYPE='TT' -! -ILUOUT=TLUOUT%NLU -! -!* 1. INITIALIZATIONS : -! --------------- -! -!* 1.1 time analysis : -! ------------- -! -ZTIME1 = 0 -ZTIME2 = 0 -ZSTART = 0 -ZEND = 0 -ZGRID2 = 0 -ZSURF2 = 0 -ZFIELD2= 0 -ZANEL = 0 -ZWRITE = 0 -ZPERCGRID2 = 0 -ZPERCSURF2 = 0 -ZPERCFIELD2= 0 -ZPERCANEL = 0 -ZPERCWRITE = 0 -! -CALL SECOND_MNH(ZSTART) -! -ZTIME1 = ZSTART -! -!* 1.2 deallocates not used model 1 variables : -! -------------------------------------- -! -CALL DEALLOCATE_MODEL1(1) -CALL DEALLOCATE_MODEL1(2) -! -!------------------------------------------------------------------------------- -! -! -!* 3. PROLOGUE: -! -------- -! -!* 3.1 Compute dimensions of model 2 and other indices -! -NIMAX_ll = NXSIZE * NDXRATIO -NJMAX_ll = NYSIZE * NDYRATIO -! -IF (NIMAX_ll==1 .AND. NJMAX_ll==1) THEN - L1D=.TRUE. - L2D=.FALSE. -ELSE IF (NJMAX_ll==1) THEN - L1D=.FALSE. - L2D=.TRUE. -ELSE - L1D=.FALSE. - L2D=.FALSE. -END IF -! -CALL GET_DIM_EXT_ll('B',IIU,IJU) -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -NIMAX = IIE-IIB+1 -NJMAX = IJE-IJB+1 -!$ -IKU = SIZE(XTHVREFZ,1) -NKMAX = IKU - 2*JPVEXT ! initialization of NKMAX (MODD_DIM2) -! -IKB = 1 + JPVEXT -IKE = IKU - JPVEXT -! -! -!* 3.2 Position of model 2 domain relative to model 1 and controls -! -!$20140506 the condition on NXSIZE*NXRATIO ==IIE-IIB+1 only works for monoproc -!$then cancel it -!IF ( (NXSIZE*NDXRATIO) /= (IIE-IIB+1) ) THEN -! WRITE(ILUOUT,*) 'SPAWN_MODEL2: MODEL 2 DOMAIN X-SIZE INCOHERENT WITH THE', & -! ' MODEL1 MESH ',' IIB = ',IIB,' IIE = ', IIE ,'NDXRATIO = ',NDXRATIO -! !callabortstop -! CALL PRINT_MSG(NVERB_FATAL,'GEN','SPAWN_MODEL2','') -!END IF -!$ -!$20140506 the condition on NXSIZE*NXRATIO ==IIE-IIB+1 only works for monoproc -!$then cancel it -!IF ( (NYSIZE*NDYRATIO) /= (IJE-IJB+1) ) THEN -! WRITE(ILUOUT,*) 'SPAWN_MODEL2: MODEL 2 DOMAIN Y-SIZE INCOHERENT WITH THE', & -! ' MODEL1 MESH ',' IJB = ',IJB,' IJE = ', IJE ,'NDYRATIO = ',NDYRATIO -! !callabortstop -! CALL PRINT_MSG(NVERB_FATAL,'GEN','SPAWN_MODEL2','') -!END IF -!$ -! -!* 3.3 Treatement of a SON 1 model (input) -! -IF (LEN_TRIM(HSONFILE) /= 0 ) THEN -! -! 3.3.1 Opening the son input file and reading the grid -! - WRITE(ILUOUT,*) 'SPAWN_MODEL2: spawning with a SON input file :',TRIM(HSONFILE) - CALL IO_File_add2list(TZSONFILE,TRIM(HSONFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=NVERB) - CALL IO_File_open(TZSONFILE) - CALL IO_Field_read(TZSONFILE,'DAD_NAME',YDAD_SON) - CALL IO_Field_read(TZSONFILE,'IMAX', IIMAXSON) - CALL IO_Field_read(TZSONFILE,'JMAX', IJMAXSON) - CALL IO_Field_read(TZSONFILE,'XOR', IXORSON) - CALL IO_Field_read(TZSONFILE,'YOR', IYORSON) - CALL IO_Field_read(TZSONFILE,'DXRATIO', IDXRATIOSON) - CALL IO_Field_read(TZSONFILE,'DYRATIO', IDYRATIOSON) - ! - IF (ADJUSTL(ADJUSTR(YDAD_SON)).NE.ADJUSTL(ADJUSTR(CMY_NAME(1)))) THEN - WRITE(ILUOUT,*) 'SPAWN_MODEL2: DAD of SON file is different from the one of model2' - WRITE(ILUOUT,*) ' DAD of SON = ',TRIM(YDAD_SON),' DAD of model2 = ',TRIM(CMY_NAME(1)) - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','SPAWN_MODEL2','DAD of SON file is different from the one of model2') - END IF - IF ( IDXRATIOSON /= NDXRATIO ) THEN - WRITE(ILUOUT,*) 'SPAWN_MODEL2: RATIOX of input SON file is different from the one of model2' ,& - ' RATIOX SON = ',IDXRATIOSON,' RATIOX model2 = ',NDXRATIO - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','SPAWN_MODEL2','RATIOX of input SON file is different from the one of model2') - END IF - IF ( IDYRATIOSON /= NDYRATIO ) THEN - WRITE(ILUOUT,*) 'SPAWN_MODEL2: RATIOY of input SON file is different from the one of model2' ,& - ' RATIOY SON = ',IDYRATIOSON,' RATIOY model2 = ',NDYRATIO - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','SPAWN_MODEL2','RATIOY of input SON file is different from the one of model2') - END IF - ! - IIUSON=IIMAXSON+2*JPHEXT - IJUSON=IJMAXSON+2*JPHEXT -! -! 3.3.2 Correspondance of indexes between the input SON and model2 -! - IXSIZESON = IIMAXSON/IDXRATIOSON - IYSIZESON = IJMAXSON/IDYRATIOSON - IXENDSON = IXORSON+IXSIZESON - IYENDSON = IYORSON+IYSIZESON -! Is a common domain between the input SON and the output son (model2)? - IF( ( MIN(NXEND-1,IXENDSON)-MAX(NXOR,IXORSON) > 0 ) .OR. & - ( MIN(NYEND-1,IYENDSON)-MAX(NYOR,IYORSON) > 0 ) ) THEN - GNOSON=.FALSE. - ! Common domain for the model2 (output son) indexes - IIB2 = (MAX(NXOR,IXORSON)-NXOR)*NDXRATIO+1+JPHEXT - IJB2 = (MAX(NYOR,IYORSON)-NYOR)*NDYRATIO+1+JPHEXT - IIE2 = (MIN(NXEND-1,IXENDSON)-NXOR)*NDXRATIO+JPHEXT - IJE2 = (MIN(NYEND-1,IYENDSON)-NYOR)*NDYRATIO+JPHEXT - ! Common domain for the SON 1 (input one) indexes - IIB1 = (MAX(NXOR,IXORSON)-IXORSON)*NDXRATIO+1+JPHEXT - IJB1 = (MAX(NYOR,IYORSON)-IYORSON)*NDYRATIO+1+JPHEXT - IIE1 = (MIN(NXEND-1,IXENDSON)-IXORSON)*NDXRATIO+JPHEXT - IJE1 = (MIN(NYEND-1,IYENDSON)-IYORSON)*NDYRATIO+JPHEXT - ! - WRITE(ILUOUT,*) ' common domain in the SON grid (IB,IE=', & - 1+JPHEXT,'-',IIMAXSON+JPHEXT,' ; JB,JE=', & - 1+JPHEXT,'-',IJMAXSON+JPHEXT,'):' - WRITE(ILUOUT,*) 'I=',IIB1,'->',IIE1,' ; J=',IJB1,'->',IJE1 - WRITE(ILUOUT,*) ' common domain in the model2 grid (IB,IE=', & - 1+JPHEXT,'-',NXSIZE*NDXRATIO+JPHEXT,' ; JB,JE=', & - 1+JPHEXT,'-',NYSIZE*NDYRATIO+JPHEXT,'):' - WRITE(ILUOUT,*) 'I=',IIB2,'->',IIE2,' ; J=',IJB2,'->',IJE2 - ELSE - WRITE(ILUOUT,*) 'SPAWN_MODEL2: no common domain between input SON and model2:' - WRITE(ILUOUT,*) ' the input SON fields are not taken into account, spawned fields are computed from model1' - END IF -END IF -! -!* 3.4 Initialization of model 2 configuration -! -NRR = KRR ! for MODD_CONF2 -NSV_USER = KSV_USER -IF (NSV_CHEM>0) THEN - LUSECHEM=.TRUE. - IF (NSV_CHAC>0) THEN - LUSECHAQ=.TRUE. - ENDIF - IF (NSV_CHIC>0) THEN - LUSECHIC=.TRUE. - ENDIF - CCHEM_INPUT_FILE = HCHEM_INPUT_FILE -END IF -! -CTURB = HTURB ! for MODD_PARAM2 -CRAD = 'NONE' ! radiation will have to be restarted -CSURF = HSURF ! for surface call -CCLOUD = HCLOUD -CDCONV = 'NONE' ! deep convection will have to be restarted -CSCONV = 'NONE' ! shallow convection will have to be restarted -! -! cas LIMA -! -!IF (HCLOUD=='LIMA') THEN -! CCLOUD='LIMA' -! NMOD_CCN=3 -! LSCAV=.FALSE. -! LAERO_MASS=.FALSE. -! NMOD_IFN=2 -! NMOD_IMM=1 -! LHHONI=.FALSE. -!ENDIF -! -CALL INI_NSV(2) ! NSV* are set equal for model 2 and model 1. - ! NSV is set to the total number of SV for model 2 -! -IF (NRR==0) THEN - LUSERV=.FALSE. ! as the default is .T. -ELSE - IDX_RVT = 1 -END IF -IF (NRR>1) THEN - LUSERC=.TRUE. - IDX_RCT = 2 -END IF -IF (NRR>2) THEN - LUSERR=.TRUE. - IDX_RRT = 2 -END IF -IF (NRR>3) THEN - LUSERI=.TRUE. - IDX_RIT = 2 -END IF -IF (NRR>4) THEN - LUSERS=.TRUE. - IDX_RST = 2 -END IF -IF (NRR>5) THEN - LUSERG=.TRUE. - IDX_RGT = 2 -END IF -IF (NRR>6) THEN - LUSERH=.TRUE. - IDX_RHT = 2 -END IF -! -! -! -!* 3.5 model 2 configuration in MODD_NESTING to be written -!* on the FM-file to allow nesting or coupling -! -CCPLFILE(:) = ' ' -LSTEADYLS=.TRUE. -! -NDXRATIO_ALL(:) = 0 -NDYRATIO_ALL(:) = 0 -NDXRATIO_ALL(2) = NDXRATIO -NDYRATIO_ALL(2) = NDYRATIO -NXOR_ALL(2) = NXOR -NYOR_ALL(2) = NYOR -NXEND_ALL(2) = NXEND -NYEND_ALL(2) = NYEND -! -!* 3.6 size of the RIM area for lbc -! -NRIMX=MIN(JPRIMMAX,IIU/2-1) -IF ( .NOT. L2D ) THEN - NRIMY=MIN(JPRIMMAX,IJU/2-1) -ELSE - NRIMY=0 -END IF -IF (NRIMX >= IIU/2-1) THEN ! Error ! this case is not supported - it should be, but there is a bug - call Print_msg( NVERB_FATAL, 'GEN', 'SPAWN_MODEL2', 'The size of the LBX zone is too big for the size of the subdomains. '// & - 'Try with less processes, a smaller LBX size or a bigger grid in X.' ) -ENDIF -IF ( ( .NOT. L2D ) .AND. (NRIMY >= IJU/2-1) ) THEN ! Error ! this case is not supported - it should be, but there is a bug - call Print_msg( NVERB_FATAL, 'GEN', 'SPAWN_MODEL2', 'The size of the LBY zone is too big for the size of the subdomains. '// & - 'Try with less processes, a smaller LBY size or a bigger grid in Y.' ) -ENDIF -! -LHORELAX_UVWTH=.TRUE. -LHORELAX_RV=LUSERV -LHORELAX_RC=LUSERC -LHORELAX_RR=LUSERR -LHORELAX_RI=LUSERI -LHORELAX_RS=LUSERS -LHORELAX_RG=LUSERG -LHORELAX_RH=LUSERH -! -IF (CTURB/='NONE') LHORELAX_TKE =.TRUE. -LHORELAX_SV(:)=.FALSE. -DO JSV=1,NSV - LHORELAX_SV(JSV)=.TRUE. -END DO -IF (NSV_CHEM > 0) LHORELAX_SVCHEM = .TRUE. -IF (NSV_CHIC > 0) LHORELAX_SVCHIC = .TRUE. -IF (NSV_C2R2 > 0) LHORELAX_SVC2R2 = .TRUE. -IF (NSV_C1R3 > 0) LHORELAX_SVC1R3 = .TRUE. -IF (NSV_ELEC > 0) LHORELAX_SVELEC = .TRUE. -IF (NSV_AER > 0) LHORELAX_SVAER = .TRUE. -IF (NSV_DST > 0) LHORELAX_SVDST = .TRUE. -IF (NSV_SLT > 0) LHORELAX_SVSLT = .TRUE. -IF (NSV_PP > 0) LHORELAX_SVPP = .TRUE. -#ifdef MNH_FOREFIRE -IF (NSV_FF > 0) LHORELAX_SVFF = .TRUE. -#endif -IF (NSV_CS > 0) LHORELAX_SVCS = .TRUE. -LHORELAX_SVLG = .FALSE. -IF (NSV_LIMA > 0) LHORELAX_SVLIMA = .TRUE. -! -!------------------------------------------------------------------------------- -! -!* 4. ALLOCATE MEMORY FOR ARRAYS : -! ----------------------------- -! -!* 4.1 Global variables absent from the modules : -! -ALLOCATE(ZJ(IIU,IJU,IKU)) -! -!* 4.2 Prognostic (and diagnostic) variables (module MODD_FIELD2) : -! -ALLOCATE(XZWS(IIU,IJU)); XZWS(:,:) = XZWS_DEFAULT -ALLOCATE(XLSZWSM(IIU,IJU)) -ALLOCATE(XUT(IIU,IJU,IKU)) -ALLOCATE(XVT(IIU,IJU,IKU)) -ALLOCATE(XWT(IIU,IJU,IKU)) -ALLOCATE(XTHT(IIU,IJU,IKU)) -IF (CTURB/='NONE') THEN - ALLOCATE(XTKET(IIU,IJU,IKU)) -ELSE - ALLOCATE(XTKET(0,0,0)) -END IF -ALLOCATE(XPABST(IIU,IJU,IKU)) -ALLOCATE(XRT(IIU,IJU,IKU,NRR)) -ALLOCATE(XSVT(IIU,IJU,IKU,NSV)) -! -IF (CTURB /= 'NONE' .AND. NRR>1) THEN - ALLOCATE(XSRCT(IIU,IJU,IKU)) - ALLOCATE(XSIGS(IIU,IJU,IKU)) -ELSE - ALLOCATE(XSRCT(0,0,0)) - ALLOCATE(XSIGS(0,0,0)) -END IF -! -! -!* 4.4 Grid variables (module MODD_GRID2 and MODD_METRICS2): -! -ALLOCATE(XXHAT(IIU),XYHAT(IJU),XZHAT(IKU)) -ALLOCATE(XXHATM(IIU),XYHATM(IJU),XZHATM(IKU)) -ALLOCATE(XZTOP) -ALLOCATE(XMAP(IIU,IJU)) -ALLOCATE(XLAT(IIU,IJU)) -ALLOCATE(XLON(IIU,IJU)) -ALLOCATE(XDXHAT(IIU),XDYHAT(IJU)) -ALLOCATE(XZS(IIU,IJU)) -ALLOCATE(XZSMT(IIU,IJU)) -ALLOCATE(XZZ(IIU,IJU,IKU)) -! -ALLOCATE(XDXX(IIU,IJU,IKU)) -ALLOCATE(XDYY(IIU,IJU,IKU)) -ALLOCATE(XDZX(IIU,IJU,IKU)) -ALLOCATE(XDZY(IIU,IJU,IKU)) -ALLOCATE(XDZZ(IIU,IJU,IKU)) -! -ALLOCATE(ZZS_LS(IIU,IJU)) -ALLOCATE(ZZSMT_LS(IIU,IJU)) -ALLOCATE(ZZZ_LS(IIU,IJU,IKU)) -! -!* 4.5 Reference state variables (module MODD_REF2): -! -ALLOCATE(XRHODREF(IIU,IJU,IKU),XTHVREF(IIU,IJU,IKU),XRVREF(IIU,IJU,IKU)) -ALLOCATE(XRHODJ(IIU,IJU,IKU),XEXNREF(IIU,IJU,IKU)) -! -!* 4.6 Larger Scale fields (module MODD_LSFIELD2): -! - ! LS fields for vertical relaxation and diffusion -ALLOCATE(XLSUM(IIU,IJU,IKU)) -ALLOCATE(XLSVM(IIU,IJU,IKU)) -ALLOCATE(XLSWM(IIU,IJU,IKU)) -ALLOCATE(XLSTHM(IIU,IJU,IKU)) -IF ( NRR >= 1) THEN - ALLOCATE(XLSRVM(IIU,IJU,IKU)) -ELSE - ALLOCATE(XLSRVM(0,0,0)) -ENDIF - ! LB fields for lbc coupling -! -!get the size of the local portion of the LB zone in X and Y direction -CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX, & - IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, & - IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2) -CALL GET_SIZEY_LB(NIMAX_ll,NJMAX_ll,NRIMY, & - IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV, & - IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2) -!on fait des choses inutiles avec GET_SIZEX_LB, on pourrait utiliser seulement GET_LOCAL_LB_SIZE_X_ll -!ILOCLBSIZEX = GET_LOCAL_LB_SIZE_X_ll( NRIMX ) -!ILOCLBSIZEY = GET_LOCAL_LB_SIZE_Y_ll( NRIMY ) -! - ALLOCATE(XLBXUM(IISIZEXFU,IJU,IKU)) -!! ALLOCATE(XLBXUM(2*NRIMX+2*JPHEXT,IJU,IKU)) -! -IF ( .NOT. L2D ) THEN - ALLOCATE(XLBYUM(IIU,IJSIZEYF,IKU)) -!! ALLOCATE(XLBYUM(IIU,2*NRIMY+2*JPHEXT,IKU)) -ELSE - ALLOCATE(XLBYUM(0,0,0)) -END IF -! -ALLOCATE(XLBXVM(IISIZEXF,IJU,IKU)) -!! ALLOCATE(XLBXVM(2*NRIMX+2*JPHEXT,IJU,IKU)) -! -IF ( .NOT. L2D ) THEN - IF ( NRIMY == 0 ) THEN - ALLOCATE(XLBYVM(IIU,IJSIZEY4,IKU)) - ELSE - ALLOCATE(XLBYVM(IIU,IJSIZEYFV,IKU)) -!! ALLOCATE(XLBYVM(IIU,2*NRIMY+2*JPHEXT,IKU)) - END IF -ELSE - ALLOCATE(XLBYVM(0,0,0)) -END IF -! -ALLOCATE(XLBXWM(IISIZEXF,IJU,IKU)) -!! ALLOCATE(XLBXWM(2*NRIMX+2*JPHEXT,IJU,IKU)) -! -IF ( .NOT. L2D ) THEN - ALLOCATE(XLBYWM(IIU,IJSIZEYF,IKU)) -!! ALLOCATE(XLBYWM(IIU,2*NRIMY+2*JPHEXT,IKU)) -ELSE - ALLOCATE(XLBYWM(0,0,0)) -END IF -! -ALLOCATE(XLBXTHM(IISIZEXF,IJU,IKU)) -!!ALLOCATE(XLBXTHM(2*NRIMX+2*JPHEXT,IJU,IKU)) -! -IF ( .NOT. L2D ) THEN - ALLOCATE(XLBYTHM(IIU,IJSIZEYF,IKU)) -!! ALLOCATE(XLBYTHM(IIU,2*NRIMY+2*JPHEXT,IKU)) -ELSE - ALLOCATE(XLBYTHM(0,0,0)) -END IF -! -IF (CTURB /= 'NONE') THEN - ALLOCATE(XLBXTKEM(IISIZEXF,IJU,IKU)) -!! ALLOCATE(XLBXTKEM(2*NRIMX+2*JPHEXT,IJU,IKU)) -ELSE - ALLOCATE(XLBXTKEM(0,0,0)) -END IF -! -IF (CTURB /= 'NONE' .AND. (.NOT. L2D)) THEN - ALLOCATE(XLBYTKEM(IIU,IJSIZEYF,IKU)) -!! ALLOCATE(XLBYTKEM(IIU,2*NRIMY+2*JPHEXT,IKU)) -ELSE - ALLOCATE(XLBYTKEM(0,0,0)) -END IF -! -ALLOCATE(XLBXRM(IISIZEXF,IJU,IKU,NRR)) -!!ALLOCATE(XLBXRM(2*NRIMX+2*JPHEXT,IJU,IKU,NRR)) -! -IF (.NOT. L2D ) THEN - ALLOCATE(XLBYRM(IIU,IJSIZEYF,IKU,NRR)) -!! ALLOCATE(XLBYRM(IIU,2*NRIMY+2*JPHEXT,IKU,NRR)) -ELSE - ALLOCATE(XLBYRM(0,0,0,0)) -END IF -! -ALLOCATE(XLBXSVM(IISIZEXF,IJU,IKU,NSV)) -!!ALLOCATE(XLBXSVM(2*NRIMX+2*JPHEXT,IJU,IKU,NSV)) -! -IF (.NOT. L2D ) THEN - ALLOCATE(XLBYSVM(IIU,IJSIZEYF,IKU,NSV)) -!! ALLOCATE(XLBYSVM(IIU,2*NRIMY+2*JPHEXT,IKU,NSV)) -ELSE - ALLOCATE(XLBYSVM(0,0,0,0)) -END IF -! -NSIZELBX_ll=2*NRIMX+2*JPHEXT -NSIZELBXU_ll=2*NRIMX+2*JPHEXT -NSIZELBY_ll=2*NRIMY+2*JPHEXT -NSIZELBYV_ll=2*NRIMY+2*JPHEXT -NSIZELBXR_ll=2*NRIMX+2*JPHEXT -NSIZELBXSV_ll=2*NRIMX+2*JPHEXT -NSIZELBXTKE_ll=2*NRIMX+2*JPHEXT -NSIZELBYTKE_ll=2*NRIMY+2*JPHEXT -NSIZELBYR_ll=2*NRIMY+2*JPHEXT -NSIZELBYSV_ll=2*NRIMY+2*JPHEXT -! -! -! 4.8 precipitation variables ! same allocations than in ini_micron -! -IF (CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE') THEN - ALLOCATE(XINPRR(IIU,IJU)) - ALLOCATE(XINPRR3D(IIU,IJU,IKU)) - ALLOCATE(XEVAP3D(IIU,IJU,IKU)) - ALLOCATE(XACPRR(IIU,IJU)) -ELSE - ALLOCATE(XINPRR(0,0)) - ALLOCATE(XINPRR3D(0,0,0)) - ALLOCATE(XEVAP3D(0,0,0)) - ALLOCATE(XACPRR(0,0)) -END IF -! -IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C2R2' & - .OR. CCLOUD == 'KHKO' .OR. CCLOUD == 'LIMA') THEN - ALLOCATE(XINPRC(IIU,IJU)) - ALLOCATE(XACPRC(IIU,IJU)) -ELSE - ALLOCATE(XINPRC(0,0)) - ALLOCATE(XACPRC(0,0)) -END IF -! -IF (( CCLOUD(1:3) == 'ICE' .AND.LDEPOSC) .OR. & - ((CCLOUD=='C2R2' .OR. CCLOUD=='KHKO').AND.LDEPOC) .OR. & - ( CCLOUD=='LIMA' .AND.MDEPOC)) THEN - ALLOCATE(XINDEP(IIU,IJU)) - ALLOCATE(XACDEP(IIU,IJU)) -ELSE - ALLOCATE(XINDEP(0,0)) - ALLOCATE(XACDEP(0,0)) -END IF -! -IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5'.OR. CCLOUD == 'LIMA') THEN - ALLOCATE(XINPRS(IIU,IJU)) - ALLOCATE(XACPRS(IIU,IJU)) -ELSE - ALLOCATE(XINPRS(0,0)) - ALLOCATE(XACPRS(0,0)) -END IF -! -IF (CCLOUD == 'C3R5' .OR. CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4'.OR. CCLOUD == 'LIMA' ) THEN - ALLOCATE(XINPRG(IIU,IJU)) - ALLOCATE(XACPRG(IIU,IJU)) -ELSE - ALLOCATE(XINPRG(0,0)) - ALLOCATE(XACPRG(0,0)) -END IF -! -IF (CCLOUD == 'ICE4'.OR. CCLOUD == 'LIMA') THEN - ALLOCATE(XINPRH(IIU,IJU)) - ALLOCATE(XACPRH(IIU,IJU)) -ELSE - ALLOCATE(XINPRH(0,0)) - ALLOCATE(XACPRH(0,0)) -END IF -! -IF ( CCLOUD=='LIMA' .AND. LSCAV ) THEN - ALLOCATE(XINPAP(IIU,IJU)) - ALLOCATE(XACPAP(IIU,IJU)) - XINPAP(:,:)=0.0 - XACPAP(:,:)=0.0 -ELSE - ALLOCATE(XINPAP(0,0)) - ALLOCATE(XACPAP(0,0)) -END IF -! -! 4.8bis electric variables -! -IF (CELEC /= 'NONE' ) THEN - ALLOCATE(XNI_SDRYG(IIU,IJU,IKU)) - ALLOCATE(XNI_IDRYG(IIU,IJU,IKU)) - ALLOCATE(XNI_IAGGS(IIU,IJU,IKU)) - ALLOCATE(XEFIELDU(IIU,IJU,IKU)) - ALLOCATE(XEFIELDV(IIU,IJU,IKU)) - ALLOCATE(XEFIELDW(IIU,IJU,IKU)) - ALLOCATE(XESOURCEFW(IIU,IJU,IKU)) - ALLOCATE(XIND_RATE(IIU,IJU,IKU)) - ALLOCATE(XIONSOURCEFW(IIU,IJU,IKU)) - ALLOCATE(XEW(IIU,IJU,IKU)) - ALLOCATE(XCION_POS_FW(IIU,IJU,IKU)) - ALLOCATE(XCION_NEG_FW(IIU,IJU,IKU)) - ALLOCATE(XMOBIL_POS(IIU,IJU,IKU)) - ALLOCATE(XMOBIL_NEG(IIU,IJU,IKU)) -ELSE - ALLOCATE(XNI_SDRYG(0,0,0)) - ALLOCATE(XNI_IDRYG(0,0,0)) - ALLOCATE(XNI_IAGGS(0,0,0)) - ALLOCATE(XEFIELDU(0,0,0)) - ALLOCATE(XEFIELDV(0,0,0)) - ALLOCATE(XEFIELDW(0,0,0)) - ALLOCATE(XESOURCEFW(0,0,0)) - ALLOCATE(XIND_RATE(0,0,0)) - ALLOCATE(XIONSOURCEFW(0,0,0)) - ALLOCATE(XEW(0,0,0)) - ALLOCATE(XCION_POS_FW(0,0,0)) - ALLOCATE(XCION_NEG_FW(0,0,0)) - ALLOCATE(XMOBIL_POS(0,0,0)) - ALLOCATE(XMOBIL_NEG(0,0,0)) -END IF -! -! -! -! 4.9 Passive pollutant variable -! -IF (LPASPOL) THEN - ALLOCATE( XATC(IIU,IJU,IKU,NSV_PP) ) - ELSE - ALLOCATE( XATC(0,0,0,0)) -END IF -! -! 4.10 Advective forcing variable for 2D (Modif MT) -! -! -IF (L2D_ADV_FRC) THEN - WRITE(ILUOUT,*) 'SPAWN_MODEL2: L2D_ADV_FRC IS SET TO ',L2D_ADV_FRC,' SO ADVECTIVE FORCING WILL BE SPAWN: NADVFRC=',NADVFRC - ALLOCATE(TDTADVFRC(NADVFRC)) - ALLOCATE(XDTHFRC(IIU,IJU,IKU,NADVFRC)) - ALLOCATE(XDRVFRC(IIU,IJU,IKU,NADVFRC)) - WRITE(ILUOUT,*) 'SPAWN_MODEL2: ALLOCATION OF ADV FORCING VARIABLES MADE' -ELSE - ALLOCATE(TDTADVFRC(0)) - ALLOCATE(XDTHFRC(0,0,0,0)) - ALLOCATE(XDRVFRC(0,0,0,0)) -END IF -IF (L2D_REL_FRC) THEN - WRITE(ILUOUT,*) 'SPAWN_MODEL2: L2D_REL_FRC IS SET TO ',L2D_REL_FRC,' SO RELAXATION FORCING WILL BE SPAWN: NRELFRC=',NRELFRC - ALLOCATE(TDTRELFRC(NRELFRC)) - ALLOCATE(XTHREL(IIU,IJU,IKU,NRELFRC)) - ALLOCATE(XRVREL(IIU,IJU,IKU,NRELFRC)) - WRITE(ILUOUT,*) 'SPAWN_MODEL2: ALLOCATION OF REL FORCING VARIABLES MADE' -ELSE - ALLOCATE(TDTRELFRC(0)) - ALLOCATE(XTHREL(0,0,0,0)) - ALLOCATE(XRVREL(0,0,0,0)) -END IF -! -! 4.11 Turbulent fluxes for 2D (Modif MT) -! -! -IF (LUV_FLX) THEN - WRITE(ILUOUT,*) 'SPAWN_MODEL2: XUV_FLX1 IS SET TO ',XUV_FLX1,' SO XVU_FLUX WILL BE SPAWN' - ALLOCATE(XVU_FLUX_M(IIU,IJU,IKU)) - WRITE(ILUOUT,*) 'SPAWN_MODEL2: ALLOCATION OF XVU_FLUX_M MADE' -ELSE - ALLOCATE(XVU_FLUX_M(0,0,0)) -END IF -! -IF (LTH_FLX) THEN - WRITE(ILUOUT,*) 'SPAWN_MODEL2: XTH_FLX IS SET TO ',XTH_FLX,' SO XVTH_FLUX and XWTH_FLUX WILL BE SPAWN' - ALLOCATE(XVTH_FLUX_M(IIU,IJU,IKU)) - ALLOCATE(XWTH_FLUX_M(IIU,IJU,IKU)) - WRITE(ILUOUT,*) 'SPAWN_MODEL2: ALLOCATION OF XVTH_FLUX_M and XWTH_FLUX_M MADE' -ELSE - ALLOCATE(XVTH_FLUX_M(0,0,0)) - ALLOCATE(XWTH_FLUX_M(0,0,0)) -END IF -! -!------------------------------------------------------------------------------- -! -!* 5. INITIALIZE ALL THE MODEL VARIABLES -! ---------------------------------- -! -!* 5.1 Bikhardt interpolation coefficients computation : -! -CALL INI_BIKHARDT_n(NDXRATIO,NDYRATIO,2) -! -CALL SECOND_MNH(ZTIME2) -! -ZMISC = ZTIME2 - ZTIME1 -! -!* 5.2 Spatial and Temporal grid (for MODD_GRID2 and MODD_TIME2) : -! -CALL SECOND_MNH(ZTIME1) -! -IF(NPROC.GT.1)THEN - CALL GO_TOMODEL_ll(2, IINFO_ll) - CALL GET_FEEDBACK_COORD_ll(NXOR_TMP,NYOR_TMP,NXEND_TMP,NYEND_TMP,IINFO_ll) !phys domain -ELSE - NXOR_TMP = NXOR - NYOR_TMP = NYOR - NXEND_TMP= NXEND - NYEND_TMP = NYEND -ENDIF -XZS=0. -CALL SPAWN_GRID2( NXOR, NYOR, NXEND, NYEND, NDXRATIO, NDYRATIO, & - XLONORI, XLATORI, XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZHATM, & - XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, & - XHAT_BOUND, XHATM_BOUND, & - XZTOP, LSLEVE, XLEN1, XLEN2, & - XZS, XZSMT, ZZS_LS, ZZSMT_LS, TDTMOD, TDTCUR ) -! -CALL MPPDB_CHECK2D(ZZS_LS,"SPAWN_MOD2:ZZS_LS",PRECISION) -CALL MPPDB_CHECK2D(ZZSMT_LS,"SPAWN_MOD2:ZZSMT_LS",PRECISION) -CALL MPPDB_CHECK2D(XZS,"SPAWN_MOD2:XZS",PRECISION) -CALL MPPDB_CHECK2D(XZSMT,"SPAWN_MOD2:XZSMT",PRECISION) -! -CALL SECOND_MNH(ZTIME2) -! -ZGRID2 = ZTIME2 - ZTIME1 -! -!* 5.3 Calculation of the grid -! -ZTIME1 = ZTIME2 -! -IF (LCARTESIAN) THEN - CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,ZZS_LS,LSLEVE,XLEN1,XLEN2,ZZSMT_LS,XDXHAT,XDYHAT,ZZZ_LS,ZJ) - CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS ,LSLEVE,XLEN1,XLEN2,XZSMT ,XDXHAT,XDYHAT,XZZ ,ZJ) -ELSE - CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, ZZS_LS, & - LSLEVE, XLEN1, XLEN2, ZZSMT_LS, XLATORI, XLONORI, & - XMAP, XLAT, XLON, XDXHAT, XDYHAT, ZZZ_LS, ZJ ) - CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS, & - LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, & - XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, ZJ ) -END IF -! -!* 5.4 Compute the metric coefficients -! -CALL ADD3DFIELD_ll( TZFIELDS_ll, XZZ, 'SPAWN_MODEL2::XZZ' ) -CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) -CALL CLEANLIST_ll(TZFIELDS_ll) -! -CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -CALL MPPDB_CHECK3D(XDXX,"spawnmod2-beforeupdate_metrics:XDXX",PRECISION) -CALL MPPDB_CHECK3D(XDYY,"spawnmod2-beforeupdate_metrics:XDYY",PRECISION) -CALL MPPDB_CHECK3D(XDZX,"spawnmod2-beforeupdate_metrics:XDZX",PRECISION) -CALL MPPDB_CHECK3D(XDZY,"spawnmod2-beforeupdate_metrics:XDZY",PRECISION) -! -CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -CALL MPPDB_CHECK3D(XDXX,"spawnmod2-aftrupdate_metrics:XDXX",PRECISION) -CALL MPPDB_CHECK3D(XDYY,"spawnmod2-aftrupdate_metrics:XDYY",PRECISION) -CALL MPPDB_CHECK3D(XDZX,"spawnmod2-aftrupdate_metrics:XDZX",PRECISION) -CALL MPPDB_CHECK3D(XDZY,"spawnmod2-aftrupdate_metrics:XDZY",PRECISION) -!$ -! -!* 5.5 3D Reference state variables : -! -CALL SET_REF( 0, TFILE_DUMMY, & - XZZ, XZHATM, ZJ, XDXX, XDYY, CLBCX, CLBCY, & - XREFMASS, XMASS_O_PHI0, XLINMASS, & - XRHODREF, XTHVREF, XRVREF, XEXNREF, XRHODJ ) -! -CALL SECOND_MNH(ZTIME2) -! -ZMISC = ZMISC + ZTIME2 - ZTIME1 -! -!* 5.6 Prognostic variables and Larger scale fields : -! -ZTIME1 = ZTIME2 -! -!* horizontal interpolation -! -ALLOCATE(ZTHVT(IIU,IJU,IKU)) -ALLOCATE(ZHUT(IIU,IJU,IKU)) -! -MPPDB_CHECK_LB = .TRUE. -IF (GNOSON) THEN - CALL SPAWN_FIELD2 (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,CTURB, & - XUT,XVT,XWT,ZTHVT,XRT,ZHUT,XTKET,XSVT,XZWS,XATC, & - XSRCT,XSIGS, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM, & - XDTHFRC,XDRVFRC,XTHREL,XRVREL, & - XVU_FLUX_M,XVTH_FLUX_M,XWTH_FLUX_M ) - CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 after SPAWN_FIELD2:XUT",PRECISION) -ELSE - CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 before SPAWN_FIELD2:XUT",PRECISION) - CALL SPAWN_FIELD2 (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,CTURB, & - XUT,XVT,XWT,ZTHVT,XRT,ZHUT,XTKET,XSVT,XZWS,XATC, & - XSRCT,XSIGS, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM, & - XDTHFRC,XDRVFRC,XTHREL,XRVREL, & - XVU_FLUX_M, XVTH_FLUX_M,XWTH_FLUX_M, & - TZSONFILE,IIUSON,IJUSON, & - IIB2,IJB2,IIE2,IJE2, & - IIB1,IJB1,IIE1,IJE1 ) - CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 after SPAWN_FIELD2:XUT",PRECISION) -END IF -! -CALL MPPDB_CHECK3D(XUT,"SPAWN_MOD2aftFIELD2:XUT",PRECISION) -CALL MPPDB_CHECK3D(XVT,"SPAWN_MOD2aftFIELD2:XVT",PRECISION) -!$ -!* correction of positivity -! -IF (SIZE(XLSRVM,1)>0) XLSRVM = MAX(0.,XLSRVM) -IF (SIZE(XRT,1)>0) XRT = MAX(0.,XRT) -IF (SIZE(ZHUT,1)>0) ZHUT = MIN(MAX(ZHUT,0.),100.) -IF (SIZE(XTKET,1)>0) XTKET = MAX(XTKEMIN,XTKET) -! -CALL SECOND_MNH(ZTIME2) -! -ZFIELD2 = ZTIME2 - ZTIME1 -! -ZTIME1 = ZTIME2 -! -!* vertical interpolation -! -ZZS_MAX = ABS( MAXVAL(XZS(:,:))) -CALL MPI_ALLREDUCE(ZZS_MAX, ZZS_MAX_ll, 1, MNHREAL_MPI, MPI_MAX, & - NMNH_COMM_WORLD,IINFO_ll) -IF ( (ZZS_MAX_ll>0.) .AND. (NDXRATIO/=1 .OR. NDYRATIO/=1) ) THEN - CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 before VER_INTERP_FIELD:XUT",PRECISION) - CALL VER_INTERP_FIELD (CTURB,NRR,NSV,ZZZ_LS,XZZ, & - XUT,XVT,XWT,ZTHVT,XRT,ZHUT,XTKET,XSVT, & - XSRCT,XSIGS, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM ) - ! - CALL MPPDB_CHECK3D(XUT,"SPAWN_M2aftVERINTER:XUT",PRECISION) - CALL MPPDB_CHECK3D(XVT,"SPAWN_M2aftVERINTER:XVT",PRECISION) - CALL MPPDB_CHECK3D(XWT,"SPAWN_M2aftVERINTER:XWT",PRECISION) - CALL MPPDB_CHECK3D(ZHUT,"SPAWN_M2aftVERINTER:ZHUT",PRECISION) - CALL MPPDB_CHECK3D(XTKET,"SPAWN_M2aftVERINTER:XTKET",PRECISION) - CALL MPPDB_CHECK3D(XSRCT,"SPAWN_M2aftVERINTER:XSRCT",PRECISION) -ENDIF -! -CALL SECOND_MNH(ZTIME2) -! -ZVER = ZTIME2 - ZTIME1 -! -!* 5.7 Absolute pressure : -! -ZTIME1 = ZTIME2 -! -CALL SPAWN_PRESSURE2(NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO, & - ZZZ_LS,XZZ,ZTHVT,XPABST ) -! -IF (.NOT.GNOSON) THEN - ALLOCATE(ZWORK3D(IIUSON,IJUSON,IKU)) - CALL IO_Field_read(TZSONFILE,'PABST',ZWORK3D) - XPABST(IIB2:IIE2,IJB2:IJE2,:) = ZWORK3D(IIB1:IIE1,IJB1:IJE1,:) - DEALLOCATE(ZWORK3D) -END IF -! -IF (NVERB>=2) THEN - IK4000 = COUNT(XZHAT(:)<4000.) - IIJ = MAXLOC( SUM(ZHUT(IIB:IIE,IJB:IJE,JPVEXT+1:IK4000),3), & - MASK=COUNT(ZHUT(IIB:IIE,IJB:IJE,JPVEXT+1:IKE) & - >=MAXVAL(ZHUT(IIB:IIE,IJB:IJE,JPVEXT+1:IKE))-0.01,DIM=3 ) & - >=1 ) & - + JPHEXT - WRITE(ILUOUT,*) ' ' - WRITE(ILUOUT,*) 'humidity (I=',IIJ(1),';J=',IIJ(2),')' - DO JK=IKB,IKE - WRITE(ILUOUT,'(F6.2," %")') ZHUT(IIJ(1),IIJ(2),JK) - END DO -END IF -!* 5.8 Retrieve model thermodynamical variables : -! -ALLOCATE(ZSUMRT(IIU,IJU,IKU)) -ZSUMRT(:,:,:) = 0. -IF (NRR==0) THEN - XTHT(:,:,:) = ZTHVT(:,:,:) -ELSE - IF (NDXRATIO/=1 .OR. NDYRATIO/=1) THEN - XRT(:,:,:,1) = SM_PMR_HU(XPABST(:,:,:), & - ZTHVT(:,:,:)*(XPABST(:,:,:)/XP00)**(XRD/XCPD), & - ZHUT(:,:,:),XRT(:,:,:,:),KITERMAX=100 ) - END IF - ! - DO JRR=1,NRR - ZSUMRT(:,:,:) = ZSUMRT(:,:,:) + XRT(:,:,:,JRR) - END DO - XTHT(:,:,:) = ZTHVT(:,:,:)/(1.+XRV/XRD*XRT(:,:,:,1))*(1.+ZSUMRT(:,:,:)) - CALL MPPDB_CHECK3D(XTHT,"SPAWN_MOD2:XTHT",PRECISION) -END IF -! -DEALLOCATE (ZHUT) -! -CALL SECOND_MNH(ZTIME2) -ZPRESSURE2=ZTIME2-ZTIME1 -! -!* 5.9 Large Scale field for lbc treatment: -! -! -!* 5.9.1 West-East LB zones -! -! -!JUAN A REVOIR TODO_JPHEXT -! <<<<<<< spawn_model2.f90 - MPPDB_CHECK_LB = .TRUE. - CALL MPPDB_CHECK3D(XUT,"SPAWN_MOD2 before lbc treatment:XUT",PRECISION) - CALL MPPDB_CHECK3D(XVT,"SPAWN_MOD2 before lbc treatment:XVT",PRECISION) - MPPDB_CHECK_LB = .FALSE. - YLBTYPE = 'LBU' - CALL SET_LB_FIELD_ll( YLBTYPE, XUT, XLBXUM, XLBYUM, IIB, IJB, IIE, IJE, 1, 0, 0, 0 ) - ! copy XUT(IIB:IIB+NRIMX,:,:) instead of XUT(IIB-1:IIB-1+NRIMX,:,:) in XLBXUM - CALL SET_LB_FIELD_ll( YLBTYPE, XVT, XLBXVM, XLBYVM, IIB, IJB, IIE, IJE, 0, 0, 1, 0 ) - ! copy XVT(:,IJB:IJB+NRIMY,:) instead of XVT(:,IJB-1:IJB-1+NRIMY,:) in XLBYVM - CALL SET_LB_FIELD_ll( YLBTYPE, XWT, XLBXWM, XLBYWM, IIB, IJB, IIE, IJE, 0, 0, 0, 0 ) - CALL SET_LB_FIELD_ll( YLBTYPE, XTHT, XLBXTHM, XLBYTHM, IIB, IJB, IIE, IJE, 0, 0, 0, 0 ) - IF (HTURB /= 'NONE') THEN - CALL SET_LB_FIELD_ll( YLBTYPE, XTKET, XLBXTKEM, XLBYTKEM, IIB, IJB, IIE, IJE, 0, 0, 0, 0 ) - ENDIF - IF (NRR >= 1) THEN - DO JRR =1,NRR - CALL SET_LB_FIELD_ll( YLBTYPE, XRT(:,:,:,JRR), XLBXRM(:,:,:,JRR), XLBYRM(:,:,:,JRR), IIB, IJB, IIE, IJE, 0, 0, 0, 0 ) - END DO - END IF - IF (NSV /= 0) THEN - DO JSV = 1, NSV - CALL SET_LB_FIELD_ll( YLBTYPE, XSVT(:,:,:,JSV), XLBXSVM(:,:,:,JSV), XLBYSVM(:,:,:,JSV), IIB, IJB, IIE, IJE, 0, 0, 0, 0 ) - END DO -!!$======= -!!$! -!!$XLBXUM(1:NRIMX+JPHEXT,:,:) = XUT(2:NRIMX+JPHEXT+1,:,:) -!!$XLBXUM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XUT(IIE+1-NRIMX:IIE+JPHEXT,:,:) -!!$IF( .NOT. L2D ) THEN -!!$ XLBYUM(:,1:NRIMY+JPHEXT,:) = XUT(:,1:NRIMY+JPHEXT,:) -!!$ XLBYUM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XUT(:,IJE+1-NRIMY:IJE+JPHEXT,:) -!!$END IF -!!$! -!!$!* 5.9.2 V variable -!!$! -!!$! -!!$XLBXVM(1:NRIMX+JPHEXT,:,:) = XVT(1:NRIMX+JPHEXT,:,:) -!!$XLBXVM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XVT(IIE+1-NRIMX:IIE+JPHEXT,:,:) -!!$IF( .NOT. L2D ) THEN -!!$ XLBYVM(:,1:NRIMY+JPHEXT,:) = XVT(:,2:NRIMY+JPHEXT+1,:) -!!$ XLBYVM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XVT(:,IJE+1-NRIMY:IJE+JPHEXT,:) -!!$END IF -!!$! -!!$!* 5.9.3 W variable -!!$! -!!$! -!!$XLBXWM(1:NRIMX+JPHEXT,:,:) = XWT(1:NRIMX+JPHEXT,:,:) -!!$XLBXWM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XWT(IIE+1-NRIMX:IIE+JPHEXT,:,:) -!!$IF( .NOT. L2D ) THEN -!!$ XLBYWM(:,1:NRIMY+JPHEXT,:) = XWT(:,1:NRIMY+JPHEXT,:) -!!$ XLBYWM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XWT(:,IJE+1-NRIMY:IJE+JPHEXT,:) -!!$END IF -!!$! -!!$!* 5.9.4 TH variable -!!$! -!!$! -!!$XLBXTHM(1:NRIMX+JPHEXT,:,:) = XTHT(1:NRIMX+JPHEXT,:,:) -!!$XLBXTHM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XTHT(IIE+1-NRIMX:IIE+JPHEXT,:,:) -!!$IF( .NOT. L2D ) THEN -!!$ XLBYTHM(:,1:NRIMY+JPHEXT,:) = XTHT(:,1:NRIMY+JPHEXT,:) -!!$ XLBYTHM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XTHT(:,IJE+1-NRIMY:IJE+JPHEXT,:) -!!$END IF -!!$! -!!$!* 5.9.5 TKE variable -!!$! -!!$! -!!$IF (HTURB /= 'NONE') THEN -!!$ XLBXTKEM(1:NRIMX+JPHEXT,:,:) = XTKET(1:NRIMX+JPHEXT,:,:) -!!$ XLBXTKEM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XTKET(IIE+1-NRIMX:IIE+JPHEXT,:,:) -!!$ IF( .NOT. L2D ) THEN -!!$ XLBYTKEM(:,1:NRIMY+JPHEXT,:) = XTKET(:,1:NRIMY+JPHEXT,:) -!!$ XLBYTKEM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XTKET(:,IJE+1-NRIMY:IJE+JPHEXT,:) -!!$>>>>>>> 1.3.2.4.2.2.2.6.2.3.2.6.2.1 - END IF -! -! <<<<<<< spawn_model2.f90 - CALL MPPDB_CHECKLB(XLBXUM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN",PRECISION,'LBXU',NRIMX) - CALL MPPDB_CHECKLB(XLBXVM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBXVM",PRECISION,'LBXU',NRIMX) - CALL MPPDB_CHECKLB(XLBXWM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBXWM",PRECISION,'LBXU',NRIMX) - CALL MPPDB_CHECKLB(XLBYUM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBYUM",PRECISION,'LBYV',NRIMY) - CALL MPPDB_CHECKLB(XLBYVM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBYVM",PRECISION,'LBYV',NRIMY) - CALL MPPDB_CHECKLB(XLBYWM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBYWM",PRECISION,'LBYV',NRIMY) -!!$======= -!!$!* 5.9.6 moist variables -!!$! -!!$IF (NRR >= 1) THEN -!!$ DO JRR =1,NRR -!!$ XLBXRM(1:NRIMX+JPHEXT,:,:,JRR) = XRT(1:NRIMX+JPHEXT,:,:,JRR) -!!$ XLBXRM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:,JRR) = XRT(IIE+1-NRIMX:IIE+JPHEXT,:,:,JRR) -!!$ IF( .NOT. L2D ) THEN -!!$ XLBYRM(:,1:NRIMY+JPHEXT,:,JRR) = XRT(:,1:NRIMY+JPHEXT,:,JRR) -!!$ XLBYRM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:,JRR) = XRT(:,IJE+1-NRIMY:IJE+JPHEXT,:,JRR) -!!$ END IF -!!$ END DO -!!$END IF -!!$! -!!$!* 5.9.7 scalar variables -!!$! -!!$IF (NSV /= 0) THEN -!!$ DO JSV = 1, NSV -!!$ XLBXSVM(1:NRIMX+JPHEXT,:,:,JSV) = XSVT(1:NRIMX+JPHEXT,:,:,JSV) -!!$ XLBXSVM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:,JSV) = XSVT(IIE+1-NRIMX:IIE+JPHEXT,:,:,JSV) -!!$ IF( .NOT. L2D ) THEN -!!$ XLBYSVM(:,1:NRIMY+JPHEXT,:,JSV) = XSVT(:,1:NRIMY+JPHEXT,:,JSV) -!!$ XLBYSVM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:,JSV) = XSVT(:,IJE+1-NRIMY:IJE+JPHEXT,:,JSV) -!!$ END IF -!!$ END DO -!!$ENDIF -!!$>>>>>>> 1.3.2.4.2.2.2.6.2.3.2.6.2.1 -! -!* 5.10 Surface precipitation computation -! -IF (SIZE(XINPRR) /= 0 ) THEN - IF (GNOSON) & - CALL SPAWN_SURF2_RAIN (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO, & - XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D, & - XACPRR,XINPRS,XACPRS,XINPRG,XACPRG,& - XINPRH,XACPRH ) - IF (.NOT.GNOSON) & - CALL SPAWN_SURF2_RAIN (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO, & - XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D, & - XACPRR,XINPRS,XACPRS,XINPRG,XACPRG,XINPRH,XACPRH, & - TZSONFILE,IIUSON,IJUSON, & - IIB2,IJB2,IIE2,IJE2, & - IIB1,IJB1,IIE1,IJE1 ) -ENDIF -! -!* 5.11 Total mass of dry air Md computation : -! -ZTIME1 = ZTIME2 -! -ALLOCATE(ZRHOD(IIU,IJU,IKU)) -! -IF (LOCEAN) THEN - ZRHOD(:,:,:)=XRH00OCEAN*(1.-XALPHAOC*(ZTHVT(:,:,:)-XTH00OCEAN)+XBETAOC*(XRT(:,:,:,1)-XSA00OCEAN)) -ELSE - ZRHOD(:,:,:)=XPABST(:,:,:)/(XPABST(:,:,:)/XP00)**(XRD/XCPD) & - /(XRD*ZTHVT(:,:,:)*(1.+ZSUMRT(:,:,:))) -ENDIF -!$20140709 - CALL MPPDB_CHECK3D(ZRHOD,"SPAWN_MOD2:ZRHOD",PRECISION) - CALL MPPDB_CHECK3D(XPABST,"SPAWN_MOD2:XPABST",PRECISION) - CALL MPPDB_CHECK3D(ZSUMRT,"SPAWN_MOD2:ZSUMRT",PRECISION) -!$20140710 until here all ok after UPHALO(XZZ) -! -CALL TOTAL_DMASS(ZJ,ZRHOD,XDRYMASST) -! -DEALLOCATE (ZRHOD) -DEALLOCATE (ZSUMRT,ZTHVT) -! -CALL SECOND_MNH(ZTIME2) -! -ZMISC = ZMISC + ZTIME2 - ZTIME1 -! -!* 5.12 Deallocation of model 1 variables : -! -ZTIME1 = ZTIME2 -! -CALL DEALLOCATE_MODEL1(3) -! -CALL SECOND_MNH(ZTIME2) -! -ZMISC = ZMISC + ZTIME2 - ZTIME1 -! -!* 5.13 Anelastic correction : -! -CALL SECOND_MNH(ZTIME1) -! -IF (.NOT. L1D) THEN - CALL ANEL_BALANCE_n - CALL BOUNDARIES ( & - 0.,CLBCX,CLBCY,NRR,NSV,1, & - XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & - XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & - XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XRHODJ,XRHODREF, & - XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT ) -END IF -! -CALL SECOND_MNH(ZTIME2) -! -ZANEL = ZTIME2 - ZTIME1 -! -! -! -!------------------------------------------------------------------------------- -! -!* 6. WRITE THE FMFILE -! ---------------- -! -CALL SECOND_MNH(ZTIME1) -! -INPRAR = 22 + 2*(4+NRR+NSV) ! 22 = number of grid variables + reference state - ! variables +dimension variables - ! 2*(4+NRR+NSV) = number of prognostic variables - ! at time t and t-dt -IF ( ( LEN_TRIM(HSPAFILE) /= 0 ) .AND. ( ADJUSTL(HSPAFILE) /= ADJUSTL(CINIFILE) ) ) THEN - CMY_NAME(2)=HSPAFILE -ELSE - CMY_NAME(2)=ADJUSTL(ADJUSTR(CINIFILE)//'.spa'//ADJUSTL(HSPANBR)) - IF (.NOT.GNOSON) & - CMY_NAME(2)=ADJUSTL(ADJUSTR(CINIFILE)//'.spr'//ADJUSTL(HSPANBR)) -END IF -! -CALL IO_File_add2list(TZFILE,CMY_NAME(2),'MNH','WRITE',KLFINPRAR=INPRAR,KLFITYPE=1,KLFIVERB=NVERB) -! -CALL IO_File_open(TZFILE) -! -CALL WRITE_DESFM_n(2,TZFILE) -! -IF (LBAL_ONLY) THEN ! same relation with its DAD for model2 and for model1 - NDXRATIO_ALL(2) = NDXRATIO_ALL(1) - NDYRATIO_ALL(2) = NDYRATIO_ALL(1) - NXOR_ALL(2) = NXOR_ALL(1) - NYOR_ALL(2) = NYOR_ALL(1) - NXEND_ALL(2) = NXEND_ALL(1) - NYEND_ALL(2) = NYEND_ALL(1) - CDAD_NAME(2) = CDAD_NAME(1) - IF (CDADSPAFILE == '' ) THEN - IF (NDXRATIO_ALL(1) == 1 .AND. NDYRATIO_ALL(1) == 1 & - .AND. NXOR_ALL(1) == 1 .AND. NYOR_ALL(1) == 1 ) THEN - ! for spawning with ratio=1 - ! if the DAD of model 1 is itself, the DAD of model 2 also. - CDAD_NAME(2)=CMY_NAME(2) - ENDIF - ENDIF - ! case of model with DAD - IF (CDADSPAFILE /='') CDAD_NAME(2)=CDADSPAFILE -ELSE - CDAD_NAME(2)=CMY_NAME(1) ! model 1 becomes the DAD of model 2 (spawned one) -ENDIF -! -CALL IO_Header_write(TZFILE,HDAD_NAME=CDAD_NAME(2)) -CALL WRITE_LFIFM_n(TZFILE,CDAD_NAME(2)) -! -CALL SECOND_MNH(ZTIME2) -! -ZWRITE = ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 7. Surface variables : -! -ZTIME1 = ZTIME2 -! -TFILE_SURFEX => TZFILE -CALL SPAWN_SURF(HINIFILE,HINIFILEPGD,TZFILE,OSPAWN_SURF) -NULLIFY(TFILE_SURFEX) -! -CALL SECOND_MNH(ZTIME2) -! -ZSURF2 = ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 8. CLOSES THE FMFILE -! ----------------- -! -CALL IO_File_close(TZFILE) -IF (ASSOCIATED(TZSONFILE)) THEN - CALL IO_File_close(TZSONFILE) -END IF -! -!------------------------------------------------------------------------------- -! -!* 9. PRINTS ON OUTPUT-LISTING -! ------------------------ -! -WRITE(ILUOUT,FMT=9900) XZHAT(1) -! -DO JLOOP = 2,IKU - WRITE(ILUOUT,FMT=9901) JLOOP,XZHAT(JLOOP),XZHAT(JLOOP)-XZHAT(JLOOP-1) -END DO -! -IF (NVERB >= 5) THEN - WRITE(ILUOUT,*) 'SPAWN_MODEL2: LUSERV,LUSERC=',LUSERV,LUSERC - WRITE(ILUOUT,*) 'SPAWN_MODEL2: LUSERR,LUSERI,LUSERS=',LUSERR,LUSERI,LUSERS - WRITE(ILUOUT,*) 'SPAWN_MODEL2: LUSERG,LUSERH,NSV=',LUSERG,LUSERH,NSV - WRITE(ILUOUT,*) 'SPAWN_MODEL2: NRR=',NRR - WRITE(ILUOUT,*) 'SPAWN_MODEL2: NVERB=',NVERB - WRITE(ILUOUT,*) 'SPAWN_MODEL2: XLON0,XLAT0,XBETA=',XLON0,XLAT0,XBETA - WRITE(ILUOUT,*) 'SPAWN_MODEL2: LCARTESIAN=',LCARTESIAN - WRITE(ILUOUT,*) 'SPAWN_MODEL2: LOCEAN,LCOUPLES=',LOCEAN,LCOUPLES - IF(LCARTESIAN) THEN - WRITE(ILUOUT,*) 'SPAWN_MODEL2: No map projection used.' - ELSE - WRITE(ILUOUT,*) 'SPAWN_MODEL2: XRPK,XLONORI,XLATORI=',XRPK,XLONORI,XLATORI - IF (ABS(XRPK) == 1.) THEN - WRITE(ILUOUT,*) 'SPAWN_MODEL2: Polar stereo used.' - ELSE IF (XRPK == 0.) THEN - WRITE(ILUOUT,*) 'SPAWN_MODEL2: Mercator used.' - ELSE - WRITE(ILUOUT,*) 'SPAWN_MODEL2: Lambert used, cone factor=',XRPK - END IF - END IF -END IF -! -IF (NVERB >= 10) THEN - WRITE(ILUOUT,*) 'SPAWN_MODEL2: IIB, IJB, IKB=',IIB,IJB,IKB - WRITE(ILUOUT,*) 'SPAWN_MODEL2: IIU, IJU, IKU=',IIU,IJU,IKU -END IF -! -IF(NVERB >= 10) THEN !Value control - WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XZS values:' - WRITE(ILUOUT,*) XZS(1,IJU),XZS((IIU-1)/2,IJU),XZS(IIU,IJU) - WRITE(ILUOUT,*) XZS(1,(IJU-1)/2),XZS((IIU-1)/2,(IJU-1)/2),XZS(IIU,(IJU-1)/2) - WRITE(ILUOUT,*) XZS(1,1) ,XZS((IIU-1)/2,1) ,XZS(IIU,1) -END IF -! -IF(NVERB >= 10) THEN !Value control - WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XUT values:' - WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) & - &(IIU/2,IJU,JK) (IIU,IJU/2,JK)' - DO JKLOOP=1,IKU - WRITE(ILUOUT,*) 'JK = ',JKLOOP - WRITE(ILUOUT,*) XUT(1,IJU/2,JKLOOP),XUT(IIU/2,1,JKLOOP), & - XUT(IIU/2,IJU/2,JKLOOP),XUT(IIU/2,IJU,JKLOOP), & - XUT(IIU,IJU/2,JKLOOP) - END DO - WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XVT values:' - WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) & - &(IIU/2,IJU,JK) (IIU,IJU/2,JK)' - DO JKLOOP=1,IKU - WRITE(ILUOUT,*) 'JK = ',JKLOOP - WRITE(ILUOUT,*) XVT(1,IJU/2,JKLOOP),XVT(IIU/2,1,JKLOOP), & - XVT(IIU/2,IJU/2,JKLOOP),XVT(IIU/2,IJU,JKLOOP), & - XVT(IIU,IJU/2,JKLOOP) - END DO - WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XWT values:' - WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) & - &(IIU/2,IJU,JK) (IIU,IJU/2,JK)' - DO JKLOOP=1,IKU - WRITE(ILUOUT,*) 'JK = ',JKLOOP - WRITE(ILUOUT,*) XWT(1,IJU/2,JKLOOP),XWT(IIU/2,1,JKLOOP), & - XWT(IIU/2,IJU/2,JKLOOP),XWT(IIU/2,IJU,JKLOOP), & - XWT(IIU,IJU/2,JKLOOP) - END DO - WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XTHT values:' - WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) & - &(IIU/2,IJU,JK) (IIU,IJU/2,JK)' - DO JKLOOP=1,IKU - WRITE(ILUOUT,*) 'JK = ',JKLOOP - WRITE(ILUOUT,*) XTHT(1,IJU/2,JKLOOP),XTHT(IIU/2,1,JKLOOP), & - XTHT(IIU/2,IJU/2,JKLOOP),XTHT(IIU/2,IJU,JKLOOP), & - XTHT(IIU,IJU/2,JKLOOP) - END DO - IF(NRR >= 1) THEN - WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XRT values:' - WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) & - &(IIU/2,IJU,JK) (IIU,IJU/2,JK)' - DO JKLOOP=1,IKU - WRITE(ILUOUT,*) 'JK = ',JKLOOP - WRITE(ILUOUT,*) XRT(1,IJU/2,JKLOOP,1),XRT(IIU/2,1,JKLOOP,1), & - XRT(IIU/2,IJU/2,JKLOOP,1),XRT(IIU/2,IJU,JKLOOP,1), & - XRT(IIU,IJU/2,JKLOOP,1) - END DO - END IF - ! - IF (LUV_FLX) THEN - WRITE(ILUOUT,*)'SPAWN_MODEL2: Some EDDY_FLUX values XVU_FLUX(IIU/2,2,:)=',XVU_FLUX_M(IIU/2,2,:) - END IF - ! - IF (LTH_FLX) THEN - WRITE(ILUOUT,*)'SPAWN_MODEL2: Some EDDY_FLUX values XVTH_FLUX(IIU/2,2,:)=',XVTH_FLUX_M(IIU/2,2,:) - WRITE(ILUOUT,*)'SPAWN_MODEL2: Some EDDY_FLUX values XWTH_FLUX(IIU/2,2,:)=',XWTH_FLUX_M(IIU/2,2,:) - END IF - ! -END IF -! -WRITE(ILUOUT,*) 'SPAWN_MODEL2: SPAWN_MODEL2 ENDS CORRECTLY.' -! -CALL SECOND_MNH (ZEND) -! -ZTOT = ZEND - ZSTART ! for computing time analysis -! -ZALL = ZGRID2 + ZSURF2 + ZMISC + ZFIELD2 + ZVER + ZPRESSURE2 + ZANEL + ZWRITE -! -ZPERCALL = 100.*ZALL/ZTOT -! -ZPERCGRID2 = 100.*ZGRID2/ZTOT -ZPERCSURF2 = 100.*ZSURF2/ZTOT -ZPERCMISC = 100.*ZMISC/ZTOT -ZPERCFIELD2 = 100.*ZFIELD2/ZTOT -ZPERCVER = 100.*ZVER/ZTOT -ZPERCPRESSURE2 = 100.*ZPRESSURE2/ZTOT -ZPERCANEL = 100.*ZANEL/ZTOT -ZPERCWRITE = 100.*ZWRITE/ZTOT -! -WRITE(ILUOUT,*) -WRITE(ILUOUT,*) ' ------------------------------------------------------------ ' -WRITE(ILUOUT,*) '| |' -WRITE(ILUOUT,*) '| COMPUTING TIME ANALYSIS in SPAWN_MODEL2 |' -WRITE(ILUOUT,*) '| |' -WRITE(ILUOUT,*) '|------------------------------------------------------------|' -WRITE(ILUOUT,*) '| | | |' -WRITE(ILUOUT,*) '| ROUTINE NAME | CPU-TIME | PERCENTAGE % |' -WRITE(ILUOUT,*) '| | | |' -WRITE(ILUOUT,*) '|---------------------|-------------------|------------------|' -WRITE(ILUOUT,*) '| | | |' -WRITE(UNIT=ILUOUT,FMT=1) ZGRID2 ,ZPERCGRID2 -WRITE(UNIT=ILUOUT,FMT=3) ZFIELD2,ZPERCFIELD2 -WRITE(UNIT=ILUOUT,FMT=8) ZVER,ZPERCVER -WRITE(UNIT=ILUOUT,FMT=7) ZPRESSURE2,ZPERCPRESSURE2 -WRITE(UNIT=ILUOUT,FMT=2) ZSURF2 ,ZPERCSURF2 -WRITE(UNIT=ILUOUT,FMT=4) ZANEL ,ZPERCANEL -WRITE(UNIT=ILUOUT,FMT=5) ZWRITE ,ZPERCWRITE -WRITE(UNIT=ILUOUT,FMT=9) ZMISC ,ZPERCMISC -WRITE(UNIT=ILUOUT,FMT=6) ZTOT ,ZPERCALL -WRITE(ILUOUT,*) ' ------------------------------------------------------------ ' -! -! FORMATS -! ------- -! -1 FORMAT(' | SPAWN_GRID2 | ',F8.3,' | ',F8.3,' |') -3 FORMAT(' | SPAWN_FIELD2 | ',F8.3,' | ',F8.3,' |') -8 FORMAT(' | VER_INTERP_FIELD | ',F8.3,' | ',F8.3,' |') -7 FORMAT(' | SPAWN_PRESSURE2 | ',F8.3,' | ',F8.3,' |') -2 FORMAT(' | SPAWN_SURF2 | ',F8.3,' | ',F8.3,' |') -4 FORMAT(' | ANEL_BALANCE2 | ',F8.3,' | ',F8.3,' |') -5 FORMAT(' | WRITE | ',F8.3,' | ',F8.3,' |') -9 FORMAT(' | MISCELLANEOUS | ',F8.3,' | ',F8.3,' |') -6 FORMAT(' | SPAWN_MODEL2 | ',F8.3,' | ',F8.3,' |') -! -! -CALL IO_File_close(TLUOUT) -! -9900 FORMAT(' K = 001 ZHAT = ',E14.7) -9901 FORMAT(' K = ',I3.3,' ZHAT = ',E14.7,' DZ = ' ,E14.7) -! -!------------------------------------------------------------------------------- -! -! -! Switch back to model index of calling routine -CALL GOTO_MODEL(IMI) -! -END SUBROUTINE SPAWN_MODEL2 diff --git a/src/PHYEX/ext/switch_sbg_lesn.f90 b/src/PHYEX/ext/switch_sbg_lesn.f90 deleted file mode 100644 index 2920680fa..000000000 --- a/src/PHYEX/ext/switch_sbg_lesn.f90 +++ /dev/null @@ -1,589 +0,0 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ $Date$ -!----------------------------------------------------------------- -!----------------------------------------------------------------- -! ########################## - SUBROUTINE SWITCH_SBG_LES_n -! ########################## -! -!!**** *SWITCH_SBG_LESn* - moves LES subgrid quantities from modd_les -!! to modd_lesn or the contrary. -!! -!! PURPOSE -!! ------- -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! V. Masson *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original June 14, 2002 -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_LES -USE MODD_LES_n -USE MODD_CONF_n -USE MODD_NSV -! -USE MODI_SECOND_MNH -! -IMPLICIT NONE -! -REAL :: ZTIME1, ZTIME2 -!------------------------------------------------------------------------------- -! -!* 7.4 interactions of resolved and subgrid quantities -! ----------------------------------------------- -! -CALL SECOND_MNH(ZTIME1) -! -IF (.NOT. ASSOCIATED (X_LES_RES_W_SBG_WThl) ) THEN -! ______ - CALL LES_ALLOCATE('X_LES_RES_W_SBG_WThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <w'w'Thl'> -! _____ - CALL LES_ALLOCATE('X_LES_RES_W_SBG_Thl2',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <w'Thl'2> -! _____ - CALL LES_ALLOCATE('X_LES_RES_ddxa_U_SBG_UaU',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <du'/dxa ua'u'> -! _____ - CALL LES_ALLOCATE('X_LES_RES_ddxa_V_SBG_UaV',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dv'/dxa ua'v'> -! _____ - CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaW',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dw'/dxa ua'w'> -! _______ - CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dw'/dxa ua'Thl'> -! _____ - CALL LES_ALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaW',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dThl'/dxa ua'w'> -! ___ - CALL LES_ALLOCATE('X_LES_RES_ddz_Thl_SBG_W2',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dThl'/dz w'2> -! _______ - CALL LES_ALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dThl'/dxa ua'Thl'> -! - IF (LUSERV) THEN -! _____ - CALL LES_ALLOCATE('X_LES_RES_W_SBG_WRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <w'w'Rt'> -! ____ - CALL LES_ALLOCATE('X_LES_RES_W_SBG_Rt2',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <w'Rt'2> -! _______ - CALL LES_ALLOCATE('X_LES_RES_W_SBG_ThlRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <w'Thl'Rt'> -! ______ - CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dw'/dxa ua'Rt'> -! _____ - CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaW',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dRt'/dxa ua'w'> -! ___ - CALL LES_ALLOCATE('X_LES_RES_ddz_Rt_SBG_W2',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dRt'/dz w'2> -! ______ - CALL LES_ALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dThl'/dxa ua'Rt'> -! _______ - CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dRt'/dxa ua'Thl'> -! ______ - CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaRt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <dRt'/dxa ua'Rt'> - ELSE - CALL LES_ALLOCATE('X_LES_RES_W_SBG_WRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_W_SBG_Rt2',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_W_SBG_ThlRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaW',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_ddz_Rt_SBG_W2',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaThl',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaRt',(/0,0,0/)) - END IF -! ______ -CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <dw'/dxa ua'Sv'> -! _____ -CALL LES_ALLOCATE('X_LES_RES_ddxa_Sv_SBG_UaW',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <dSv'/dxa ua'w'> -! ___ -CALL LES_ALLOCATE('X_LES_RES_ddz_Sv_SBG_W2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/) ) ! <dSv'/dz w'2> -! ______ -CALL LES_ALLOCATE('X_LES_RES_ddxa_Sv_SBG_UaSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <dSv'/dxa ua'Sv'> -! _____ -CALL LES_ALLOCATE('X_LES_RES_W_SBG_WSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <w'w'Sv'> -! ____ -CALL LES_ALLOCATE('X_LES_RES_W_SBG_Sv2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <w'Sv'2> -! -! - X_LES_RES_W_SBG_WThl = XLES_RES_W_SBG_WThl - X_LES_RES_W_SBG_Thl2 = XLES_RES_W_SBG_Thl2 - X_LES_RES_ddxa_U_SBG_UaU = XLES_RES_ddxa_U_SBG_UaU - X_LES_RES_ddxa_V_SBG_UaV = XLES_RES_ddxa_V_SBG_UaV - X_LES_RES_ddxa_W_SBG_UaW = XLES_RES_ddxa_W_SBG_UaW - X_LES_RES_ddxa_W_SBG_UaThl = XLES_RES_ddxa_W_SBG_UaThl - X_LES_RES_ddxa_Thl_SBG_UaW = XLES_RES_ddxa_Thl_SBG_UaW - X_LES_RES_ddz_Thl_SBG_W2 = XLES_RES_ddz_Thl_SBG_W2 - X_LES_RES_ddxa_Thl_SBG_UaThl = XLES_RES_ddxa_Thl_SBG_UaThl - IF (LUSERV) THEN - X_LES_RES_W_SBG_WRt = XLES_RES_W_SBG_WRt - X_LES_RES_W_SBG_Rt2 = XLES_RES_W_SBG_Rt2 - X_LES_RES_W_SBG_ThlRt = XLES_RES_W_SBG_ThlRt - X_LES_RES_ddxa_W_SBG_UaRt = XLES_RES_ddxa_W_SBG_UaRt - X_LES_RES_ddxa_Rt_SBG_UaW = XLES_RES_ddxa_Rt_SBG_UaW - X_LES_RES_ddz_Rt_SBG_W2 = XLES_RES_ddz_Rt_SBG_W2 - X_LES_RES_ddxa_Thl_SBG_UaRt= XLES_RES_ddxa_Thl_SBG_UaRt - X_LES_RES_ddxa_Rt_SBG_UaThl= XLES_RES_ddxa_Rt_SBG_UaThl - X_LES_RES_ddxa_Rt_SBG_UaRt = XLES_RES_ddxa_Rt_SBG_UaRt - END IF - IF (NSV>0) THEN - X_LES_RES_ddxa_W_SBG_UaSv = XLES_RES_ddxa_W_SBG_UaSv - X_LES_RES_ddxa_Sv_SBG_UaW = XLES_RES_ddxa_Sv_SBG_UaW - X_LES_RES_ddz_Sv_SBG_W2 = XLES_RES_ddz_Sv_SBG_W2 - X_LES_RES_ddxa_Sv_SBG_UaSv = XLES_RES_ddxa_Sv_SBG_UaSv - X_LES_RES_W_SBG_WSv = XLES_RES_W_SBG_WSv - X_LES_RES_W_SBG_Sv2 = XLES_RES_W_SBG_Sv2 - END IF -! -! - CALL LES_ALLOCATE('X_LES_SUBGRID_U2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <u'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_V2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <v'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_W2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_Thl2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Thl'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_UV',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <u'v'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WU',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'u'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WV',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'v'> - CALL LES_ALLOCATE('X_LES_SUBGRID_UThl',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <u'Thl'> - CALL LES_ALLOCATE('X_LES_SUBGRID_VThl',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <v'Thl'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WThl',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Thl'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WThv',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Thv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_ThlThv',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Thl'Thv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_W2Thl',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'2Thl> - CALL LES_ALLOCATE('X_LES_SUBGRID_WThl2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Thl'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Tke',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <epsilon> - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Thl2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <epsilon_Thl2> - CALL LES_ALLOCATE('X_LES_SUBGRID_WP',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'p'> - CALL LES_ALLOCATE('X_LES_SUBGRID_PHI3',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! phi3 - CALL LES_ALLOCATE('X_LES_SUBGRID_LMix',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Lmix - CALL LES_ALLOCATE('X_LES_SUBGRID_LDiss',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Ldiss - CALL LES_ALLOCATE('X_LES_SUBGRID_Km',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Km - CALL LES_ALLOCATE('X_LES_SUBGRID_Kh',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Kh - CALL LES_ALLOCATE('X_LES_SUBGRID_ThlPz',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Thl'dp'/dz> - CALL LES_ALLOCATE('X_LES_SUBGRID_UTke',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <u'Tke> - CALL LES_ALLOCATE('X_LES_SUBGRID_VTke',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <v'Tke> - CALL LES_ALLOCATE('X_LES_SUBGRID_WTke',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Tke> - CALL LES_ALLOCATE('X_LES_SUBGRID_ddz_WTke',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <dw'Tke/dz> - - CALL LES_ALLOCATE('X_LES_SUBGRID_THLUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Thl of the Updraft - CALL LES_ALLOCATE('X_LES_SUBGRID_RTUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Rt of the Updraft - CALL LES_ALLOCATE('X_LES_SUBGRID_RVUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Rv of the Updraft - CALL LES_ALLOCATE('X_LES_SUBGRID_RCUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Rc of the Updraft - CALL LES_ALLOCATE('X_LES_SUBGRID_RIUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Ri of the Updraft - CALL LES_ALLOCATE('X_LES_SUBGRID_WUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Thl of the Updraft - CALL LES_ALLOCATE('X_LES_SUBGRID_MASSFLUX',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Mass Flux - CALL LES_ALLOCATE('X_LES_SUBGRID_DETR',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Detrainment - CALL LES_ALLOCATE('X_LES_SUBGRID_ENTR',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Entrainment - CALL LES_ALLOCATE('X_LES_SUBGRID_FRACUP',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Updraft Fraction - CALL LES_ALLOCATE('X_LES_SUBGRID_THVUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Thv of the Updraft - CALL LES_ALLOCATE('X_LES_SUBGRID_WTHLMF',(/NLES_K,NLES_TIMES,NLES_MASKS/))! Flux of thl - CALL LES_ALLOCATE('X_LES_SUBGRID_WRTMF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Flux of rt - CALL LES_ALLOCATE('X_LES_SUBGRID_WTHVMF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Flux of thv - CALL LES_ALLOCATE('X_LES_SUBGRID_WUMF',(/NLES_K,NLES_TIMES,NLES_MASKS/))! Flux of u - CALL LES_ALLOCATE('X_LES_SUBGRID_WVMF',(/NLES_K,NLES_TIMES,NLES_MASKS/))! Flux of v - - IF (LUSERV ) THEN - CALL LES_ALLOCATE('X_LES_SUBGRID_Rt2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Rt'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_ThlRt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Thl'Rt'> - CALL LES_ALLOCATE('X_LES_SUBGRID_URt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <u'Rt'> - CALL LES_ALLOCATE('X_LES_SUBGRID_VRt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <v'Rt'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WRt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Rt'> - CALL LES_ALLOCATE('X_LES_SUBGRID_RtThv',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Rt'Thv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_W2Rt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'2Rt'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WThlRt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Thl'Rt'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WRt2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Rt'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Rt2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <epsilon_Rt2> - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_ThlRt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <epsilon_ThlRt> - CALL LES_ALLOCATE('X_LES_SUBGRID_RtPz',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Rt'dp'/dz> - CALL LES_ALLOCATE('X_LES_SUBGRID_PSI3',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! psi3 - ELSE - CALL LES_ALLOCATE('X_LES_SUBGRID_Rt2',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_ThlRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_URt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_VRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_WRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_RtThv',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_W2Rt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_WThlRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_WRt2',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Rt2',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_ThlRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_RtPz',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_PSI3',(/0,0,0/)) - END IF - IF (LUSERC ) THEN - CALL LES_ALLOCATE('X_LES_SUBGRID_Rc2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Rc'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_URc',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <u'Rc'> - CALL LES_ALLOCATE('X_LES_SUBGRID_VRc',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <v'Rc'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WRc',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Rc'> - ELSE - CALL LES_ALLOCATE('X_LES_SUBGRID_Rc2',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_URc',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_VRc',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_WRc',(/0,0,0/)) - END IF - IF (LUSERI ) THEN - CALL LES_ALLOCATE('X_LES_SUBGRID_Ri2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Ri'2> - ELSE - CALL LES_ALLOCATE('X_LES_SUBGRID_Ri2',(/0,0,0/)) - END IF - IF (NSV>0 ) THEN - CALL LES_ALLOCATE('X_LES_SUBGRID_USv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <u'Sv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_VSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <v'Sv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <w'Sv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_Sv2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <Sv'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_SvThv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <Sv'Thv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_W2Sv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <w'2Sv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WSv2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <w'Sv'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Sv2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <epsilon_Sv2> - CALL LES_ALLOCATE('X_LES_SUBGRID_SvPz',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <Sv'dp'/dz> - ELSE - CALL LES_ALLOCATE('X_LES_SUBGRID_USv',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_VSv',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_WSv',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_Sv2',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_SvThv',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_W2Sv',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_WSv2',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Sv2',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_SvPz',(/0,0,0,0/)) - END IF -! - X_LES_SUBGRID_U2 = XLES_SUBGRID_U2 - X_LES_SUBGRID_V2 = XLES_SUBGRID_V2 - X_LES_SUBGRID_W2 = XLES_SUBGRID_W2 - X_LES_SUBGRID_Thl2= XLES_SUBGRID_Thl2 - X_LES_SUBGRID_UV = XLES_SUBGRID_UV - X_LES_SUBGRID_WU = XLES_SUBGRID_WU - X_LES_SUBGRID_WV = XLES_SUBGRID_WV - X_LES_SUBGRID_UThl= XLES_SUBGRID_UThl - X_LES_SUBGRID_VThl= XLES_SUBGRID_VThl - X_LES_SUBGRID_WThl= XLES_SUBGRID_WThl - X_LES_SUBGRID_WThv = XLES_SUBGRID_WThv - X_LES_SUBGRID_ThlThv = XLES_SUBGRID_ThlThv - X_LES_SUBGRID_W2Thl = XLES_SUBGRID_W2Thl - X_LES_SUBGRID_WThl2 = XLES_SUBGRID_WThl2 - X_LES_SUBGRID_DISS_Tke = XLES_SUBGRID_DISS_Tke - X_LES_SUBGRID_DISS_Thl2= XLES_SUBGRID_DISS_Thl2 - X_LES_SUBGRID_WP = XLES_SUBGRID_WP - X_LES_SUBGRID_PHI3 = XLES_SUBGRID_PHI3 - X_LES_SUBGRID_LMix = XLES_SUBGRID_LMix - X_LES_SUBGRID_LDiss = XLES_SUBGRID_LDiss - X_LES_SUBGRID_Km = XLES_SUBGRID_Km - X_LES_SUBGRID_Kh = XLES_SUBGRID_Kh - X_LES_SUBGRID_ThlPz = XLES_SUBGRID_ThlPz - X_LES_SUBGRID_UTke= XLES_SUBGRID_UTke - X_LES_SUBGRID_VTke= XLES_SUBGRID_VTke - X_LES_SUBGRID_WTke= XLES_SUBGRID_WTke - X_LES_SUBGRID_ddz_WTke =XLES_SUBGRID_ddz_WTke - - X_LES_SUBGRID_THLUP_MF = XLES_SUBGRID_THLUP_MF - X_LES_SUBGRID_RTUP_MF = XLES_SUBGRID_RTUP_MF - X_LES_SUBGRID_RVUP_MF = XLES_SUBGRID_RVUP_MF - X_LES_SUBGRID_RCUP_MF = XLES_SUBGRID_RCUP_MF - X_LES_SUBGRID_RIUP_MF = XLES_SUBGRID_RIUP_MF - X_LES_SUBGRID_WUP_MF = XLES_SUBGRID_WUP_MF - X_LES_SUBGRID_MASSFLUX = XLES_SUBGRID_MASSFLUX - X_LES_SUBGRID_DETR = XLES_SUBGRID_DETR - X_LES_SUBGRID_ENTR = XLES_SUBGRID_ENTR - X_LES_SUBGRID_FRACUP = XLES_SUBGRID_FRACUP - X_LES_SUBGRID_THVUP_MF = XLES_SUBGRID_THVUP_MF - X_LES_SUBGRID_WTHLMF = XLES_SUBGRID_WTHLMF - X_LES_SUBGRID_WRTMF = XLES_SUBGRID_WRTMF - X_LES_SUBGRID_WTHVMF = XLES_SUBGRID_WTHVMF - X_LES_SUBGRID_WUMF = XLES_SUBGRID_WUMF - X_LES_SUBGRID_WVMF = XLES_SUBGRID_WVMF - - IF (LUSERV ) THEN - X_LES_SUBGRID_Rt2 = XLES_SUBGRID_Rt2 - X_LES_SUBGRID_ThlRt= XLES_SUBGRID_ThlRt - X_LES_SUBGRID_URt = XLES_SUBGRID_URt - X_LES_SUBGRID_VRt = XLES_SUBGRID_VRt - X_LES_SUBGRID_WRt = XLES_SUBGRID_WRt - X_LES_SUBGRID_RtThv = XLES_SUBGRID_RtThv - X_LES_SUBGRID_W2Rt = XLES_SUBGRID_W2Rt - X_LES_SUBGRID_WThlRt = XLES_SUBGRID_WThlRt - X_LES_SUBGRID_WRt2 = XLES_SUBGRID_WRt2 - X_LES_SUBGRID_DISS_Rt2= XLES_SUBGRID_DISS_Rt2 - X_LES_SUBGRID_DISS_ThlRt= XLES_SUBGRID_DISS_ThlRt - X_LES_SUBGRID_RtPz = XLES_SUBGRID_RtPz - X_LES_SUBGRID_PSI3 = XLES_SUBGRID_PSI3 - END IF - IF (LUSERC ) THEN - X_LES_SUBGRID_Rc2 = XLES_SUBGRID_Rc2 - X_LES_SUBGRID_URc = XLES_SUBGRID_URc - X_LES_SUBGRID_VRc = XLES_SUBGRID_VRc - X_LES_SUBGRID_WRc = XLES_SUBGRID_WRc - END IF - IF (LUSERI ) THEN - X_LES_SUBGRID_Ri2 = XLES_SUBGRID_Ri2 - END IF - IF (NSV>0 ) THEN - X_LES_SUBGRID_USv = XLES_SUBGRID_USv - X_LES_SUBGRID_VSv = XLES_SUBGRID_VSv - X_LES_SUBGRID_WSv = XLES_SUBGRID_WSv - X_LES_SUBGRID_Sv2 = XLES_SUBGRID_Sv2 - X_LES_SUBGRID_SvThv = XLES_SUBGRID_SvThv - X_LES_SUBGRID_W2Sv = XLES_SUBGRID_W2Sv - X_LES_SUBGRID_WSv2 = XLES_SUBGRID_WSv2 - X_LES_SUBGRID_DISS_Sv2 = XLES_SUBGRID_DISS_Sv2 - X_LES_SUBGRID_SvPz = XLES_SUBGRID_SvPz - END IF -! -! - CALL LES_ALLOCATE('X_LES_UW0',(/NLES_TIMES/)) - CALL LES_ALLOCATE('X_LES_VW0',(/NLES_TIMES/)) - CALL LES_ALLOCATE('X_LES_USTAR',(/NLES_TIMES/)) - CALL LES_ALLOCATE('X_LES_Q0',(/NLES_TIMES/)) - CALL LES_ALLOCATE('X_LES_E0',(/NLES_TIMES/)) - CALL LES_ALLOCATE('X_LES_SV0',(/NLES_TIMES,NSV/)) -! - X_LES_UW0 = XLES_UW0 - X_LES_VW0 = XLES_VW0 - X_LES_USTAR = XLES_USTAR - X_LES_Q0 = XLES_Q0 - X_LES_E0 = XLES_E0 - IF (NSV>0) X_LES_SV0 = XLES_SV0 - -ELSE -! - XLES_RES_W_SBG_WThl = X_LES_RES_W_SBG_WThl - XLES_RES_W_SBG_Thl2 = X_LES_RES_W_SBG_Thl2 - XLES_RES_ddxa_U_SBG_UaU = X_LES_RES_ddxa_U_SBG_UaU - XLES_RES_ddxa_V_SBG_UaV = X_LES_RES_ddxa_V_SBG_UaV - XLES_RES_ddxa_W_SBG_UaW = X_LES_RES_ddxa_W_SBG_UaW - XLES_RES_ddxa_W_SBG_UaThl = X_LES_RES_ddxa_W_SBG_UaThl - XLES_RES_ddxa_Thl_SBG_UaW = X_LES_RES_ddxa_Thl_SBG_UaW - XLES_RES_ddz_Thl_SBG_W2 = X_LES_RES_ddz_Thl_SBG_W2 - XLES_RES_ddxa_Thl_SBG_UaThl = X_LES_RES_ddxa_Thl_SBG_UaThl - IF (LUSERV) THEN - XLES_RES_W_SBG_WRt = X_LES_RES_W_SBG_WRt - XLES_RES_W_SBG_Rt2 = X_LES_RES_W_SBG_Rt2 - XLES_RES_W_SBG_ThlRt = X_LES_RES_W_SBG_ThlRt - XLES_RES_ddxa_W_SBG_UaRt = X_LES_RES_ddxa_W_SBG_UaRt - XLES_RES_ddxa_Rt_SBG_UaW = X_LES_RES_ddxa_Rt_SBG_UaW - XLES_RES_ddz_Rt_SBG_W2 = X_LES_RES_ddz_Rt_SBG_W2 - XLES_RES_ddxa_Thl_SBG_UaRt= X_LES_RES_ddxa_Thl_SBG_UaRt - XLES_RES_ddxa_Rt_SBG_UaThl= X_LES_RES_ddxa_Rt_SBG_UaThl - XLES_RES_ddxa_Rt_SBG_UaRt = X_LES_RES_ddxa_Rt_SBG_UaRt - END IF - IF (NSV>0) THEN - XLES_RES_ddxa_W_SBG_UaSv = X_LES_RES_ddxa_W_SBG_UaSv - XLES_RES_ddxa_Sv_SBG_UaW = X_LES_RES_ddxa_Sv_SBG_UaW - XLES_RES_ddz_Sv_SBG_W2 = X_LES_RES_ddz_Sv_SBG_W2 - XLES_RES_ddxa_Sv_SBG_UaSv = X_LES_RES_ddxa_Sv_SBG_UaSv - XLES_RES_W_SBG_WSv = X_LES_RES_W_SBG_WSv - XLES_RES_W_SBG_Sv2 = X_LES_RES_W_SBG_Sv2 - END IF - XLES_SUBGRID_U2 = X_LES_SUBGRID_U2 - XLES_SUBGRID_V2 = X_LES_SUBGRID_V2 - XLES_SUBGRID_W2 = X_LES_SUBGRID_W2 - XLES_SUBGRID_Thl2= X_LES_SUBGRID_Thl2 - XLES_SUBGRID_UV = X_LES_SUBGRID_UV - XLES_SUBGRID_WU = X_LES_SUBGRID_WU - XLES_SUBGRID_WV = X_LES_SUBGRID_WV - XLES_SUBGRID_UThl= X_LES_SUBGRID_UThl - XLES_SUBGRID_VThl= X_LES_SUBGRID_VThl - XLES_SUBGRID_WThl= X_LES_SUBGRID_WThl - XLES_SUBGRID_WThv = X_LES_SUBGRID_WThv - XLES_SUBGRID_ThlThv = X_LES_SUBGRID_ThlThv - XLES_SUBGRID_W2Thl = X_LES_SUBGRID_W2Thl - XLES_SUBGRID_WThl2 = X_LES_SUBGRID_WThl2 - XLES_SUBGRID_DISS_Tke = X_LES_SUBGRID_DISS_Tke - XLES_SUBGRID_DISS_Thl2= X_LES_SUBGRID_DISS_Thl2 - XLES_SUBGRID_WP = X_LES_SUBGRID_WP - XLES_SUBGRID_PHI3 = X_LES_SUBGRID_PHI3 - XLES_SUBGRID_LMix = X_LES_SUBGRID_LMix - XLES_SUBGRID_LDiss = X_LES_SUBGRID_LDiss - XLES_SUBGRID_Km = X_LES_SUBGRID_Km - XLES_SUBGRID_Kh = X_LES_SUBGRID_Kh - XLES_SUBGRID_ThlPz = X_LES_SUBGRID_ThlPz - XLES_SUBGRID_UTke= X_LES_SUBGRID_UTke - XLES_SUBGRID_VTke= X_LES_SUBGRID_VTke - XLES_SUBGRID_WTke= X_LES_SUBGRID_WTke - XLES_SUBGRID_ddz_WTke =X_LES_SUBGRID_ddz_WTke - - XLES_SUBGRID_THLUP_MF = X_LES_SUBGRID_THLUP_MF - XLES_SUBGRID_RTUP_MF = X_LES_SUBGRID_RTUP_MF - XLES_SUBGRID_RVUP_MF = X_LES_SUBGRID_RVUP_MF - XLES_SUBGRID_RCUP_MF = X_LES_SUBGRID_RCUP_MF - XLES_SUBGRID_RIUP_MF = X_LES_SUBGRID_RIUP_MF - XLES_SUBGRID_WUP_MF = X_LES_SUBGRID_WUP_MF - XLES_SUBGRID_MASSFLUX = X_LES_SUBGRID_MASSFLUX - XLES_SUBGRID_DETR = X_LES_SUBGRID_DETR - XLES_SUBGRID_ENTR = X_LES_SUBGRID_ENTR - XLES_SUBGRID_FRACUP = X_LES_SUBGRID_FRACUP - XLES_SUBGRID_THVUP_MF = X_LES_SUBGRID_THVUP_MF - XLES_SUBGRID_WTHLMF = X_LES_SUBGRID_WTHLMF - XLES_SUBGRID_WRTMF = X_LES_SUBGRID_WRTMF - XLES_SUBGRID_WTHVMF = X_LES_SUBGRID_WTHVMF - XLES_SUBGRID_WUMF = X_LES_SUBGRID_WUMF - XLES_SUBGRID_WVMF = X_LES_SUBGRID_WVMF - - IF (LUSERV ) THEN - XLES_SUBGRID_Rt2 = X_LES_SUBGRID_Rt2 - XLES_SUBGRID_ThlRt= X_LES_SUBGRID_ThlRt - XLES_SUBGRID_URt = X_LES_SUBGRID_URt - XLES_SUBGRID_VRt = X_LES_SUBGRID_VRt - XLES_SUBGRID_WRt = X_LES_SUBGRID_WRt - XLES_SUBGRID_RtThv = X_LES_SUBGRID_RtThv - XLES_SUBGRID_W2Rt = X_LES_SUBGRID_W2Rt - XLES_SUBGRID_WThlRt = X_LES_SUBGRID_WThlRt - XLES_SUBGRID_WRt2 = X_LES_SUBGRID_WRt2 - XLES_SUBGRID_DISS_Rt2= X_LES_SUBGRID_DISS_Rt2 - XLES_SUBGRID_DISS_ThlRt= X_LES_SUBGRID_DISS_ThlRt - XLES_SUBGRID_RtPz = X_LES_SUBGRID_RtPz - XLES_SUBGRID_PSI3 = X_LES_SUBGRID_PSI3 - END IF - IF (LUSERC ) THEN - XLES_SUBGRID_Rc2 = X_LES_SUBGRID_Rc2 - XLES_SUBGRID_URc = X_LES_SUBGRID_URc - XLES_SUBGRID_VRc = X_LES_SUBGRID_VRc - XLES_SUBGRID_WRc = X_LES_SUBGRID_WRc - END IF - IF (LUSERI ) THEN - XLES_SUBGRID_Ri2 = X_LES_SUBGRID_Ri2 - END IF - IF (NSV>0 ) THEN - XLES_SUBGRID_USv = X_LES_SUBGRID_USv - XLES_SUBGRID_VSv = X_LES_SUBGRID_VSv - XLES_SUBGRID_WSv = X_LES_SUBGRID_WSv - XLES_SUBGRID_Sv2 = X_LES_SUBGRID_Sv2 - XLES_SUBGRID_SvThv = X_LES_SUBGRID_SvThv - XLES_SUBGRID_W2Sv = X_LES_SUBGRID_W2Sv - XLES_SUBGRID_WSv2 = X_LES_SUBGRID_WSv2 - XLES_SUBGRID_DISS_Sv2 = X_LES_SUBGRID_DISS_Sv2 - XLES_SUBGRID_SvPz = X_LES_SUBGRID_SvPz - END IF - XLES_UW0 = X_LES_UW0 - XLES_VW0 = X_LES_VW0 - XLES_USTAR = X_LES_USTAR - XLES_Q0 = X_LES_Q0 - XLES_E0 = X_LES_E0 - IF (NSV>0) XLES_SV0 = X_LES_SV0 -! - CALL LES_DEALLOCATE('X_LES_RES_W_SBG_WThl') - CALL LES_DEALLOCATE('X_LES_RES_W_SBG_Thl2') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_U_SBG_UaU') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_V_SBG_UaV') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_W_SBG_UaW') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_W_SBG_UaThl') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaW') - CALL LES_DEALLOCATE('X_LES_RES_ddz_Thl_SBG_W2') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaThl') - CALL LES_DEALLOCATE('X_LES_RES_W_SBG_WRt') - CALL LES_DEALLOCATE('X_LES_RES_W_SBG_Rt2') - CALL LES_DEALLOCATE('X_LES_RES_W_SBG_ThlRt') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_W_SBG_UaRt') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaW') - CALL LES_DEALLOCATE('X_LES_RES_ddz_Rt_SBG_W2') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaRt') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaThl') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaRt') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_W_SBG_UaSv') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Sv_SBG_UaW') - CALL LES_DEALLOCATE('X_LES_RES_ddz_Sv_SBG_W2') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Sv_SBG_UaSv') - CALL LES_DEALLOCATE('X_LES_RES_W_SBG_WSv') - CALL LES_DEALLOCATE('X_LES_RES_W_SBG_Sv2') -! - CALL LES_DEALLOCATE('X_LES_SUBGRID_U2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_V2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_W2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_Thl2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_UV') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WU') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WV') - CALL LES_DEALLOCATE('X_LES_SUBGRID_UThl') - CALL LES_DEALLOCATE('X_LES_SUBGRID_VThl') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WThl') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WThv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_ThlThv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_W2Thl') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WThl2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_Tke') - CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_Thl2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WP') - CALL LES_DEALLOCATE('X_LES_SUBGRID_PHI3') - CALL LES_DEALLOCATE('X_LES_SUBGRID_LMix') - CALL LES_DEALLOCATE('X_LES_SUBGRID_LDiss') - CALL LES_DEALLOCATE('X_LES_SUBGRID_Km') - CALL LES_DEALLOCATE('X_LES_SUBGRID_Kh') - CALL LES_DEALLOCATE('X_LES_SUBGRID_ThlPz') - CALL LES_DEALLOCATE('X_LES_SUBGRID_UTke') - CALL LES_DEALLOCATE('X_LES_SUBGRID_VTke') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WTke') - CALL LES_DEALLOCATE('X_LES_SUBGRID_ddz_WTke') - - CALL LES_DEALLOCATE('X_LES_SUBGRID_THLUP_MF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_RTUP_MF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_RVUP_MF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_RCUP_MF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_RIUP_MF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WUP_MF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_MASSFLUX') - CALL LES_DEALLOCATE('X_LES_SUBGRID_DETR') - CALL LES_DEALLOCATE('X_LES_SUBGRID_ENTR') - CALL LES_DEALLOCATE('X_LES_SUBGRID_FRACUP') - CALL LES_DEALLOCATE('X_LES_SUBGRID_THVUP_MF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WTHLMF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WRTMF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WTHVMF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WUMF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WVMF') - - CALL LES_DEALLOCATE('X_LES_SUBGRID_Rt2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_ThlRt') - CALL LES_DEALLOCATE('X_LES_SUBGRID_URt') - CALL LES_DEALLOCATE('X_LES_SUBGRID_VRt') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WRt') - CALL LES_DEALLOCATE('X_LES_SUBGRID_RtThv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_W2Rt') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WThlRt') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WRt2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_Rt2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_ThlRt') - CALL LES_DEALLOCATE('X_LES_SUBGRID_RtPz') - CALL LES_DEALLOCATE('X_LES_SUBGRID_PSI3') - CALL LES_DEALLOCATE('X_LES_SUBGRID_Rc2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_URc') - CALL LES_DEALLOCATE('X_LES_SUBGRID_VRc') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WRc') - CALL LES_DEALLOCATE('X_LES_SUBGRID_Ri2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_USv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_VSv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WSv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_Sv2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_SvThv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_W2Sv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WSv2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_Sv2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_SvPz') - ! - CALL LES_DEALLOCATE('X_LES_UW0') - CALL LES_DEALLOCATE('X_LES_VW0') - CALL LES_DEALLOCATE('X_LES_USTAR') - CALL LES_DEALLOCATE('X_LES_Q0') - CALL LES_DEALLOCATE('X_LES_E0') - CALL LES_DEALLOCATE('X_LES_SV0') -! -END IF -! -CALL SECOND_MNH(ZTIME2) -! -XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 -! -END SUBROUTINE SWITCH_SBG_LES_n diff --git a/src/PHYEX/ext/to_elec_fieldn.f90 b/src/PHYEX/ext/to_elec_fieldn.f90 deleted file mode 100644 index a6822298d..000000000 --- a/src/PHYEX/ext/to_elec_fieldn.f90 +++ /dev/null @@ -1,184 +0,0 @@ -!MNH_LIC Copyright 2002-2019 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ########################### - MODULE MODI_TO_ELEC_FIELD_n -! ########################### -! -INTERFACE - SUBROUTINE TO_ELEC_FIELD_n(PRT, PSVT, PRHODJ, KTCOUNT, KRR, & - PEFIELDU, PEFIELDV, PEFIELDW, PPHIT) -! -INTEGER, INTENT(IN) :: KTCOUNT ! counter value of the - ! model temporal loop -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Jacobian -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Scalar variables with - ! electric charge density -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Mixing ratio -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDU ! 3 components -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDV ! of the -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDW ! electric field -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PPHIT ! Electrostatic potential - -END SUBROUTINE TO_ELEC_FIELD_n -END INTERFACE -END MODULE MODI_TO_ELEC_FIELD_n -! -! ############################################################### - SUBROUTINE TO_ELEC_FIELD_n(PRT, PSVT, PRHODJ, KTCOUNT, KRR, & - PEFIELDU, PEFIELDV, PEFIELDW, PPHIT) -! ############################################################### -! -! -!!**** * - compute the electric field -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute... -!! -!! -!!** METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! None -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! C. Barthe, G. Molinie, J.-P. Pinty *Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! Original 2002 -!! C. Barthe 06/11/09 update to version 4.8.1 -!! M. Chong 26/01/10 Add Small ions -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_REF_n, ONLY : XRHODREF -USE MODD_PARAMETERS, ONLY : JPVEXT -USE MODD_RAIN_ICE_DESCR_n, ONLY : XRTMIN -USE MODD_ELEC_DESCR, ONLY : XRELAX_ELEC, XECHARGE -USE MODD_ELEC_n, ONLY : XESOURCEFW -! -USE MODI_ELEC_FIELD_n -! -USE MODE_ll -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KTCOUNT ! counter value of the - ! model temporal loop -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Jacobian -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Scalar variables with - ! electric charge density -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Mixing ratio -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDU ! 3 components -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDV ! of the -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDW ! electric field -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PPHIT ! Electrostatic potential -! -! -!* 0.2 Declarations of local variables : -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZW ! work array -! -INTEGER :: IIB ! Define -INTEGER :: IIE ! the -INTEGER :: IJB ! physical -INTEGER :: IJE ! domain -INTEGER :: IKB ! -INTEGER :: IKE ! -INTEGER :: IIU, IJU, IKU -INTEGER :: II -INTEGER :: IINFO_ll -! -TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange -! -! -!------------------------------------------------------------------------------- -! -!* 1. COMPUTE THE LOOP BOUNDS -! ----------------------- -! -NULLIFY(TZFIELDS_ll) -! -! Compute loop bounds -! -CALL GET_PHYSICAL_ll(IIB,IJB,IIE,IJE) -CALL GET_DIM_EXT_ll('B',IIU,IJU) -! -IKB = 1 + JPVEXT -IKU = SIZE(XESOURCEFW,3) -IKE = IKU - JPVEXT -! -! allocations -! -ALLOCATE(ZW(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3))) -ZW(:,:,:) = 0. -! -! -!------------------------------------------------------------------------------- -! -!* 2. TRANSFORM PSVT from C/kg INTO C/m3 and SUM -! ---------------------------------- -! -DO II = 1, KRR+1 - ZW(:,:,:) = ZW(:,:,:) + PSVT(:,:,:,II) * XRHODREF(:,:,:) -END DO -! -!------------------------------------------------------------------------------- -! -!* 3. BOUNDARY CONDITIONS -! ------------------- -! -ZW(:,:,1:IKB-1) = 0.0 ! Setup to neutralize the computation on the - ! first ligne of the tridiagonal system starting - ! at IKB-1 -ZW(:,:,IKE:IKE+JPVEXT) = XESOURCEFW(:,:,IKE:IKE+JPVEXT) -! -CALL ADD3DFIELD_ll( TZFIELDS_ll, ZW, 'TO_ELEC_FIELD_n::ZW' ) -CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) -CALL CLEANLIST_ll(TZFIELDS_ll) -! -! -!------------------------------------------------------------------------------- -! -!* 4. COMPUTE THE ELECTRIC FIELD -! -------------------------- -! -IF (PRESENT(PPHIT)) THEN - CALL ELEC_FIELD_n (ZW, KTCOUNT, XRELAX_ELEC, PRHODJ, & - PEFIELDU, PEFIELDV, PEFIELDW, PPHIT) -ELSE - CALL ELEC_FIELD_n (ZW, KTCOUNT, XRELAX_ELEC, PRHODJ, & - PEFIELDU, PEFIELDV, PEFIELDW) -ENDIF -! -DEALLOCATE(ZW) -! -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE TO_ELEC_FIELD_n - diff --git a/src/PHYEX/ext/two_wayn.f90 b/src/PHYEX/ext/two_wayn.f90 deleted file mode 100644 index b2299ee4a..000000000 --- a/src/PHYEX/ext/two_wayn.f90 +++ /dev/null @@ -1,1309 +0,0 @@ -!MNH_LIC Copyright 1997-2020 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ################### - MODULE MODI_TWO_WAY_n -! ################### -! -INTERFACE -! - SUBROUTINE TWO_WAY_n (KRR,KSV,PRHODJ,KMI,PTSTEP, & - PUM ,PVM, PWM, PTHM, PRM, PSVM, & - PRUS,PRVS,PRWS,PRTHS,PRRS,PRSVS, & - PINPRC,PINPRR,PINPRS,PINPRG,PINPRH,PPRCONV,PPRSCONV, & - PDIRFLASWD,PSCAFLASWD,PDIRSRFSWD,OMASKkids ) -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSV ! Number of Scalar Variables -INTEGER, INTENT(IN) :: KMI ! Model index -! -REAL, INTENT(IN) :: PTSTEP ! Timestep duration -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (Rho) dry * Jacobian -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM, PVM, PWM ! Variables at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM, PSVM -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS ! Source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS, PRSVS ! terms -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC,PINPRR,PINPRS,PINPRG,PINPRH, & - PPRCONV,PPRSCONV ! precipitating variables -LOGICAL, DIMENSION(:,:), INTENT(INOUT) :: OMASKkids ! true where kids exist -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDIRFLASWD,PSCAFLASWD ! Long wave radiation -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDIRSRFSWD ! Long wave radiation -! -END SUBROUTINE TWO_WAY_n -! -END INTERFACE -! -END MODULE MODI_TWO_WAY_n -! ####################################################################### - SUBROUTINE TWO_WAY_n (KRR,KSV,PRHODJ,KMI,PTSTEP, & - PUM ,PVM, PWM, PTHM, PRM, PSVM, & - PRUS,PRVS,PRWS,PRTHS,PRRS,PRSVS, & - PINPRC,PINPRR,PINPRS,PINPRG,PINPRH,PPRCONV,PPRSCONV, & - PDIRFLASWD,PSCAFLASWD,PDIRSRFSWD,OMASKkids ) -! ####################################################################### -! -!!**** *TWO_WAY_n* - Relaxation of all fields toward the average value obtained -!!**** by the nested model $n for TWO_WAY interactive gridnesting -!! -!! PURPOSE -!! ------- -!! The purpose of TWO_WAY_n is: -!! - first to average the fine scale fields of the inner model $n to -!! the coarse mesh scale of the present outer model DAD($n). -!! - second to apply the relaxation toward these average fields over the -!! intersecting domain -! -! -!!** METHOD -!! ------ -!! Use a simple top hat horizontal average applied in the inner domain -!! except in a halo inner band of IHALO width (default value 0). -!! The relaxation equation writes: -!! ___ t-1 -!! | \ rhodj * a | -!! d (RHODJ * A) | t-1 /__ | -!! -------------- = -K * RHODJ * |A - ----------------- | -!! dt 2W | ___ | -!! | \ rhodj | -!! | /__ | -!! -!! In this routine $n denotes the nested model (with all variables X...,N...). -!! KMI is the number of father model (all variables P..., K...) -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! MODULE MODD_CONF_n : all -!! -!! MODULE MODD_NESTING: NDT_2_WAY -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! J. P. Lafore *Meteo-France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 12/11/97 -!! 20/01/98 remove the TKE and EPS change -!! P. Jabouille 03/04/00 parallelisation -!! N. Asencio 18/07/05 Add the surface parameters : precipitating -!! hydrometeors, the Short and Long Wave -!! + MASKkids array -!! 20/05/06 Remove EPS -!! M. Leriche 16/07/10 Add ice phase chemical species -!! V.Masson, C.Lac 08/10 Corrections in relaxation -!! J. Escobar 27/06/2011 correction for gridnesting with different SHAPE -!! Bosseur & Filippi 07/2013 Adds Forefire -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! Modification 01/2016 (JP Pinty) Add LIMA -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 29/03/2019: bugfix: use correct sizes for 3rd dimension in allocation and loops when CRAD/='NONE' -!------------------------------------------------------------------------------ -! -!* 0. DECLARATIONS -! ------------ -USE MODE_ll -USE MODE_MODELN_HANDLER -! -USE MODD_PARAMETERS ! Declarative modules -USE MODD_NESTING -USE MODD_CONF -USE MODD_NSV -USE MODD_PARAM_ICE_n, ONLY : LSEDIC -USE MODD_PARAM_C2R2, ONLY : LSEDC -USE MODD_PARAM_LIMA, ONLY : NSEDC => LSEDC -! -USE MODD_FIELD_n ! modules relative to the inner (fine scale) model $n -USE MODD_PRECIP_n , ONLY : XINPRC,XINPRR,XINPRS,XINPRG,XINPRH -USE MODD_RADIATIONS_n ,ONLY:XDIRFLASWD,XSCAFLASWD,XDIRSRFSWD -USE MODD_DEEP_CONVECTION_n ,ONLY : XPRCONV,XPRSCONV -USE MODD_REF_n -USE MODD_CONF_n -USE MODD_PARAM_n -USE MODI_SHUMAN -! -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSV ! Number of SV (father model) -INTEGER, INTENT(IN) :: KMI ! Model index -! -REAL, INTENT(IN) :: PTSTEP ! Timestep duration -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (Rho) dry * Jacobian -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM, PVM, PWM ! Variables at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM, PSVM -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS ! Source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS, PRSVS ! terms -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC,PINPRR,PINPRS,PINPRG,PINPRH & - ,PPRCONV,PPRSCONV ! precipitating variables -LOGICAL, DIMENSION(:,:), INTENT(INOUT) :: OMASKkids ! true where kids exist -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDIRFLASWD,PSCAFLASWD ! Long wave radiation -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDIRSRFSWD ! Long wave radiation -! -!* 0.2 declarations of local variables -! -! -INTEGER :: IIB,IJB,IIE,IJE -INTEGER :: IKU,IKB -INTEGER :: II1,II2,IJ1,IJ2,II1U,IJ1V,IWEST,ISOUTH,IDIST -INTEGER :: IXOR,IXEND ! horizontal position (i,j) of the ORigin and END -INTEGER :: IYOR,IYEND ! of the inner model $n domain, relative to outer model subdomain -INTEGER :: IXORU,IYORV ! particular case dure to C grid -INTEGER :: IDXRATIO,IDYRATIO ! x and y-direction resolution RATIO -INTEGER :: IXOR_ll,IYOR_ll ! origin's coordinates of extended subdomain -INTEGER :: IXDIM,IYDIM ! size of the extended dad subdomain -! -INTEGER :: JX,JY,JVAR ! loop index -INTEGER :: IRR,ISV_USER ! number of moist and scalar var commun to both models -! -REAL :: ZK2W ! Relaxation value -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZAVE_RHODJ -! -! intermediate arrays for model communication -REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZTUM, ZTVM, ZTWM, ZTTHM -REAL, DIMENSION(:, :, :, :), ALLOCATABLE :: ZTRM, ZTSVM -REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZUM, ZVM, ZWM, ZTHM -REAL, DIMENSION(:, :, :, :), ALLOCATABLE :: ZRM, ZSVM -REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZTRHODJ, ZTRHODJU, ZTRHODJV -REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZRHODJ, ZRHODJU, ZRHODJV -REAL, DIMENSION(:, :), ALLOCATABLE ::ZTINPRC,ZTINPRR,ZTINPRS,ZTINPRG,ZTINPRH,& - ZTPRCONV,ZTPRSCONV -REAL, DIMENSION(:, :,:), ALLOCATABLE :: ZTDIRFLASWD,ZTSCAFLASWD -REAL, DIMENSION(:, :,:), ALLOCATABLE :: ZTDIRSRFSWD -REAL, DIMENSION(:, :), ALLOCATABLE ::ZINPRC,ZINPRR,ZINPRS,ZINPRG,ZINPRH,& - ZPRCONV,ZPRSCONV -REAL, DIMENSION(:, :,:), ALLOCATABLE :: ZDIRFLASWD,ZSCAFLASWD -REAL, DIMENSION(:, :,:), ALLOCATABLE :: ZDIRSRFSWD -! -INTEGER :: IINFO_ll, IDIMX, IDIMY ! size of intermediate arrays -INTEGER :: IHALO ! band size where relaxation is not performed -LOGICAL :: LINTER ! flag for intersection or not with the child domain -INTEGER :: IMI ! Current model index KMI==NDAD(IMI) -! -INTEGER :: IIBC,IJBC,IIEC,IJEC -! -!------------------------------------------------------------------------------- -! -!* 1. PROLOGUE: -! -IMI = GET_CURRENT_MODEL_INDEX() -! -CALL GO_TOMODEL_ll(IMI, IINFO_ll) -CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) -! -CALL GO_TOMODEL_ll(KMI, IINFO_ll) -CALL GET_CHILD_DIM_ll(IMI, IDIMX, IDIMY, IINFO_ll) -! -! here we need to go back to SON domain for boundaries test -CALL GO_TOMODEL_ll(IMI, IINFO_ll) -! -IKU = SIZE(PTHM,3) -IKB = JPVEXT+1 -! -IDXRATIO = NDXRATIO_ALL(IMI) -IDYRATIO = NDYRATIO_ALL(IMI) -! -IRR = MIN(KRR,NRR) -ISV_USER = MIN(NSV_USER_A(KMI),NSV_USER_A(IMI)) -! -! 1.1 Allocate array of horizontal average fields -! -ALLOCATE(ZTUM(IDIMX, IDIMY, SIZE(PUM, 3))) -ALLOCATE(ZTVM(IDIMX, IDIMY, SIZE(PUM, 3))) -ALLOCATE(ZTWM(IDIMX, IDIMY, SIZE(PUM, 3))) -ALLOCATE(ZTTHM(IDIMX, IDIMY, SIZE(PUM, 3))) -IF (IRR /= 0) THEN - ALLOCATE(ZTRM(IDIMX, IDIMY, SIZE(PUM, 3),IRR)) - ELSE - ALLOCATE(ZTRM(0,0,0,0)) -ENDIF -IF (KSV /= 0) THEN - ALLOCATE(ZTSVM(IDIMX, IDIMY, SIZE(PUM, 3),KSV)) -ELSE - ALLOCATE(ZTSVM(0,0,0,0)) -ENDIF -! -IF (LUSERC .AND. ( (LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR. & - (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR.& - (NSEDC .AND. CCLOUD == 'LIMA') )) THEN - ALLOCATE(ZTINPRC(IDIMX, IDIMY)) -ELSE - ALLOCATE(ZTINPRC(0,0)) -ENDIF -IF (LUSERR) THEN - ALLOCATE(ZTINPRR(IDIMX, IDIMY)) -ELSE - ALLOCATE(ZTINPRR(0,0)) -ENDIF -IF (LUSERS) THEN - ALLOCATE(ZTINPRS(IDIMX, IDIMY)) -ELSE - ALLOCATE(ZTINPRS(0,0)) -ENDIF -IF (LUSERG) THEN - ALLOCATE(ZTINPRG(IDIMX, IDIMY)) -ELSE - ALLOCATE(ZTINPRG(0,0)) -ENDIF -IF (LUSERH) THEN - ALLOCATE(ZTINPRH(IDIMX, IDIMY)) -ELSE - ALLOCATE(ZTINPRH(0,0)) -ENDIF -IF (CDCONV /= 'NONE') THEN - ALLOCATE(ZTPRCONV (IDIMX, IDIMY)) - ALLOCATE(ZTPRSCONV(IDIMX, IDIMY)) - ELSE - ALLOCATE(ZTPRCONV (0,0)) - ALLOCATE(ZTPRSCONV(0,0)) -END IF -IF (CRAD /= 'NONE') THEN - ALLOCATE(ZTDIRFLASWD(IDIMX, IDIMY, SIZE(PDIRFLASWD,3))) - ALLOCATE(ZTSCAFLASWD(IDIMX, IDIMY, SIZE(PSCAFLASWD,3))) - ALLOCATE(ZTDIRSRFSWD(IDIMX, IDIMY, SIZE(PDIRSRFSWD,3))) -ELSE - ALLOCATE(ZTDIRFLASWD(0,0,0)) - ALLOCATE(ZTSCAFLASWD(0,0,0)) - ALLOCATE(ZTDIRSRFSWD(0,0,0)) -ENDIF -! -ALLOCATE(ZTRHODJ (IDIMX, IDIMY, SIZE(PUM, 3))) -ALLOCATE(ZTRHODJU(IDIMX, IDIMY, SIZE(PUM, 3))) -ALLOCATE(ZTRHODJV(IDIMX, IDIMY, SIZE(PUM, 3))) -! -! -ZK2W = 1. / (PTSTEP * NDT_2_WAY(NDAD(IMI))) -! -!------------------------------------------------------------------------------- -! -!* 2. AVERAGE OF SCALAR VARIABLES -! --------------------------- -! -IIBC=JPHEXT+2 -IIEC=IDIMX-JPHEXT-1 -IJBC=JPHEXT+2 -IJEC=IDIMY-JPHEXT-1 -! -!* 2.1 summation of rhodj -! -ZTRHODJ(:,:,:) = 0. -DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTRHODJ(IIBC:IIEC,IJBC:IJEC,:) = ZTRHODJ(IIBC:IIEC,IJBC:IJEC,:) & - +XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:) - END DO -END DO -! -!* 2.2 temperature -! -ZTTHM(:,:,:) = 0. -DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTTHM(IIBC:IIEC,IJBC:IJEC,:) = ZTTHM(IIBC:IIEC,IJBC:IJEC,:) & - +XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:) & - *XTHT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:) -! - END DO -END DO -! -! -!* 2.5 moist variables -! -DO JVAR=1,IRR - ZTRM(:,:,:,JVAR) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTRM(IIBC:IIEC,IJBC:IJEC,:,JVAR) = ZTRM(IIBC:IIEC,IJBC:IJEC,:,JVAR) & - +XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:) & - *XRT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR) - END DO - END DO -END DO -! -!* 2.6 scalar variables SV -! -! User scalar variables -IF (KSV /= 0) THEN - DO JVAR=1,ISV_USER - ZTSVM(:,:,:,JVAR) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR) = ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR) & - +XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:) & - *XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR) - END DO - END DO - END DO -! C2R2 scalar variables -IF (NSV_C2R2_A(IMI) > 0) THEN - ! nested model uses C2R2 microphysical scheme - DO JVAR=1,NSV_C2R2_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_C2R2BEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_C2R2BEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_C2R2BEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_C2R2BEG_A(IMI)) - END DO - END DO - END DO -END IF -! C1R3 scalar variables -IF (NSV_C1R3_A(IMI) > 0) THEN - ! nested model uses C1R3 microphysical scheme - DO JVAR=1,NSV_C1R3_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_C1R3BEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_C1R3BEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_C1R3BEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_C1R3BEG_A(IMI)) - END DO - END DO - END DO -END IF -! LIMA scalar variables -IF (NSV_LIMA_A(IMI) > 0) THEN - ! nested model uses LIMA microphysical scheme - DO JVAR=1,NSV_LIMA_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_LIMA_BEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_LIMA_BEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_LIMA_BEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_LIMA_BEG_A(IMI)) - END DO - END DO - END DO -END IF -! Electrical scalar variables -IF (NSV_ELEC_A(IMI) > 0) THEN - ! nested model uses electrical scheme - DO JVAR=1,NSV_ELEC_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_ELECBEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_ELECBEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_ELECBEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_ELECBEG_A(IMI)) - END DO - END DO - END DO -END IF -! Chemical scalar variables -DO JVAR=1,NSV_CHEM_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_CHEMBEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_CHEMBEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_CHEMBEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_CHEMBEG_A(IMI)) - END DO - END DO -END DO -! Ice phase chemical scalar variables -IF (NSV_CHIC_A(IMI) > 0) THEN - ! nested model uses aqueous chemistry and ice3/4 scheme - DO JVAR=1,NSV_CHIC_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_CHICBEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_CHICBEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_CHICBEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_CHICBEG_A(IMI)) - END DO - END DO - END DO -END IF -! NOX variables -DO JVAR=1,NSV_LNOX_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_LNOXBEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_LNOXBEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_LNOXBEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_LNOXBEG_A(IMI)) - END DO - END DO -END DO -! Orilam scalar variables -DO JVAR=1,NSV_AER_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_AERBEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_AERBEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_AERBEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_AERBEG_A(IMI)) - END DO - END DO -END DO -DO JVAR=1,NSV_AERDEP_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_AERDEPBEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_AERDEPBEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_AERDEPBEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_AERDEPBEG_A(IMI)) - END DO - END DO -END DO -! Dust scalar variables -DO JVAR=1,NSV_DST_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_DSTBEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_DSTBEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_DSTBEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_DSTBEG_A(IMI)) - END DO - END DO -END DO -DO JVAR=1,NSV_DSTDEP_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_DSTDEPBEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_DSTDEPBEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_DSTDEPBEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_DSTDEPBEG_A(IMI)) - END DO - END DO -END DO -! Salt scalar variables -DO JVAR=1,NSV_SLT_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_SLTBEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_SLTBEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_SLTBEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_SLTBEG_A(IMI)) - END DO - END DO -END DO -DO JVAR=1,NSV_SLTDEP_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_SLTDEPBEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_SLTDEPBEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_SLTDEPBEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_SLTDEPBEG_A(IMI)) - END DO - END DO -END DO -! lagrangian variables -DO JVAR=1,NSV_LG_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_LGBEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_LGBEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_LGBEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_LGBEG_A(IMI)) - END DO - END DO -END DO -END IF -! Passive scalar variables -IF (NSV_PP_A(IMI) > 0) THEN -DO JVAR=1,NSV_PP_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_PPBEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_PPBEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_PPBEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_PPBEG_A(IMI)) - END DO - END DO -END DO -END IF -#ifdef MNH_FOREFIRE -! ForeFire variables -IF (NSV_FF_A(IMI) > 0) THEN -DO JVAR=1,NSV_FF_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_FFBEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_FFBEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_FFBEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_FFBEG_A(IMI)) - END DO - END DO -END DO -END IF -#endif -! Conditional sampling variables -IF (NSV_CS_A(IMI) > 0) THEN -DO JVAR=1,NSV_CS_A(KMI) - ZTSVM(:,:,:,JVAR-1+NSV_CSBEG_A(KMI)) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_CSBEG_A(KMI)) = & - &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_CSBEG_A(KMI))+& - &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*& - &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_CSBEG_A(IMI)) - END DO - END DO -END DO -END IF -! Precipitating variables - IF (LUSERR) THEN - ZTINPRR(:,:) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTINPRR(IIBC:IIEC,IJBC:IJEC) = ZTINPRR(IIBC:IIEC,IJBC:IJEC) & - +XINPRR(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO) - END DO - END DO - ZTINPRR(IIBC:IIEC,IJBC:IJEC)=ZTINPRR(IIBC:IIEC,IJBC:IJEC)/(IDXRATIO*IDYRATIO) - END IF -! - IF (LUSERC .AND. ((LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR. & - (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR.& - (NSEDC .AND. CCLOUD == 'LIMA') )) THEN - ZTINPRC(:,:) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTINPRC(IIBC:IIEC,IJBC:IJEC) = ZTINPRC(IIBC:IIEC,IJBC:IJEC) & - +XINPRC(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO) - END DO - END DO - ZTINPRC(IIBC:IIEC,IJBC:IJEC)=ZTINPRC(IIBC:IIEC,IJBC:IJEC)/(IDXRATIO*IDYRATIO) - END IF -! - IF (LUSERS) THEN - ZTINPRS(:,:) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTINPRS(IIBC:IIEC,IJBC:IJEC) = ZTINPRS(IIBC:IIEC,IJBC:IJEC) & - +XINPRS(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO) - END DO - END DO - ZTINPRS(IIBC:IIEC,IJBC:IJEC) = ZTINPRS(IIBC:IIEC,IJBC:IJEC)/(IDXRATIO*IDYRATIO) - END IF -! - IF (LUSERG) THEN - ZTINPRG(:,:) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTINPRG(IIBC:IIEC,IJBC:IJEC) = ZTINPRG(IIBC:IIEC,IJBC:IJEC) & - +XINPRG(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO) - END DO - END DO - ZTINPRG(IIBC:IIEC,IJBC:IJEC) =ZTINPRG(IIBC:IIEC,IJBC:IJEC)/(IDXRATIO*IDYRATIO) - END IF -! - IF (LUSERH) THEN - ZTINPRH(:,:) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTINPRH(IIBC:IIEC,IJBC:IJEC) = ZTINPRH(IIBC:IIEC,IJBC:IJEC) & - +XINPRH(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO) - END DO - END DO - ZTINPRH(IIBC:IIEC,IJBC:IJEC) =ZTINPRH(IIBC:IIEC,IJBC:IJEC)/(IDXRATIO*IDYRATIO) - END IF -! - IF (CDCONV /= 'NONE') THEN - ZTPRCONV(:,:) = 0. - ZTPRSCONV(:,:) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTPRCONV(IIBC:IIEC,IJBC:IJEC) = ZTPRCONV(IIBC:IIEC,IJBC:IJEC) & - +XPRCONV(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO) - ZTPRSCONV(IIBC:IIEC,IJBC:IJEC) = ZTPRSCONV(IIBC:IIEC,IJBC:IJEC) & - +XPRSCONV(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO) - END DO - END DO - ZTPRCONV(IIBC:IIEC,IJBC:IJEC) = ZTPRCONV(IIBC:IIEC,IJBC:IJEC)/(IDXRATIO*IDYRATIO) - ZTPRSCONV(IIBC:IIEC,IJBC:IJEC) = ZTPRSCONV(IIBC:IIEC,IJBC:IJEC)/(IDXRATIO*IDYRATIO) - END IF -! Short Wave and Long Wave variables - IF (CRAD /= 'NONE') THEN - ZTDIRFLASWD(:,:,:) = 0. - ZTSCAFLASWD(:,:,:) = 0. - ZTDIRSRFSWD(:,:,:) = 0. - DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTDIRFLASWD(IIBC:IIEC,IJBC:IJEC,:) = ZTDIRFLASWD(IIBC:IIEC,IJBC:IJEC,:)& - +XDIRFLASWD(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:) - ZTSCAFLASWD(IIBC:IIEC,IJBC:IJEC,:) = ZTSCAFLASWD(IIBC:IIEC,IJBC:IJEC,:)& - +XSCAFLASWD(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:) - ZTDIRSRFSWD(IIBC:IIEC,IJBC:IJEC,:) = ZTDIRSRFSWD(IIBC:IIEC,IJBC:IJEC,:)& - +XDIRSRFSWD(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:) - END DO - END DO - ZTDIRFLASWD(IIBC:IIEC,IJBC:IJEC,:) = ZTDIRFLASWD(IIBC:IIEC,IJBC:IJEC,:)/(IDXRATIO*IDYRATIO) - ZTSCAFLASWD(IIBC:IIEC,IJBC:IJEC,:) = ZTSCAFLASWD(IIBC:IIEC,IJBC:IJEC,:)/(IDXRATIO*IDYRATIO) - ZTDIRSRFSWD(IIBC:IIEC,IJBC:IJEC,:) = ZTDIRSRFSWD(IIBC:IIEC,IJBC:IJEC,:)/(IDXRATIO*IDYRATIO) - END IF -! -!------------------------------------------------------------------------------- -! -!* 3. AVERAGE OF WIND VARIABLES -! ------------------------- -! -!* 3.1 vertical wind W -! -ZTWM(:,:,:) = 0. -DO JX=1,IDXRATIO - DO JY=1,IDYRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTWM(IIBC:IIEC,IJBC:IJEC,IKB) = ZTWM(IIBC:IIEC,IJBC:IJEC,IKB) & - +2.*XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,IKB) & - *XWT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,IKB) -! - ZTWM(IIBC:IIEC,IJBC:IJEC,IKB+1:IKU) = ZTWM(IIBC:IIEC,IJBC:IJEC,IKB+1:IKU) & - +(XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,IKB+1:IKU ) & - + XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,IKB :IKU-1))& - *XWT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,IKB+1:IKU) - END DO -END DO -! -!* 3.2 horizontal wind U -! -ZTRHODJU(:,:,:) = 0. -! -IF(LWEST_ll()) THEN - II1U = IIB+IDXRATIO !C grid - IWEST=JPHEXT+3 -ELSE - II1U = IIB - IWEST=JPHEXT+2 -ENDIF -! -II2 = IIE+1-IDXRATIO -! -DO JY=1,IDYRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTRHODJU(IWEST:IIEC,IJBC:IJEC,:) = ZTRHODJU(IWEST:IIEC,IJBC:IJEC,:) & - +XRHODJ(II1U :II2 :IDXRATIO,IJ1:IJ2:IDYRATIO,:) & - +XRHODJ(II1U-1:II2-1:IDXRATIO,IJ1:IJ2:IDYRATIO,:) -END DO -! -! -ZTUM(:,:,:) = 0. -DO JY=1,IDYRATIO - IJ1 = IJB+JY-1 - IJ2 = IJE+JY-IDYRATIO - ZTUM(IWEST:IIEC,IJBC:IJEC,:) = ZTUM(IWEST:IIEC,IJBC:IJEC,:) & - +(XRHODJ(II1U :II2 :IDXRATIO,IJ1:IJ2:IDYRATIO,:) & - +XRHODJ(II1U-1:II2-1:IDXRATIO,IJ1:IJ2:IDYRATIO,:)) & - *XUT(II1U :II2 :IDXRATIO,IJ1:IJ2:IDYRATIO,:) -END DO -! -! -!* 3.3 horizontal wind V -! -ZTRHODJV(:,:,:) = 0. -! -IF(LSOUTH_ll() .AND. .NOT. L2D) THEN - IJ1V = IJB+IDYRATIO !C grid - ISOUTH=JPHEXT+3 -ELSE - IJ1V = IJB - ISOUTH=JPHEXT+2 -ENDIF -! -IJ2 = IJE+1-IDYRATIO -! -DO JX=1,IDXRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - ZTRHODJV(IIBC:IIEC,ISOUTH:IJEC,:) = ZTRHODJV(IIBC:IIEC,ISOUTH:IJEC,:) & - +XRHODJ(II1:II2:IDXRATIO,IJ1V :IJ2 :IDYRATIO,:) & - +XRHODJ(II1:II2:IDXRATIO,IJ1V-1:IJ2-1:IDYRATIO,:) -END DO -! -! -ZTVM(:,:,:) = 0. -DO JX=1,IDXRATIO - II1 = IIB+JX-1 - II2 = IIE+JX-IDXRATIO - ZTVM(IIBC:IIEC,ISOUTH:IJEC,:) = ZTVM(IIBC:IIEC,ISOUTH:IJEC,:) & - +(XRHODJ(II1:II2:IDXRATIO,IJ1V :IJ2 :IDYRATIO,:) & - + XRHODJ(II1:II2:IDXRATIO,IJ1V-1:IJ2-1:IDYRATIO,:)) & - *XVT(II1:II2:IDXRATIO,IJ1V :IJ2 :IDYRATIO,:) -END DO -! -! -!* 4. EXCHANGE OF DATA -! ---------------- -! -! -CALL GO_TOMODEL_ll(IMI, IINFO_ll) -CALL GET_FEEDBACK_COORD_ll(IXOR,IYOR,IXEND,IYEND,IINFO_ll) ! physical domain's origine -! -! -IF (IINFO_ll == 0) THEN - LINTER=.TRUE. -ELSE - LINTER=.FALSE. -ENDIF -! -! Allocate array which will receive average child fields -! -IF (LINTER) THEN - ALLOCATE(ZUM(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3))) - ALLOCATE(ZVM(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3))) - ALLOCATE(ZWM(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3))) - ALLOCATE(ZTHM(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3))) - ALLOCATE(ZRHODJ (IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3))) - ALLOCATE(ZRHODJU(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3))) - ALLOCATE(ZRHODJV(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3))) - IF (IRR /= 0) THEN - ALLOCATE(ZRM(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3),IRR)) - END IF - IF (KSV /= 0) THEN - ALLOCATE(ZSVM(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3),KSV)) - ENDIF - IF (LUSERR) THEN - ALLOCATE(ZINPRR(IXOR:IXEND,IYOR:IYEND)) - ELSE - ALLOCATE(ZINPRR(0,0)) - END IF - IF (LUSERC .AND. ((LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR. & - (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR.& - (NSEDC .AND. CCLOUD == 'LIMA') )) THEN - ALLOCATE(ZINPRC(IXOR:IXEND,IYOR:IYEND)) - ELSE - ALLOCATE(ZINPRC(0,0)) - END IF - IF (LUSERS) THEN - ALLOCATE(ZINPRS(IXOR:IXEND,IYOR:IYEND)) - ELSE - ALLOCATE(ZINPRS(0,0)) - END IF - IF (LUSERG) THEN - ALLOCATE(ZINPRG(IXOR:IXEND,IYOR:IYEND)) - ELSE - ALLOCATE(ZINPRG(0,0)) - END IF - IF (LUSERH) THEN - ALLOCATE(ZINPRH(IXOR:IXEND,IYOR:IYEND)) - ELSE - ALLOCATE(ZINPRH(0,0)) - END IF - IF (CDCONV /= 'NONE') THEN - ALLOCATE(ZPRCONV(IXOR:IXEND,IYOR:IYEND)) - ALLOCATE(ZPRSCONV(IXOR:IXEND,IYOR:IYEND)) - ELSE - ALLOCATE(ZPRCONV(0,0)) - ALLOCATE(ZPRSCONV(0,0)) - END IF - IF (CRAD /= 'NONE') THEN - ALLOCATE(ZDIRFLASWD(IXOR:IXEND,IYOR:IYEND, SIZE(PDIRFLASWD, 3))) - ALLOCATE(ZSCAFLASWD(IXOR:IXEND,IYOR:IYEND, SIZE(PSCAFLASWD, 3))) - ALLOCATE(ZDIRSRFSWD(IXOR:IXEND,IYOR:IYEND, SIZE(PDIRSRFSWD, 3))) - ELSE - !3rd dimension size can also be allocated with a zero size - ALLOCATE( ZDIRFLASWD(0, 0, SIZE( PDIRFLASWD, 3 )) ) - ALLOCATE( ZSCAFLASWD(0, 0, SIZE( PSCAFLASWD, 3 )) ) - ALLOCATE( ZDIRSRFSWD(0, 0, SIZE( PDIRSRFSWD, 3 )) ) - ENDIF -ELSE - ALLOCATE(ZUM(0,0,0)) - ALLOCATE(ZVM(0,0,0)) - ALLOCATE(ZWM(0,0,0)) - ALLOCATE(ZTHM(0,0,0)) - IF (IRR /= 0) ALLOCATE(ZRM(0,0,0,IRR)) - IF (KSV /= 0) ALLOCATE(ZSVM(0,0,0,KSV)) - ALLOCATE(ZRHODJ (0,0,0)) - ALLOCATE(ZRHODJU(0,0,0)) - ALLOCATE(ZRHODJV(0,0,0)) - ALLOCATE(ZINPRC(0,0)) - ALLOCATE(ZINPRR(0,0)) - ALLOCATE(ZINPRS(0,0)) - ALLOCATE(ZINPRG(0,0)) - ALLOCATE(ZINPRH(0,0)) - ALLOCATE(ZPRCONV(0,0)) - ALLOCATE(ZPRSCONV(0,0)) - !3rd dimension of ZDIRFLASWD, ZSCAFLASWD and ZDIRSRFSWD is allocated with a not necessarily zero size - !because it needs to be to this size for the SET_LSFIELD_2WAY_ll loops if CRAD/='NONE' - ALLOCATE( ZDIRFLASWD(0, 0, SIZE( PDIRFLASWD, 3 )) ) - ALLOCATE( ZSCAFLASWD(0, 0, SIZE( PSCAFLASWD, 3 )) ) - ALLOCATE( ZDIRSRFSWD(0, 0, SIZE( PDIRSRFSWD, 3 )) ) -ENDIF -! -! Initialize the list for the forcing -! -CALL SET_LSFIELD_2WAY_ll(ZUM, ZTUM) -CALL SET_LSFIELD_2WAY_ll(ZVM, ZTVM) -CALL SET_LSFIELD_2WAY_ll(ZWM, ZTWM) -CALL SET_LSFIELD_2WAY_ll(ZTHM, ZTTHM) -DO JVAR=1,IRR - CALL SET_LSFIELD_2WAY_ll(ZRM(:,:,:,JVAR), ZTRM(:,:,:,JVAR)) -ENDDO -DO JVAR=1,KSV - CALL SET_LSFIELD_2WAY_ll(ZSVM(:,:,:,JVAR), ZTSVM(:,:,:,JVAR)) -ENDDO -IF (LUSERR) THEN - CALL SET_LSFIELD_2WAY_ll(ZINPRR , ZTINPRR) -END IF -! -IF (LUSERC .AND. ((LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR. & - (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR.& - (NSEDC .AND. CCLOUD == 'LIMA') )) THEN - CALL SET_LSFIELD_2WAY_ll(ZINPRC , ZTINPRC) -END IF -IF (LUSERS) THEN - CALL SET_LSFIELD_2WAY_ll(ZINPRS , ZTINPRS) -END IF -IF (LUSERG) THEN - CALL SET_LSFIELD_2WAY_ll(ZINPRG , ZTINPRG) -END IF -IF (LUSERH) THEN - CALL SET_LSFIELD_2WAY_ll(ZINPRH , ZTINPRH) -END IF -IF (CDCONV /= 'NONE') THEN - CALL SET_LSFIELD_2WAY_ll(ZPRCONV , ZTPRCONV) - CALL SET_LSFIELD_2WAY_ll(ZPRSCONV , ZTPRSCONV) -END IF -IF (CRAD /= 'NONE') THEN - DO JVAR = 1, SIZE( PDIRFLASWD, 3 ) - CALL SET_LSFIELD_2WAY_ll(ZDIRFLASWD(:,:,JVAR) , ZTDIRFLASWD(:,:,JVAR)) - END DO - DO JVAR = 1, SIZE( PSCAFLASWD, 3 ) - CALL SET_LSFIELD_2WAY_ll(ZSCAFLASWD(:,:,JVAR) , ZTSCAFLASWD(:,:,JVAR)) - END DO - DO JVAR = 1, SIZE( PDIRSRFSWD, 3 ) - CALL SET_LSFIELD_2WAY_ll(ZDIRSRFSWD(:,:,JVAR) , ZTDIRSRFSWD(:,:,JVAR)) - END DO -END IF -CALL SET_LSFIELD_2WAY_ll(ZRHODJ, ZTRHODJ) -CALL SET_LSFIELD_2WAY_ll(ZRHODJU, ZTRHODJU) -CALL SET_LSFIELD_2WAY_ll(ZRHODJV, ZTRHODJV) -! -CALL LS_FEEDBACK_ll(IINFO_ll) -CALL GO_TOMODEL_ll(KMI, IINFO_ll) -CALL UNSET_LSFIELD_2WAY_ll(IMI) -! -DEALLOCATE(ZTUM,ZTVM,ZTWM,ZTTHM,ZTRHODJ,ZTRHODJU,ZTRHODJV) -DEALLOCATE(ZTRM,ZTSVM) -DEALLOCATE(ZTINPRC,ZTINPRR,ZTINPRS,ZTINPRG,ZTINPRH,ZTPRCONV,ZTPRSCONV) -DEALLOCATE(ZTDIRFLASWD,ZTSCAFLASWD,ZTDIRSRFSWD) -! -IF (.NOT. LINTER) THEN ! no computation for the dad subdomain - DEALLOCATE(ZUM,ZVM,ZWM,ZTHM,ZRHODJ,ZRHODJU,ZRHODJV) - IF (IRR /= 0) DEALLOCATE(ZRM) - IF (KSV /= 0) DEALLOCATE(ZSVM) - DEALLOCATE(ZINPRC,ZINPRR,ZINPRS,ZINPRG,ZINPRH,ZPRCONV,ZPRSCONV) - DEALLOCATE(ZDIRFLASWD,ZSCAFLASWD,ZDIRSRFSWD) -RETURN -ENDIF -! -! -! 5. RELAXATION -! ----------- -! 5.1 Compute the bounds of relaxation area -! -IHALO=2 -!!$IF (JPHEXT/=1) STOP ! boundaries are hard coded supposing JPHEXT=1 -! -CALL GET_OR_ll('B',IXOR_ll,IYOR_ll) -CALL GET_DIM_EXT_ll('B',IXDIM,IYDIM) -! -IF(LWEST_ll()) THEN - IDIST=IXOR_ll+1-(NXOR_ALL(IMI)+1) ! comparison of first physical - ! points of subdomain and current processor -ELSE - IDIST=IXOR_ll+NHALO-(NXOR_ALL(IMI)+1)! comparison of first physical - ! points of subdomain and current processor -ENDIF -! -IF(IDIST<=0) THEN ! west side of the child domain - IXOR=IXOR+IHALO -ENDIF -! -IF(IDIST>=1 .AND. IDIST<=IHALO-1) THEN - IXOR=IXOR+IHALO-IDIST -ENDIF -! -! C grid for v component -IF(IDIST >=IHALO+1) IXORU=IXOR ! interior child domain -IF(IDIST>=1 .AND. IDIST<=IHALO) IXORU=IXOR+1 ! partial overlapping of the relaxation area -IF(IDIST<=0) IXORU=IXOR+1 -! -IF(LEAST_ll()) THEN - IDIST=(NXEND_ALL(IMI)-1)-(IXOR_ll-1+IXDIM-1) ! comparison of last physical - ! points of subdomain and current processor -ELSE - IDIST=(NXEND_ALL(IMI)-1)-(IXOR_ll-1+IXDIM-NHALO)! comparison of last physical - ! points of subdomain and current processor -ENDIF -! -IF(IDIST<=0) IXEND=IXEND-IHALO ! east side of the child domain -IF(IDIST>=1 .AND. IDIST<=IHALO-1) IXEND=IXEND-IHALO+IDIST -! -! -IF(.NOT.L2D) THEN - IF(LSOUTH_ll()) THEN - IDIST=IYOR_ll+1-(NYOR_ALL(IMI)+1)! comparison of first physical - ! points of subdomain and current processor - ELSE - IDIST=IYOR_ll+NHALO-(NYOR_ALL(IMI)+1)! comparison of first physical - ! points of subdomain and current processor - ENDIF -! - IF(IDIST<=0) THEN ! south side of the child domain - IYOR=IYOR+IHALO - ENDIF -! - IF(IDIST>=1 .AND. IDIST<=IHALO-1) THEN - IYOR=IYOR+IHALO-IDIST - ENDIF -! -! C grid for v component - IF(IDIST >=IHALO+1) IYORV=IYOR ! interior child domain - IF(IDIST>=1 .AND. IDIST<=IHALO) IYORV=IYOR+1 ! partial overlapping of the relaxation area - IF(IDIST<=0) IYORV=IYOR+1 -! -! -! - IF(LNORTH_ll()) THEN - IDIST=(NYEND_ALL(IMI)-1)-(IYOR_ll-1+IYDIM-1)! comparison of last physical - ! points of subdomain and current processor - ELSE - IDIST=(NYEND_ALL(IMI)-1)-(IYOR_ll-1+IYDIM-NHALO)! comparison of last physical - ! points of subdomain and current processor - ENDIF - IF(IDIST<=0) IYEND=IYEND-IHALO ! north side of the child domain - IF(IDIST>=1 .AND. IDIST<=IHALO-1) IYEND=IYEND-IHALO+IDIST -! -ELSE - IYORV=IYOR+1 ! no parallelized -ENDIF - -! at this point, IXOR:IXEND,IYOR:IYEND define the 2way area outside -! the relaxation area - IF (LUSERR) THEN - PINPRR(IXOR:IXEND,IYOR:IYEND)=ZINPRR(IXOR:IXEND,IYOR:IYEND) - ENDIF - IF (LUSERC .AND. ((LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR. & - (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR.& - (NSEDC .AND. CCLOUD == 'LIMA') )) THEN - PINPRC(IXOR:IXEND,IYOR:IYEND)=ZINPRC(IXOR:IXEND,IYOR:IYEND) - ENDIF - IF (LUSERS) THEN - PINPRS(IXOR:IXEND,IYOR:IYEND)=ZINPRS(IXOR:IXEND,IYOR:IYEND) - ENDIF - IF (LUSERG) THEN - PINPRG(IXOR:IXEND,IYOR:IYEND)=ZINPRG(IXOR:IXEND,IYOR:IYEND) - ENDIF - IF (LUSERH) THEN - PINPRH(IXOR:IXEND,IYOR:IYEND)=ZINPRH(IXOR:IXEND,IYOR:IYEND) - ENDIF - IF (CDCONV /= 'NONE') THEN - PPRCONV(IXOR:IXEND,IYOR:IYEND)=ZPRCONV(IXOR:IXEND,IYOR:IYEND) - PPRSCONV(IXOR:IXEND,IYOR:IYEND)=ZPRSCONV(IXOR:IXEND,IYOR:IYEND) - END IF - IF (CRAD /= 'NONE') THEN - PDIRFLASWD(IXOR:IXEND,IYOR:IYEND,:)=ZDIRFLASWD(IXOR:IXEND,IYOR:IYEND,:) - PSCAFLASWD(IXOR:IXEND,IYOR:IYEND,:)=ZSCAFLASWD(IXOR:IXEND,IYOR:IYEND,:) - PDIRSRFSWD(IXOR:IXEND,IYOR:IYEND,:)=ZDIRSRFSWD(IXOR:IXEND,IYOR:IYEND,:) - ENDIF - DEALLOCATE(ZINPRC,ZINPRR,ZINPRS,ZINPRG,ZINPRH,ZPRCONV,ZPRSCONV) - DEALLOCATE(ZDIRFLASWD,ZSCAFLASWD,ZDIRSRFSWD) -! -!* initialize the OMASKkids array -! -OMASKkids(IXOR:IXEND,IYOR:IYEND)=.TRUE. -! -! -! 5.2 relaxation computation -! -PRTHS(IXOR:IXEND,IYOR:IYEND,:) = PRTHS(IXOR:IXEND,IYOR:IYEND,:) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * ( PTHM(IXOR:IXEND,IYOR:IYEND,:) & - -ZTHM(IXOR:IXEND,IYOR:IYEND,:)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -! -DO JVAR=1,IRR - PRRS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRRS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PRM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZRM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -! -! User scalar variables -DO JVAR=1,ISV_USER - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -! C2R2 scalar variables -DO JVAR=NSV_C2R2BEG_A(KMI),NSV_C2R2END_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -! C1R3 scalar variables -DO JVAR=NSV_C1R3BEG_A(KMI),NSV_C1R3END_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -! LIMA scalar variables -DO JVAR=NSV_LIMA_BEG_A(KMI),NSV_LIMA_END_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -! Electrical scalar variables -DO JVAR=NSV_ELECBEG_A(KMI),NSV_ELECEND_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -! Chemical scalar variables -DO JVAR=NSV_CHEMBEG_A(KMI),NSV_CHEMEND_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -! Ice phase chemical scalar variables -DO JVAR=NSV_CHICBEG_A(KMI),NSV_CHICEND_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -! NOX variables -DO JVAR=NSV_LNOXBEG_A(KMI),NSV_LNOXEND_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -! Orilam scalar variables -DO JVAR=NSV_AERBEG_A(KMI),NSV_AEREND_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -DO JVAR=NSV_AERDEPBEG_A(KMI),NSV_AERDEPEND_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -! Dust scalar variables -DO JVAR=NSV_DSTBEG_A(KMI),NSV_DSTEND_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -DO JVAR=NSV_DSTDEPBEG_A(KMI),NSV_DSTDEPEND_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -! Salt scalar variables -DO JVAR=NSV_SLTBEG_A(KMI),NSV_SLTEND_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -DO JVAR=NSV_SLTDEPBEG_A(KMI),NSV_SLTDEPEND_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -! Lagrangian scalar variables -DO JVAR=NSV_LGBEG_A(KMI),NSV_LGEND_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -! Passive pollutant variables -DO JVAR=NSV_PPBEG_A(KMI),NSV_PPEND_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -#ifdef MNH_FOREFIRE - -! ForeFire variables -DO JVAR=NSV_FFBEG_A(KMI),NSV_FFEND_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -#endif -! Conditional sampling variables -DO JVAR=NSV_CSBEG_A(KMI),NSV_CSEND_A(KMI) - PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) & - -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -ENDDO -! -ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB) = 2.*ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB) -ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB+1:IKU) = ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB+1:IKU) & - +ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB:IKU-1) -! -ZAVE_RHODJ=MZM(PRHODJ) -PRWS(IXOR:IXEND,IYOR:IYEND,:) = PRWS(IXOR:IXEND,IYOR:IYEND,:) & - - ZK2W * ZAVE_RHODJ(IXOR:IXEND,IYOR:IYEND,:) * ( PWM(IXOR:IXEND,IYOR:IYEND,:) & - -ZWM(IXOR:IXEND,IYOR:IYEND,:)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) ) -! -ZAVE_RHODJ=MXM(PRHODJ) -PRUS(IXORU:IXEND,IYOR:IYEND,:) = PRUS(IXORU:IXEND,IYOR:IYEND,:) & - - ZK2W * ZAVE_RHODJ(IXORU:IXEND,IYOR:IYEND,:) * ( PUM(IXORU:IXEND,IYOR:IYEND,:) & - -ZUM(IXORU:IXEND,IYOR:IYEND,:)/ZRHODJU(IXORU:IXEND,IYOR:IYEND,:) ) -! -ZAVE_RHODJ=MYM(PRHODJ) -PRVS(IXOR:IXEND,IYORV:IYEND,:) = PRVS(IXOR:IXEND,IYORV:IYEND,:) & - - ZK2W * ZAVE_RHODJ(IXOR:IXEND,IYORV:IYEND,:) * ( PVM(IXOR:IXEND,IYORV:IYEND,:) & - -ZVM(IXOR:IXEND,IYORV:IYEND,:)/ZRHODJV(IXOR:IXEND,IYORV:IYEND,:) ) -! -DEALLOCATE(ZUM,ZVM,ZWM,ZTHM,ZRHODJ,ZRHODJU,ZRHODJV) -IF (IRR /= 0) DEALLOCATE(ZRM) -IF (KSV /= 0) DEALLOCATE(ZSVM) -!------------------------------------------------------------------------------ -! -END SUBROUTINE TWO_WAY_n diff --git a/src/PHYEX/ext/update_nsv.f90 b/src/PHYEX/ext/update_nsv.f90 deleted file mode 100644 index f54a72169..000000000 --- a/src/PHYEX/ext/update_nsv.f90 +++ /dev/null @@ -1,187 +0,0 @@ -!MNH_LIC Copyright 2001-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ######spl - MODULE MODI_UPDATE_NSV -! ###################### -! -INTERFACE - SUBROUTINE UPDATE_NSV(KMI) - INTEGER, INTENT(IN) :: KMI ! Model index - END SUBROUTINE UPDATE_NSV -! -END INTERFACE -END MODULE MODI_UPDATE_NSV -! ######spl - SUBROUTINE UPDATE_NSV(KMI) -! ########################## - -!!**** *UPDATE_NSV* - routine that updates the NSV_* variables for the -!! current model. It is intended to be called from -!! any MesoNH routine WITH or WITHOUT $n before using -!! the NSV_* variables. -!! Modify (Escobar ) 2/2014 : add Forefire var -!! Modify (Vie) 2016 : add LIMA -!! V. Vionnet 7/2017 : add blowing snow var -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 26/11/2021: add TSVLIST and TSVLIST_A to store the metadata of all the scalar variables -! P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables -! P. Wautelet 20/02/2023: manage CSV(_A) + bugfix: reallocate size was wrong in some scenarii -!------------------------------------------------------------------------------- -! -USE MODD_CONF, ONLY: NVERB -USE MODD_FIELD, ONLY: tfieldmetadata -USE MODD_NSV -USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX, NMNHNAMELGTMAX - -USE MODE_LIMA_UPDATE_NSV, ONLY: LIMA_UPDATE_NSV -use mode_msg - -IMPLICIT NONE - -INTEGER, INTENT(IN) :: KMI ! Model index - -CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVNAMES_TMP -CHARACTER(LEN=6), DIMENSION(:,:), ALLOCATABLE :: YSV_TMP -CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVCHEM_LIST_TMP -INTEGER :: JI, JJ -INTEGER :: ISV -TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE :: YSVLIST_TMP -! -! STOP if INI_NSV has not be called yet -IF ( .NOT. LINI_NSV(KMI) ) THEN - call Print_msg( NVERB_FATAL, 'GEN', 'UPDATE_NSV', 'can not continue because INI_NSV was not called' ) -END IF -! -! Update the NSV_* variables from original NSV_*_A arrays -! that have been initialized in ini_nsv.f90 for model KMI -! - -! Allocate/reallocate CSV_CHEM_LIST_A -IF ( .NOT. ALLOCATED( TNSV%CSV_CHEM_LIST_A ) ) THEN - ALLOCATE( TNSV%CSV_CHEM_LIST_A( NSV_CHEM_LIST_A(KMI), KMI) ) - CSV_CHEM_LIST_A => TNSV%CSV_CHEM_LIST_A -ENDIF -!If CSV_CHEM_LIST_A is too small, enlarge it and transfer data -IF ( SIZE( CSV_CHEM_LIST_A, 1 ) < NSV_CHEM_LIST_A(KMI) .OR. SIZE( CSV_CHEM_LIST_A, 2 ) < KMI ) THEN - ALLOCATE( YSVCHEM_LIST_TMP( MAX( SIZE(CSV_CHEM_LIST_A,1), NSV_CHEM_LIST_A(KMI) ), MAX( SIZE(CSV_CHEM_LIST_A,2), KMI ) ) ) - DO JJ = 1, SIZE( CSV_CHEM_LIST_A, 2 ) - DO JI = 1, SIZE( CSV_CHEM_LIST_A, 1 ) - YSVCHEM_LIST_TMP(JI, JJ) = CSV_CHEM_LIST_A(JI, JJ) - END DO - END DO - CALL MOVE_ALLOC( FROM = YSVCHEM_LIST_TMP, TO = TNSV%CSV_CHEM_LIST_A ) - CSV_CHEM_LIST_A => TNSV%CSV_CHEM_LIST_A -END IF - -CSV_CHEM_LIST => CSV_CHEM_LIST_A(:,KMI) - -! Allocate/reallocate CSV_A -IF ( .NOT. ALLOCATED( TNSV%CSV_A ) ) THEN - ALLOCATE( TNSV%CSV_A( NSV_A(KMI), KMI) ) - CSV_A => TNSV%CSV_A -ENDIF -!If CSV_A is too small, enlarge it and transfer data -IF ( SIZE( CSV_A, 1 ) < NSV_A(KMI) .OR. SIZE( CSV_A, 2 ) < KMI ) THEN - ALLOCATE( YSV_TMP( MAX( SIZE(CSV_A,1), NSV_A(KMI) ), MAX( SIZE(CSV_A,2), KMI ) ) ) - DO JJ = 1, SIZE( CSV_A, 2 ) - DO JI = 1, SIZE( CSV_A, 1 ) - YSV_TMP(JI, JJ) = CSV_A(JI, JJ) - END DO - END DO - CALL MOVE_ALLOC( FROM = YSV_TMP, TO = TNSV%CSV_A ) - CSV_A => TNSV%CSV_A -END IF - -CSV => CSV_A(:,KMI) - -! Allocate/reallocate TSVLIST_A -IF ( .NOT. ALLOCATED( TNSV%TSVLIST_A ) ) THEN - ALLOCATE( TNSV%TSVLIST_A( NSV_A(KMI), KMI) ) - TSVLIST_A => TNSV%TSVLIST_A -ENDIF -!If TSVLIST_A is too small, enlarge it and transfer data -IF ( SIZE( TSVLIST_A, 1 ) < NSV_A(KMI) .OR. SIZE( TSVLIST_A, 2 ) < KMI ) THEN - ALLOCATE( YSVLIST_TMP( MAX( SIZE(TSVLIST_A,1), NSV_A(KMI) ), MAX( SIZE(TSVLIST_A,2), KMI ) ) ) - DO JJ = 1, SIZE( TSVLIST_A, 2 ) - DO JI = 1, SIZE( TSVLIST_A, 1 ) - YSVLIST_TMP(JI, JJ) = TSVLIST_A(JI, JJ) - END DO - END DO - CALL MOVE_ALLOC( FROM = YSVLIST_TMP, TO = TNSV%TSVLIST_A ) - TSVLIST_A => TNSV%TSVLIST_A -END IF - -TSVLIST => TSVLIST_A(:,KMI) - -NSV = NSV_A(KMI) -NSV_USER = NSV_USER_A(KMI) -NSV_C2R2 = NSV_C2R2_A(KMI) -NSV_C2R2BEG = NSV_C2R2BEG_A(KMI) -NSV_C2R2END = NSV_C2R2END_A(KMI) -NSV_C1R3 = NSV_C1R3_A(KMI) -NSV_C1R3BEG = NSV_C1R3BEG_A(KMI) -NSV_C1R3END = NSV_C1R3END_A(KMI) -! -ISV=-1 -CALL LIMA_UPDATE_NSV(LDINIT=.FALSE., KMI=KMI, KSV=ISV, CDCLOUD='LIMA', LDUPDATE=.TRUE.) -! -NSV_ELEC = NSV_ELEC_A(KMI) -NSV_ELECBEG = NSV_ELECBEG_A(KMI) -NSV_ELECEND = NSV_ELECEND_A(KMI) -NSV_CHEM = NSV_CHEM_A(KMI) -NSV_CHEMBEG = NSV_CHEMBEG_A(KMI) -NSV_CHEMEND = NSV_CHEMEND_A(KMI) -NSV_CHGS = NSV_CHGS_A(KMI) -NSV_CHGSBEG = NSV_CHGSBEG_A(KMI) -NSV_CHGSEND = NSV_CHGSEND_A(KMI) -NSV_CHAC = NSV_CHAC_A(KMI) -NSV_CHACBEG = NSV_CHACBEG_A(KMI) -NSV_CHACEND = NSV_CHACEND_A(KMI) -NSV_CHIC = NSV_CHIC_A(KMI) -NSV_CHICBEG = NSV_CHICBEG_A(KMI) -NSV_CHICEND = NSV_CHICEND_A(KMI) -NSV_LNOX = NSV_LNOX_A(KMI) -NSV_LNOXBEG = NSV_LNOXBEG_A(KMI) -NSV_LNOXEND = NSV_LNOXEND_A(KMI) -NSV_DST = NSV_DST_A(KMI) -NSV_DSTBEG = NSV_DSTBEG_A(KMI) -NSV_DSTEND = NSV_DSTEND_A(KMI) -NSV_DSTDEP = NSV_DSTDEP_A(KMI) -NSV_DSTDEPBEG = NSV_DSTDEPBEG_A(KMI) -NSV_DSTDEPEND = NSV_DSTDEPEND_A(KMI) -NSV_SLT = NSV_SLT_A(KMI) -NSV_SLTBEG = NSV_SLTBEG_A(KMI) -NSV_SLTEND = NSV_SLTEND_A(KMI) -NSV_SLTDEPBEG = NSV_SLTDEPBEG_A(KMI) -NSV_SLTDEPEND = NSV_SLTDEPEND_A(KMI) -NSV_AER = NSV_AER_A(KMI) -NSV_AERBEG = NSV_AERBEG_A(KMI) -NSV_AEREND = NSV_AEREND_A(KMI) -NSV_AERDEPBEG = NSV_AERDEPBEG_A(KMI) -NSV_AERDEPEND = NSV_AERDEPEND_A(KMI) -NSV_LG = NSV_LG_A(KMI) -NSV_LGBEG = NSV_LGBEG_A(KMI) -NSV_LGEND = NSV_LGEND_A(KMI) -NSV_PP = NSV_PP_A(KMI) -NSV_PPBEG = NSV_PPBEG_A(KMI) -NSV_PPEND = NSV_PPEND_A(KMI) -#ifdef MNH_FOREFIRE -NSV_FF = NSV_FF_A(KMI) -NSV_FFBEG = NSV_FFBEG_A(KMI) -NSV_FFEND = NSV_FFEND_A(KMI) -#endif -NSV_FIRE = NSV_FIRE_A(KMI) -NSV_FIREBEG = NSV_FIREBEG_A(KMI) -NSV_FIREEND = NSV_FIREEND_A(KMI) -NSV_CS = NSV_CS_A(KMI) -NSV_CSBEG = NSV_CSBEG_A(KMI) -NSV_CSEND = NSV_CSEND_A(KMI) -NSV_SNW = NSV_SNW_A(KMI) -NSV_SNWBEG = NSV_SNWBEG_A(KMI) -NSV_SNWEND = NSV_SNWEND_A(KMI) -! - -END SUBROUTINE UPDATE_NSV diff --git a/src/PHYEX/ext/ver_interp_field.f90 b/src/PHYEX/ext/ver_interp_field.f90 deleted file mode 100644 index d0092e917..000000000 --- a/src/PHYEX/ext/ver_interp_field.f90 +++ /dev/null @@ -1,327 +0,0 @@ -!MNH_LIC Copyright 1997-2020 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!####################### -MODULE MODI_VER_INTERP_FIELD -!####################### -! -INTERFACE -! - SUBROUTINE VER_INTERP_FIELD(HTURB,KRR,KSV,PZZ_LS,PZZ, & - PUT,PVT,PWT,PTHVT,PRT,PHUT,PTKET,PSVT, & - PSRCT,PSIGS, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM ) -! -CHARACTER (LEN=4), INTENT(IN) :: HTURB ! Kind of turbulence parameterization -INTEGER, INTENT(IN) :: KRR ! number of moist variables -INTEGER, INTENT(IN) :: KSV ! number of scalar variables -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ_LS ! initial 3D grid -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! new 3D grid -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUT,PVT,PWT ! model 2 -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTKET ! variables -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT,PSVT ! at t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHVT,PHUT ! -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRCT,PSIGS ! secondary - ! prognostic variables - ! Larger Scale fields -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSUM, PLSVM, PLSWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSTHM, PLSRVM ! Mass -END SUBROUTINE VER_INTERP_FIELD -! -END INTERFACE -! -END MODULE MODI_VER_INTERP_FIELD -! -! ########################################################################## - SUBROUTINE VER_INTERP_FIELD(HTURB,KRR,KSV,PZZ_LS,PZZ, & - PUT,PVT,PWT,PTHVT,PRT,PHUT,PTKET,PSVT, & - PSRCT,PSIGS, & - PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM ) -! ########################################################################## -! -!!**** *VER_INTERP_FIELD * - interpolate the 3D and LS 2D fields from one -!! vertical grid PZZ_LS to another PZZ -!! -!! PURPOSE -!! ------- -!! -!! -!!** METHOD -!! ------ -!! -!! -!! EXTERNAL -!! -------- -!! -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! Book1 of the documentation -!! SUBROUTINE VER_INTERP_FIELD (Book2 of the documentation) -!! -!! -!! AUTHOR -!! ------ -!! -!! V. Masson * METEO-FRANCE * -!! -!! MODIFICATIONS -!! ------------- -!! -!! Original 17/07/97 -!! 14/09/97 (V. Masson) Interpolation of relative humidity -!! 05/06 Remobe KEPS -!! 2014 (M.Faivre) -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CONF_n, ONLY : CONF_MODEL -USE MODD_TURB_n, ONLY: XTKEMIN -USE MODD_PARAMETERS -USE MODD_VER_INTERP_LIN -! -USE MODI_SHUMAN -USE MODI_COEF_VER_INTERP_LIN -USE MODI_VER_INTERP_LIN -!$20140709 -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODD_FIELD_n ! modules relative to the outer model $n -USE MODD_LSFIELD_n -USE MODE_MPPDB -!$20140710 -USE MODE_ll -USE MODD_LBC_n -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -! -CHARACTER (LEN=4), INTENT(IN) :: HTURB ! Kind of turbulence parameterization -INTEGER, INTENT(IN) :: KRR ! number of moist variables -INTEGER, INTENT(IN) :: KSV ! number of scalar variables -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ_LS ! initial 3D grid -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! new 3D grid -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUT,PVT,PWT ! model 2 -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTKET ! variables -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT,PSVT ! at t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHVT,PHUT ! -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRCT,PSIGS ! secondary - ! prognostic variables - ! Larger Scale fields -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSUM, PLSVM, PLSWM ! Wind -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSTHM, PLSRVM ! Mass -!* 0.2 Declarations of local variables -! -INTEGER :: JRR, JSV -INTEGER :: IKU -INTEGER :: IKB -REAL, DIMENSION(SIZE(PZZ_LS,1),SIZE(PZZ_LS,2),SIZE(PZZ_LS,3)) :: ZGRID1, ZGRID2 -!$20140709 -TYPE(LIST_ll), POINTER :: TZLSFIELD_ll ! list of LS fields -INTEGER :: IINFO_ll -!$20140710 -INTEGER JI,JJ,IIB,IJB,IIE,IJE -! -!------------------------------------------------------------------------------- -! -!* 1. Prologue -! -------- -! -IKU=SIZE(PZZ,3) -! -IKB=1+JPVEXT -!$20140710 -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -!------------------------------------------------------------------------------- -! -!* 2. variables which always exist -! ---------------------------- -! -!* 2.1 U component -! ----------- -! -!* shift of grids to mass points -ZGRID1(:,:,:)=MZF(PZZ_LS(:,:,:)) -ZGRID1(:,:,IKU)=2.*ZGRID1(:,:,IKU-1)-ZGRID1(:,:,IKU-2) -ZGRID2(:,:,:)=MZF(PZZ(:,:,:)) -ZGRID2(:,:,IKU)=2.*ZGRID2(:,:,IKU-1)-ZGRID2(:,:,IKU-2) -!* move the first physical level if above the target grid -ZGRID1(:,:,1:IKB)=MIN(ZGRID1(:,:,1:IKB),ZGRID2(:,:,1:IKB)) -!$20140710 -CALL MPPDB_CHECK3D(ZGRID1,"VERINTERPFIELDbefMXM:ZGRID1",PRECISION) -CALL MPPDB_CHECK3D(ZGRID2,"VERINTERPFIELDbefMXM:ZGRID2",PRECISION) -!* shift to U points -!$20140710pb with MXM,MYM: MPPDB pb -!$if cancel MXM, MYM then PUM,PVM are ok -ZGRID1(:,:,:)=MXM(ZGRID1(:,:,:)) -ZGRID2(:,:,:)=MXM(ZGRID2(:,:,:)) -DO JI=JPHEXT,1,-1 - ZGRID1(JI,:,:)=2.*ZGRID1(JI+1,:,:)-ZGRID1(JI+2,:,:) - ZGRID2(JI,:,:)=2.*ZGRID2(JI+1,:,:)-ZGRID2(JI+2,:,:) -ENDDO -!$20140710 update_halo -NULLIFY(TZLSFIELD_ll) -CALL ADD3DFIELD_ll( TZLSFIELD_ll, ZGRID1, 'VER_INTERP_FIELD::ZGRID1' ) -CALL ADD3DFIELD_ll( TZLSFIELD_ll, ZGRID2, 'VER_INTERP_FIELD::ZGRID2' ) -CALL UPDATE_HALO_ll(TZLSFIELD_ll,IINFO_ll) -CALL CLEANLIST_ll(TZLSFIELD_ll) -! -!$20140710 -CALL MPPDB_CHECK3D(ZGRID1,"VERINTERPFIELDaftMXM:ZGRID1",PRECISION) -CALL MPPDB_CHECK3D(ZGRID2,"VERINTERPFIELDaftMXM:ZGRID2",PRECISION) -! -!$20140710 add NKLIN and XCOEFLIN in COEF_VER_INTERP -CALL COEF_VER_INTERP_LIN(ZGRID1(:,:,:),ZGRID2(:,:,:)) -! -PUT (:,:,:) = VER_INTERP_LIN(PUT (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) -PLSUM (:,:,:) = VER_INTERP_LIN(PLSUM (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) -!$20140709 -CALL MPPDB_CHECK3D(PUT,"VERINTERPFIELD:PUT",PRECISION) -!$ -! -!* 2.2 V component -! ----------- -! -!* shift of grids to mass points -ZGRID1(:,:,:)=MZF(PZZ_LS(:,:,:)) -ZGRID1(:,:,IKU)=2.*ZGRID1(:,:,IKU-1)-ZGRID1(:,:,IKU-2) -ZGRID2(:,:,:)=MZF(PZZ(:,:,:)) -ZGRID2(:,:,IKU)=2.*ZGRID2(:,:,IKU-1)-ZGRID2(:,:,IKU-2) -!* move the first physical level if above the target grid -ZGRID1(:,:,1:IKB)=MIN(ZGRID1(:,:,1:IKB),ZGRID2(:,:,1:IKB)) -!* shift to V points - -ZGRID1(:,:,:)=MYM(ZGRID1(:,:,:)) -ZGRID2(:,:,:)=MYM(ZGRID2(:,:,:)) -DO JJ=JPHEXT,1,-1 - ZGRID1(:,JJ,:)=2.*ZGRID1(:,JJ+1,:)-ZGRID1(:,JJ+2,:) - ZGRID2(:,JJ,:)=2.*ZGRID2(:,JJ+1,:)-ZGRID2(:,JJ+2,:) -ENDDO -!$20140711 updatehalo(zg1,2) also here -NULLIFY(TZLSFIELD_ll) -CALL ADD3DFIELD_ll( TZLSFIELD_ll, ZGRID1, 'VER_INTERP_FIELD::ZGRID1' ) -CALL ADD3DFIELD_ll( TZLSFIELD_ll, ZGRID2, 'VER_INTERP_FIELD::ZGRID2' ) -CALL UPDATE_HALO_ll(TZLSFIELD_ll,IINFO_ll) -CALL CLEANLIST_ll(TZLSFIELD_ll) -!$ -CALL COEF_VER_INTERP_LIN(ZGRID1(:,:,:),ZGRID2(:,:,:)) -! -!$20140710 -CALL MPPDB_CHECK3D(XCOEFLIN,"VERINTERPFIELDaftVerinterplin:XCOEFLIN",PRECISION) -PVT (:,:,:) = VER_INTERP_LIN(PVT (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) -PLSVM (:,:,:) = VER_INTERP_LIN(PLSVM (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) -!$20140710 -CALL MPPDB_CHECK3D(PVT,"VERINTERPFIELDaftVerinterplin:PVT",PRECISION) -! -!* 2.3 W component -! ----------- -! -ZGRID1(:,:,:)=PZZ_LS(:,:,:) -ZGRID2(:,:,:)=PZZ (:,:,:) -!* move the first physical level if above the target grid -ZGRID1(:,:,1:IKB)=MIN(ZGRID1(:,:,1:IKB),ZGRID2(:,:,1:IKB)) -! -CALL COEF_VER_INTERP_LIN(ZGRID1(:,:,:),ZGRID2(:,:,:)) -! -PWT (:,:,:) = VER_INTERP_LIN(PWT (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) -PLSWM (:,:,:) = VER_INTERP_LIN(PLSWM (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) -! -!* 2.4 thermodynamical variables -! ------------------------- -! -!* shift of grids to mass points -ZGRID1(:,:,:)=MZF(PZZ_LS(:,:,:)) -ZGRID1(:,:,IKU)=2.*ZGRID1(:,:,IKU-1)-ZGRID1(:,:,IKU-2) -ZGRID2(:,:,:)=MZF(PZZ(:,:,:)) -ZGRID2(:,:,IKU)=2.*ZGRID2(:,:,IKU-1)-ZGRID2(:,:,IKU-2) -! -CALL COEF_VER_INTERP_LIN(ZGRID1(:,:,:),ZGRID2(:,:,:)) -! -PTHVT (:,:,:) = VER_INTERP_LIN(PTHVT (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) -PLSTHM(:,:,:) = VER_INTERP_LIN(PLSTHM(:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) -! -IF ( SIZE(PLSRVM,1) /= 0 ) THEN - PLSRVM(:,:,:) = VER_INTERP_LIN(PLSRVM(:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) - PLSRVM=MAX(PLSRVM,0.) -END IF -! -!------------------------------------------------------------------------------- -! -!* 3. moist variables -! --------------- -! -DO JRR=1,KRR - PRT (:,:,:,JRR) = VER_INTERP_LIN(PRT (:,:,:,JRR),NKLIN(:,:,:),XCOEFLIN(:,:,:)) - PRT (:,:,:,JRR) = MAX(PRT(:,:,:,JRR),0.) -END DO -! -IF (CONF_MODEL(1)%NRR>=1) THEN - PHUT(:,:,:) = VER_INTERP_LIN(PHUT (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) - PHUT(:,:,:) = MIN(MAX(PHUT(:,:,:),0.),100.) -END IF -! -!------------------------------------------------------------------------------- -! -!* 4. scalar variables -! ---------------- -! -DO JSV=1,KSV - PSVT (:,:,:,JSV) = VER_INTERP_LIN(PSVT (:,:,:,JSV),NKLIN(:,:,:),XCOEFLIN(:,:,:)) - PSVT (:,:,:,JSV) = MAX(PSVT(:,:,:,JSV),0.) -END DO -! -!------------------------------------------------------------------------------- -! -!* 5. TKE variable -! ------------ -! -!* shift of grids to mass points -ZGRID1(:,:,:)=MZF(PZZ_LS(:,:,:)) -ZGRID1(:,:,IKU)=2.*ZGRID1(:,:,IKU-1)-ZGRID1(:,:,IKU-2) -ZGRID2(:,:,:)=MZF(PZZ(:,:,:)) -ZGRID2(:,:,IKU)=2.*ZGRID2(:,:,IKU-1)-ZGRID2(:,:,IKU-2) -!* move the first physical level if above the target grid -ZGRID1(:,:,1:IKB)=MIN(ZGRID1(:,:,1:IKB),ZGRID2(:,:,1:IKB)) -! -CALL COEF_VER_INTERP_LIN(ZGRID1(:,:,:),ZGRID2(:,:,:)) -! -IF (HTURB /= 'NONE') THEN - PTKET(:,:,:) = VER_INTERP_LIN(PTKET (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) - PTKET=MAX(PTKET,XTKEMIN) -ENDIF -! -! -!------------------------------------------------------------------------------- -! -!* 6. secondary prognostic variables -! ------------------------------ -! -IF (KRR > 1 .AND. HTURB /= 'NONE') THEN - PSRCT (:,:,:) = VER_INTERP_LIN(PSRCT (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) - PSIGS (:,:,:) = VER_INTERP_LIN(PSIGS (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) -ENDIF -! -!------------------------------------------------------------------------------- -! -DEALLOCATE(NKLIN) -DEALLOCATE(XCOEFLIN) -!------------------------------------------------------------------------------- -! -END SUBROUTINE VER_INTERP_FIELD -! diff --git a/src/PHYEX/ext/write_desfmn.f90 b/src/PHYEX/ext/write_desfmn.f90 deleted file mode 100644 index 908c2eff8..000000000 --- a/src/PHYEX/ext/write_desfmn.f90 +++ /dev/null @@ -1,730 +0,0 @@ -!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ######################### - MODULE MODI_WRITE_DESFM_n -! ######################### -! -INTERFACE -! -SUBROUTINE WRITE_DESFM_n(KMI,TPDATAFILE) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KMI ! Model index -TYPE(TFILEDATA), INTENT(IN) :: TPDATAFILE ! Datafile -! -END SUBROUTINE WRITE_DESFM_n -! -END INTERFACE -! -END MODULE MODI_WRITE_DESFM_n -! -! -! ################################################### - SUBROUTINE WRITE_DESFM_n(KMI,TPDATAFILE) -! ################################################### -! -!!**** *WRITE_DESFM_n * - routine to write a descriptor file ( DESFM ) -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to write the descriptive part of a Mesonh -! file (FM-file). The resulting file is called DESFM. -! -!! -!!** METHOD -!! ------ -!! -!! This routine writes in the file HDESFM, previously opened, the group of -!! all the namelists used to specify a Mesonh simulation. -!! If verbose option is high enough : NVERB>=5, the variables in descriptor -!! file are printed on the right output-listing corresponding tomodel _n. -!! -!! EXTERNAL -!! -------- -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! Module MODN_LUNIT_n : contains declarations of namelist NAM_LUNITn -!! and module MODD_LUNIT_n -!! -!! -!! Module MODN_CONF_n : contains declaration of namelist NAM_CONFn and -!! uses module MODD_CONF1 (configuration variables -!! for model _n ) -!! -!! Module MODN_DYN_n : contains declaration of namelist NAM_DYNn and -!! uses module MODD_DYN_n (dynamic control variables -!! for model _n ) -!! -!! Module MODN_ADV_n : contains declaration of namelist NAM_ADVn and -!! uses module MODD_ADV_n (control variables for the -!! advection scheme for model _n ) -!! -!! Module MODN_PARAM_n : contains declaration of namelist NAM_PARAMn and -!! uses module MODD_PARAM_n (names of the physical -!! parameterizations for model _n ) -!! -!! Module MODN_PARAM_RAD_n : contains declaration of the control parameters -!! for calling the radiation scheme -!! -!! Module MODN_PARAM_KAFR_n : contains declaration of control parameters -!! for calling the deep convection scheme -!! -!! Module MODN_LBC_n : contains declaration of namelis NAM_LBCn and -!! uses module MODD_LBC_n (lateral boundary conditions) -!! -!! -!! Module MODN_TURB_n : contains declaration of turbulence scheme options -!! present in the namelist -!! -!! Module MODN_CONF : contains declaration of namelist NAM_CONF and -!! uses module MODD_CONF (configuration variables) -!! -!! Module MODN_DYN : contains the declaration of namelist NAM_DYN and -!! uses module MODD_DYN (dynamic control variables) -!! -!! Module MODN_BUDGET : contains declaration of all the namelists -!! related to the budget computations -!! -!! Module MODN_LES : contains declaration of the control parameters -!! for Large Eddy Simulations' storages -!! Module MODN_BLANK_n : contains declaration of MesoNH developper variables -!! for test and debugging purposes. -!! -!! -!! REFERENCE -!! --------- -!! None -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/06/94 -!! Updated V.Ducrocq 06/09/94 -!! Updated J.Stein 20/10/94 to include NAM_OUTn -!! Updated J.Stein 24/10/94 change routine name -!! Updated J.Stein 26/10/94 add the OWRIGET argument -!! Updated J.Stein 06/12/94 add the LS fields -!! Updated J.Stein 09/01/95 add the turbulence scheme -!! Updated J.Stein 09/01/95 add the 1D switch -!! Updated J.Stein 20/03/95 remove R from the historical var. -!! Updated Ph.Hereil 20/06/95 add the budgets -!! Updated J.-P. Pinty 15/09/95 add the radiations -!! Updated J.Vila 06/02/96 implementation of scalar -!! advection schemes -!! Updated J.Stein 20/02/96 cleaning + add the LES namelist -!! Modifications 25/04/96 (Suhre) add NAM_BLANK -!! Modifications 25/04/96 (Suhre) add NAM_FRC -!! Modifications 25/04/96 (Suhre) add NAM_CH_MNHCn and NAM_CH_SOLVER -!! Modifications 11/04/96 (Pinty) add the ice concentration -!! Modifications 11/01/97 (Pinty) add the deep convection -!! Temporary Modification (Masson 06/09/96) manual write of the first and -!! third namelists because of compiler version. -!! Modifications J.-P. Lafore 22/07/96 gridnesting implementation -!! Modifications J.-P. Lafore 29/07/96 add NAM_FMOUT (renamed in NAM_OUTPUT/NAM_BACKUP) -!! Modifications V. Masson 10/07/97 add NAM_PARAM_GROUNDn -!! Modifications V. Masson 28/07/97 supress LSTEADY_DMASS -!! Modifications P. Jabouille 03/10/01 LHORELAX_ modifications -!! Modifications P. Jabouille 12/03/02 conditional writing of namelists -!! Modifications J.-P. Pinty 29/11/02 add C3R5, ICE2, ICE4, CELEC -!! Modification V. Masson 01/2004 removes surface (externalization) -!! Modification P. Tulet 01/2005 add dust, orilam -!! Modification 05/2006 Remove EPS and OWRIGET -!! Modification 01/2016 (JP Pinty) Add LIMA -!! 02/2018 Q.Libois ECRAD -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! Modification V. Vionnet 07/2017 add blowing snow variables -!! Modification F.Auguste 02/2021 add IBM -!! E.Jezequel 02/2021 add stations read from CSV file -! A. Costes 12/2021: add Blaze fire model -! P. Wautelet 27/04/2022: add namelist for profilers -! P. Wautelet 13/07/2022: add namelist for flyers and balloons -! P. Wautelet 19/01/2023: bugfix for ForeFire -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -USE MODD_CONF -USE MODD_DYN_n, ONLY: LHORELAX_SVLIMA, LHORELAX_SVFIRE -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE, ONLY: LFOREFIRE -#endif -USE MODD_IBM_LSF, ONLY: LIBM_LSF -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_PARAMETERS -USE MODD_PROFILER_n, ONLY: LPROFILER -USE MODD_STATION_n, ONLY: LSTATION -! -USE MODE_MSG -! -! USE MODN_AIRCRAFTS -USE MODN_BACKUP -! USE MODN_BALLOONS -USE MODN_CONF -USE MODN_DYN -USE MODN_NESTING -USE MODN_OUTPUT -USE MODN_BUDGET -USE MODN_LES -USE MODN_DYN_n -USE MODN_ADV_n -USE MODN_PARAM_n -USE MODN_PARAM_RAD_n -USE MODN_PARAM_ECRAD_n -USE MODN_PARAM_KAFR_n -USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN_INIT -USE MODD_PARAM_ICE_n, ONLY: PARAM_ICEN_INIT -USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_INIT -USE MODN_CONF_n -USE MODN_LUNIT_n -USE MODN_LBC_n -USE MODN_NUDGING_n -USE MODD_TURB_n, ONLY: TURBN_INIT -USE MODD_NEB_n, ONLY: NEBN_INIT -USE MODN_BLANK_n -USE MODN_FRC -USE MODN_CH_MNHC_n -USE MODN_CH_SOLVER_n -USE MODN_PARAM_C2R2 -USE MODN_PARAM_C1R3 -USE MODN_ELEC -USE MODN_SERIES -USE MODN_SERIES_n -USE MODN_TURB_CLOUD -USE MODN_CH_ORILAM -USE MODN_DUST -USE MODN_SALT -USE MODN_PASPOL -USE MODN_CONDSAMP -USE MODN_2D_FRC -USE MODN_LATZ_EDFLX -#ifdef MNH_FOREFIRE -USE MODN_FOREFIRE -#endif -USE MODN_BLOWSNOW_n -USE MODN_BLOWSNOW -USE MODN_IBM_PARAM_n -USE MODN_RECYCL_PARAM_n -USE MODN_PROFILER_n, LDIAG_SURFRAD_PROF => LDIAG_SURFRAD -USE MODN_STATION_n, LDIAG_SURFRAD_STAT => LDIAG_SURFRAD -USE MODN_FIRE_n -USE MODN_FLYERS -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KMI ! Model index -TYPE(TFILEDATA), INTENT(IN) :: TPDATAFILE ! Datafile -! -!* 0.2 declarations of local variables -! -INTEGER :: ILUSEG ! logical unit number of EXSEG file -INTEGER :: ILUOUT ! Logical unit number for output-listing TLUOUT file -! -LOGICAL :: GHORELAX_UVWTH, & - GHORELAX_RV, GHORELAX_RC, GHORELAX_RR, & - GHORELAX_RI, GHORELAX_RS, GHORELAX_RG, & - GHORELAX_TKE, GHORELAX_SVC2R2, GHORELAX_SVPP, & - GHORELAX_SVCS, GHORELAX_SVCHIC, GHORELAX_SVFIRE,& -#ifdef MNH_FOREFIRE - GHORELAX_SVFF, & -#endif - GHORELAX_SVCHEM, GHORELAX_SVC1R3, & - GHORELAX_SVELEC, GHORELAX_SVLIMA,GHORELAX_SVSNW -LOGICAL :: GHORELAX_SVDST, GHORELAX_SVSLT, GHORELAX_SVAER -LOGICAL, DIMENSION(JPSVMAX) :: GHORELAX_SV -! -!------------------------------------------------------------------------------- -! -!* 1. UPDATE DESFM FILE -! ----------------- -! -CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_DESFM_n','called for '//TRIM(TPDATAFILE%CNAME)) -! -IF (.NOT.ASSOCIATED(TPDATAFILE%TDESFILE)) & - CALL PRINT_MSG(NVERB_FATAL,'IO','WRITE_DESFM_n','TDESFILE not associated for '//TRIM(TPDATAFILE%CNAME)) -! -ILUSEG = TPDATAFILE%TDESFILE%NLU -! -CALL INIT_NAM_LUNITn -WRITE(UNIT=ILUSEG,NML=NAM_LUNITn) -IF (CPROGRAM/='MESONH') THEN - LUSECI=.FALSE. - NSV_USER = 0 -ENDIF -CALL INIT_NAM_CONFn -WRITE(UNIT=ILUSEG,NML=NAM_CONFn) -! -! -CALL INIT_NAM_DYNn -IF (CPROGRAM/='MESONH') THEN ! impose default value for next simulation - GHORELAX_UVWTH = LHORELAX_UVWTH - GHORELAX_RV = LHORELAX_RV - GHORELAX_RC = LHORELAX_RC - GHORELAX_RR = LHORELAX_RR - GHORELAX_RI = LHORELAX_RI - GHORELAX_RS = LHORELAX_RS - GHORELAX_RG = LHORELAX_RG - GHORELAX_TKE = LHORELAX_TKE - GHORELAX_SV(:) = LHORELAX_SV(:) - GHORELAX_SVC2R2= LHORELAX_SVC2R2 - GHORELAX_SVC1R3= LHORELAX_SVC1R3 - GHORELAX_SVLIMA= LHORELAX_SVLIMA - GHORELAX_SVELEC= LHORELAX_SVELEC - GHORELAX_SVCHEM= LHORELAX_SVCHEM - GHORELAX_SVCHIC= LHORELAX_SVCHIC - GHORELAX_SVDST = LHORELAX_SVDST - GHORELAX_SVSLT = LHORELAX_SVSLT - GHORELAX_SVPP = LHORELAX_SVPP - GHORELAX_SVFIRE = LHORELAX_SVFIRE -#ifdef MNH_FOREFIRE - GHORELAX_SVFF = LHORELAX_SVFF -#endif - GHORELAX_SVCS = LHORELAX_SVCS - GHORELAX_SVAER = LHORELAX_SVAER - GHORELAX_SVSNW = LHORELAX_SVSNW -! - LHORELAX_UVWTH = .FALSE. - LHORELAX_RV = .FALSE. - LHORELAX_RC = .FALSE. - LHORELAX_RR = .FALSE. - LHORELAX_RI = .FALSE. - LHORELAX_RS = .FALSE. - LHORELAX_RG = .FALSE. - LHORELAX_TKE = .FALSE. - LHORELAX_SV(:) = .FALSE. - LHORELAX_SVC2R2= .FALSE. - LHORELAX_SVC1R3= .FALSE. - LHORELAX_SVLIMA= .FALSE. - LHORELAX_SVELEC= .FALSE. - LHORELAX_SVCHEM= .FALSE. - LHORELAX_SVCHIC= .FALSE. - LHORELAX_SVLG = .FALSE. - LHORELAX_SVPP = .FALSE. - LHORELAX_SVFIRE = .FALSE. -#ifdef MNH_FOREFIRE - LHORELAX_SVFF = .FALSE. -#endif - LHORELAX_SVCS = .FALSE. - LHORELAX_SVDST= .FALSE. - LHORELAX_SVSLT= .FALSE. - LHORELAX_SVAER= .FALSE. - LHORELAX_SVSNW= .FALSE. -ELSE !return to namelist meaning of LHORELAX_SV - GHORELAX_SV(:) = LHORELAX_SV(:) - LHORELAX_SV(NSV_USER+1:)=.FALSE. -END IF -WRITE(UNIT=ILUSEG,NML=NAM_DYNn) -! -IF (LIBM_LSF) THEN - ! - CALL INIT_NAM_IBM_PARAMn - ! - WRITE(UNIT=ILUSEG,NML=NAM_IBM_PARAMn) - ! - IF (CPROGRAM/='MESONH') THEN - LIBM = .FALSE. - LIBM_TROUBLE = .FALSE. - CIBM_ADV = 'NOTHIN' - END IF - ! -END IF -! -CALL INIT_NAM_ADVn -WRITE(UNIT=ILUSEG,NML=NAM_ADVn) -IF (CPROGRAM/='MESONH') THEN - CTURB = 'NONE' - CRAD = 'NONE' - CCLOUD = 'NONE' - CDCONV = 'NONE' - CSCONV = 'NONE' - CELEC = 'NONE' - CACTCCN = 'NONE' -END IF -CALL INIT_NAM_PARAMn -WRITE(UNIT=ILUSEG,NML=NAM_PARAMn) -! -CALL INIT_NAM_PARAM_RADn -IF(CRAD /= 'NONE') WRITE(UNIT=ILUSEG,NML=NAM_PARAM_RADn) -#ifdef MNH_ECRAD -CALL INIT_NAM_PARAM_ECRADn -IF(CRAD /= 'NONE') WRITE(UNIT=ILUSEG,NML=NAM_PARAM_ECRADn) -#endif -! -CALL INIT_NAM_PARAM_KAFRn -IF(CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') & - WRITE(UNIT=ILUSEG,NML=NAM_PARAM_KAFRn) -! -IF (CSCONV == 'EDKF' ) CALL PARAM_MFSHALLN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1) -! -CALL INIT_NAM_LBCn -WRITE(UNIT=ILUSEG,NML=NAM_LBCn) -! -CALL INIT_NAM_NUDGINGn -WRITE(UNIT=ILUSEG,NML=NAM_NUDGINGn) -! -IF(CTURB /= 'NONE') CALL TURBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1) -! -CALL NEBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1) -! -CALL INIT_NAM_BLANKn -WRITE(UNIT=ILUSEG,NML=NAM_BLANKn) -! -!IF (CPROGRAM/='MESONH') THEN -! LUSECHEM = .FALSE. -! LORILAM = .FALSE. -! LDEPOS_AER = .FALSE. -! LDUST = .FALSE. -! LDEPOS_DST = .FALSE. -! LSALT = .FALSE. -! LDEPOS_SLT = .FALSE. -! LPASPOL = .FALSE. -! LCONDSAMP = .FALSE. -!END IF -CALL INIT_NAM_CH_MNHCn -IF(LUSECHEM .OR. LCH_CONV_LINOX .OR. LCH_CONV_SCAV) & - WRITE(UNIT=ILUSEG,NML=NAM_CH_MNHCn) -! -CALL INIT_NAM_CH_SOLVERn -IF(LUSECHEM) WRITE(UNIT=ILUSEG,NML=NAM_CH_SOLVERn) -! -CALL INIT_NAM_BLOWSNOWn -IF(LBLOWSNOW) WRITE(UNIT=ILUSEG,NML=NAM_BLOWSNOWn) -IF(LBLOWSNOW) WRITE(UNIT=ILUSEG,NML=NAM_BLOWSNOW) -! -CALL INIT_NAM_PROFILERn -IF(LPROFILER) WRITE(UNIT=ILUSEG,NML=NAM_PROFILERn) -! -CALL INIT_NAM_STATIONn -IF(LSTATION) WRITE(UNIT=ILUSEG,NML=NAM_STATIONn) -! -IF(LDUST) WRITE(UNIT=ILUSEG,NML=NAM_DUST) -IF(LSALT) WRITE(UNIT=ILUSEG,NML=NAM_SALT) -IF(LPASPOL) WRITE(UNIT=ILUSEG,NML=NAM_PASPOL) -#ifdef MNH_FOREFIRE -IF(LFOREFIRE) WRITE(UNIT=ILUSEG,NML=NAM_FOREFIRE) -#endif -! -CALL INIT_NAM_FIREn -WRITE(UNIT=ILUSEG,NML=NAM_FIREn) -! -IF(LCONDSAMP) WRITE(UNIT=ILUSEG,NML=NAM_CONDSAMP) -IF(LORILAM.AND.LUSECHEM) WRITE(UNIT=ILUSEG,NML=NAM_CH_ORILAM) -! -CALL INIT_NAM_SERIESn -IF(LSERIES) WRITE(UNIT=ILUSEG,NML=NAM_SERIESn) -IF(L2D_ADV_FRC .OR. L2D_REL_FRC) WRITE(UNIT=ILUSEG,NML=NAM_2D_FRC) -! -IF (LUV_FLX .OR. LTH_FLX) WRITE(UNIT=ILUSEG,NML=NAM_LATZ_EDFLX) -! -IF (CPROGRAM/='MESONH') THEN - LLG = .FALSE. -END IF -WRITE(UNIT=ILUSEG,NML=NAM_CONF) -WRITE(UNIT=ILUSEG,NML=NAM_DYN) -WRITE(UNIT=ILUSEG,NML=NAM_NESTING) -!WRITE(UNIT=ILUSEG,NML=NAM_BACKUP) -!WRITE(UNIT=ILUSEG,NML=NAM_OUTPUT) -IF(CBUTYPE /= 'NONE') THEN - IF(CBUTYPE=='SKIP') CBUTYPE='CART' - WRITE(UNIT=ILUSEG,NML=NAM_BUDGET) -END IF -IF(LBU_RU) WRITE(UNIT=ILUSEG,NML=NAM_BU_RU) -IF(LBU_RV) WRITE(UNIT=ILUSEG,NML=NAM_BU_RV) -IF(LBU_RW) WRITE(UNIT=ILUSEG,NML=NAM_BU_RW) -IF(LBU_RTH) WRITE(UNIT=ILUSEG,NML=NAM_BU_RTH) -IF(LBU_RTKE) WRITE(UNIT=ILUSEG,NML=NAM_BU_RTKE) -IF(LBU_RRV) WRITE(UNIT=ILUSEG,NML=NAM_BU_RRV) -IF(LBU_RRC) WRITE(UNIT=ILUSEG,NML=NAM_BU_RRC) -IF(LBU_RRR) WRITE(UNIT=ILUSEG,NML=NAM_BU_RRR) -IF(LBU_RRI) WRITE(UNIT=ILUSEG,NML=NAM_BU_RRI) -IF(LBU_RRS) WRITE(UNIT=ILUSEG,NML=NAM_BU_RRS) -IF(LBU_RRG) WRITE(UNIT=ILUSEG,NML=NAM_BU_RRG) -IF(LBU_RRH) WRITE(UNIT=ILUSEG,NML=NAM_BU_RRH) -IF(LBU_RSV) WRITE(UNIT=ILUSEG,NML=NAM_BU_RSV) -IF(LLES_MEAN .OR. LLES_RESOLVED .OR. LLES_SUBGRID .OR. LLES_UPDRAFT & -.OR. LLES_DOWNDRAFT .OR. LLES_SPECTRA) WRITE(UNIT=ILUSEG,NML=NAM_LES) -IF(LFORCING .OR. LTRANS) WRITE(UNIT=ILUSEG,NML=NAM_FRC) -IF(CCLOUD(1:3) == 'ICE') CALL PARAM_ICEN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1) -IF(CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') & - WRITE(UNIT=ILUSEG,NML=NAM_PARAM_C2R2) -IF(CCLOUD == 'C3R5' ) WRITE(UNIT=ILUSEG,NML=NAM_PARAM_C1R3) -IF(CCLOUD == 'LIMA' ) CALL PARAM_LIMA_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1) -IF(CELEC /= 'NONE') WRITE(UNIT=ILUSEG,NML=NAM_ELEC) -IF(LSERIES) WRITE(UNIT=ILUSEG,NML=NAM_SERIES) -IF(CTURB /= 'NONE') CALL TURBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1) -CALL NEBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1) -WRITE(UNIT=ILUSEG,NML=NAM_FLYERS) -!Not possible (for the moment): arrays have been deallocated after ini_aircraft: WRITE(UNIT=ILUSEG,NML=NAM_AIRCRAFTS) -!Not possible (for the moment): arrays have been deallocated after ini_balloon: WRITE(UNIT=ILUSEG,NML=NAM_BALLOONS) -! -! -! -!------------------------------------------------------------------------------- -! -!* 2. WRITE UPDATED DESFM ON OUTPUT LISTING -! ------------------------------------- -! -IF (NVERB >= 5) THEN -! - ILUOUT = TLUOUT%NLU -! - WRITE(UNIT=ILUOUT,FMT="(/,'DESCRIPTOR OF SEGMENT FOR MODEL ',I2)") KMI - WRITE(UNIT=ILUOUT,FMT="( '------------------------------- ' )") -! - WRITE(UNIT=ILUOUT,FMT="('********** LOGICAL UNITSn **********')") - WRITE(UNIT=ILUOUT,NML=NAM_LUNITn) -! - WRITE(UNIT=ILUOUT,FMT="('********** CONFIGURATIONn **********')") - WRITE(UNIT=ILUOUT,NML=NAM_CONFn) -! -! - WRITE(UNIT=ILUOUT,FMT="('********** DYNAMICn ****************')") - WRITE(UNIT=ILUOUT,NML=NAM_DYNn) -! - WRITE(UNIT=ILUOUT,FMT="('********** ADVECTIONn **************')") - WRITE(UNIT=ILUOUT,NML=NAM_ADVn) - ! - IF (LIBM_LSF) THEN - WRITE(UNIT=ILUOUT,FMT="('********** IBM_PARAMn **************')") - WRITE(UNIT=ILUOUT,NML=NAM_IBM_PARAMn) - ENDIF - ! - IF (LRECYCL) THEN - WRITE(UNIT=ILUOUT,FMT="('********** RECYCL_PARAMn **************')") - WRITE(UNIT=ILUOUT,NML=NAM_RECYCL_PARAMn) - ENDIF - ! - WRITE(UNIT=ILUOUT,FMT="('********** PARAMETERIZATIONSn ******')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAMn) -! - WRITE(UNIT=ILUOUT,FMT="('********** RADIATIONn **************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_RADn) -#ifdef MNH_ECRAD - WRITE(UNIT=ILUOUT,FMT="('********** ECRADn **************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_ECRADn) -#endif -! - WRITE(UNIT=ILUOUT,FMT="('********** CONVECTIONn *************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_KAFRn) -! - WRITE(UNIT=ILUOUT,FMT="('************ PARAM_MFSHALLn *******')") - CALL PARAM_MFSHALLN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) -! - WRITE(UNIT=ILUOUT,FMT="('********** LBCn ********************')") - WRITE(UNIT=ILUOUT,NML=NAM_LBCn) -! - WRITE(UNIT=ILUOUT,FMT="('********** NUDGINGn*****************')") - WRITE(UNIT=ILUOUT,NML=NAM_NUDGINGn) -! - WRITE(UNIT=ILUOUT,FMT="('********** TURBn *******************')") - CALL TURBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) -! - WRITE(UNIT=ILUOUT,FMT="('********** NEBn *******************')") - CALL NEBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) -! - WRITE(UNIT=ILUOUT,FMT="('********** CHEMICAL MONITORn *******')") - WRITE(UNIT=ILUOUT,NML=NAM_CH_MNHCn) -! - WRITE(UNIT=ILUOUT,FMT="('************ CHEMICAL SOLVERn ******************')") - WRITE(UNIT=ILUOUT,NML=NAM_CH_SOLVERn) -! - WRITE(UNIT=ILUOUT,FMT="('************ TEMPORAL SERIESn ******************')") - WRITE(UNIT=ILUOUT,NML=NAM_SERIESn) -! - WRITE(UNIT=ILUOUT,FMT="('********** BLOWING SNOW SCHEME ****************')") - WRITE(UNIT=ILUOUT,NML=NAM_BLOWSNOWn) -! - WRITE(UNIT=ILUOUT,FMT="('********** BLAZE *******************')") - WRITE(UNIT=ILUOUT,NML=NAM_FIREn) -! - WRITE(UNIT=ILUOUT,FMT="('********** BLANKn *****************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BLANKn) -! - WRITE(UNIT=ILUOUT,FMT="('************ ICE SCHEME ***********************')") - CALL PARAM_ICEN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) -! - IF (KMI==1) THEN - WRITE(UNIT=ILUOUT,FMT="(/,'PART OF SEGMENT FILE COMMON TO ALL THE MODELS')") - WRITE(UNIT=ILUOUT,FMT="( '---------------------------------------------')") -! - WRITE(UNIT=ILUOUT,FMT="('************ CONFIGURATION ********************')") - WRITE(UNIT=ILUOUT,NML=NAM_CONF) -! - WRITE(UNIT=ILUOUT,FMT="('************ DYNAMIC **************************')") - WRITE(UNIT=ILUOUT,NML=NAM_DYN) -! - WRITE(UNIT=ILUOUT,FMT="(/,'********** NESTING **************************')") - WRITE(UNIT=ILUOUT,NML=NAM_NESTING) -! -! WRITE(UNIT=ILUOUT,FMT="(/,'********** BACKUP ***************************')") -! WRITE(UNIT=ILUOUT,NML=NAM_BACKUP) -! -! WRITE(UNIT=ILUOUT,FMT="(/,'********** OUTPUT ***************************')") -! WRITE(UNIT=ILUOUT,NML=NAM_OUTPUT) -! - WRITE(UNIT=ILUOUT,FMT="('************ BUDGET ***************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BUDGET) -! - IF ( .NOT. ALLOCATED( CBULIST_RU ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RU(0) ) - WRITE(UNIT=ILUOUT,FMT="('************ U BUDGET *************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RU) -! - IF ( .NOT. ALLOCATED( CBULIST_RV ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RV(0) ) - WRITE(UNIT=ILUOUT,FMT="('************ V BUDGET *************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RV) -! - IF ( .NOT. ALLOCATED( CBULIST_RW ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RW(0) ) - WRITE(UNIT=ILUOUT,FMT="('************ W BUDGET *************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RW) -! - IF ( .NOT. ALLOCATED( CBULIST_RTH ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTH(0) ) - WRITE(UNIT=ILUOUT,FMT="('************ TH BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RTH) -! - IF ( .NOT. ALLOCATED( CBULIST_RTKE ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTKE(0) ) - WRITE(UNIT=ILUOUT,FMT="('************ TKE BUDGET ***********************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RTKE) -! - IF ( .NOT. ALLOCATED( CBULIST_RRV ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRV(0) ) - WRITE(UNIT=ILUOUT,FMT="('************ RV BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RRV) -! - IF ( .NOT. ALLOCATED( CBULIST_RRC ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRC(0) ) - WRITE(UNIT=ILUOUT,FMT="('************ RC BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RRC) -! - IF ( .NOT. ALLOCATED( CBULIST_RRR ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRR(0) ) - WRITE(UNIT=ILUOUT,FMT="('************ RR BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RRR) -! - IF ( .NOT. ALLOCATED( CBULIST_RRI ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRI(0) ) - WRITE(UNIT=ILUOUT,FMT="('************ RI BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RRI) -! - IF ( .NOT. ALLOCATED( CBULIST_RRS ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRS(0) ) - WRITE(UNIT=ILUOUT,FMT="('************ RS BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RRS) -! - IF ( .NOT. ALLOCATED( CBULIST_RRG ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRG(0) ) - WRITE(UNIT=ILUOUT,FMT="('************ RG BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RRG) -! - IF ( .NOT. ALLOCATED( CBULIST_RRH ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRH(0) ) - WRITE(UNIT=ILUOUT,FMT="('************ RH BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RRH) -! - IF ( .NOT. ALLOCATED( CBULIST_RSV ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RSV(0) ) - WRITE(UNIT=ILUOUT,FMT="('************ SVx BUDGET ***********************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RSV) -! - WRITE(UNIT=ILUOUT,FMT="('************ LES ******************************')") - WRITE(UNIT=ILUOUT,NML=NAM_LES) -! - WRITE(UNIT=ILUOUT,FMT="('************ FORCING **************************')") - WRITE(UNIT=ILUOUT,NML=NAM_FRC) -! - WRITE(UNIT=ILUOUT,FMT="('********** DUST SCHEME ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_DUST) -! - WRITE(UNIT=ILUOUT,FMT="('********** PASPOL *****************************')") - WRITE(UNIT=ILUOUT,NML=NAM_PASPOL) -! -#ifdef MNH_FOREFIRE - WRITE(UNIT=ILUOUT,FMT="('********** FOREFIRE *****************************')") - WRITE(UNIT=ILUOUT,NML=NAM_FOREFIRE) -! -#endif -! - WRITE(UNIT=ILUOUT,FMT="('********** CONDSAMP****************************')") - WRITE(UNIT=ILUOUT,NML=NAM_CONDSAMP) -! - WRITE(UNIT=ILUOUT,FMT="('********** SALT SCHEME ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_SALT) -! - WRITE(UNIT=ILUOUT,FMT="('********** BLOWING SNOW SCHEME ****************')") - WRITE(UNIT=ILUOUT,NML=NAM_BLOWSNOW) -! - WRITE(UNIT=ILUOUT,FMT="('************ ORILAM SCHEME ********************')") - WRITE(UNIT=ILUOUT,NML=NAM_CH_ORILAM) -! - IF( CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5') THEN - WRITE(UNIT=ILUOUT,FMT="('*********** C2R2 SCHEME *********************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_C2R2) - IF( CCLOUD == 'C3R5' ) THEN - WRITE(UNIT=ILUOUT,FMT="('*********** C1R3 SCHEME *********************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_C1R3) - END IF - END IF -! - IF( CCLOUD == 'LIMA' ) THEN - WRITE(UNIT=ILUOUT,FMT="('*********** LIMA SCHEME *********************')") - CALL PARAM_LIMA_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2) - END IF -! - IF( CCLOUD == 'KHKO' ) THEN - WRITE(UNIT=ILUOUT,FMT="('*********** KHKO SCHEME *********************')") - WRITE(UNIT=ILUOUT,NML=NAM_PARAM_C2R2) - END IF -! - IF( CELEC /= 'NONE' ) THEN - WRITE(UNIT=ILUOUT,FMT="('*********** ELEC SCHEME *********************')") - WRITE(UNIT=ILUOUT,NML=NAM_ELEC) - END IF -! - WRITE(UNIT=ILUOUT,FMT="('************ TEMPORAL SERIES ****************')") - WRITE(UNIT=ILUOUT,NML=NAM_SERIES) -! - WRITE(UNIT=ILUOUT,FMT="('************ MIXING LENGTH FOR CLOUD ***********')") - WRITE(UNIT=ILUOUT,NML=NAM_TURB_CLOUD) -! - END IF -! -END IF -! -IF (CPROGRAM /='MESONH') THEN !return to previous LHORELAX_ - LHORELAX_UVWTH = GHORELAX_UVWTH - LHORELAX_RV = GHORELAX_RV - LHORELAX_RC = GHORELAX_RC - LHORELAX_RR = GHORELAX_RR - LHORELAX_RI = GHORELAX_RI - LHORELAX_RS = GHORELAX_RS - LHORELAX_RG = GHORELAX_RG - LHORELAX_TKE = GHORELAX_TKE - LHORELAX_SV(:) = GHORELAX_SV(:) - LHORELAX_SVC2R2= GHORELAX_SVC2R2 - LHORELAX_SVC1R3= GHORELAX_SVC1R3 - LHORELAX_SVLIMA= GHORELAX_SVLIMA - LHORELAX_SVELEC= GHORELAX_SVELEC - LHORELAX_SVCHEM= GHORELAX_SVCHEM - LHORELAX_SVCHIC= GHORELAX_SVCHIC - LHORELAX_SVLG = .FALSE. - LHORELAX_SVDST = GHORELAX_SVDST - LHORELAX_SVSLT = GHORELAX_SVSLT - LHORELAX_SVPP = GHORELAX_SVPP - LHORELAX_SVFIRE = GHORELAX_SVFIRE -#ifdef MNH_FOREFIRE - LHORELAX_SVFF = GHORELAX_SVFF -#endif - LHORELAX_SVCS = GHORELAX_SVCS - LHORELAX_SVAER = GHORELAX_SVAER - LHORELAX_SVSNW = GHORELAX_SVSNW -ELSE - LHORELAX_SV(:) = GHORELAX_SV(:) -ENDIF -CALL UPDATE_NAM_DYNn -!------------------------------------------------------------------------------ -! -END SUBROUTINE WRITE_DESFM_n diff --git a/src/PHYEX/ext/write_lesn.f90 b/src/PHYEX/ext/write_lesn.f90 deleted file mode 100644 index 44f915343..000000000 --- a/src/PHYEX/ext/write_lesn.f90 +++ /dev/null @@ -1,1319 +0,0 @@ -!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!###################### -module mode_write_les_n -!###################### - -use modd_field, only: tfieldmetadata_base - -implicit none - -private - -public :: Write_les_n - - -character(len=:), allocatable :: cgroup -character(len=:), allocatable :: cgroupcomment - -logical :: ldoavg ! Compute and store time average -logical :: ldonorm ! Compute and store normalized field - -type(tfieldmetadata_base) :: tfield -type(tfieldmetadata_base) :: tfieldx -type(tfieldmetadata_base) :: tfieldy - -interface Les_diachro_write - module procedure Les_diachro_write_1D, Les_diachro_write_2D, Les_diachro_write_3D, Les_diachro_write_4D -end interface - -contains - -!################################### -subroutine Write_les_n( tpdiafile ) -!################################### -! -! -!!**** *WRITE_LES_n* writes the LES final diagnostics for model _n -!! -!! -!! PURPOSE -!! ------- -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/02/00 -!! 01/02/01 (D. Gazen) add module MODD_NSV for NSV variable -!! 06/11/02 (V. Masson) some minor bugs -!! 01/04/03 (V. Masson) idem -!! 10/10/09 (P. Aumond) Add user multimaskS -!! 11/15 (C.Lac) Add production terms of TKE -!! 10/2016 (C.Lac) Add droplet deposition -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! C. Lac 02/2019: add rain fraction as a LES diagnostic -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! P. Wautelet 12/10/2020: remove HLES_AVG dummy argument and group all 4 calls -! P. Wautelet 13/10/2020: bugfix: correct some names for LES_DIACHRO_2PT diagnostics (Ri) -! P. Wautelet 26/10/2020: bugfix: correct some comments and conditions + add missing RES_RTPZ -! P. Wautelet 26/10/2020: restructure subroutines to use tfieldmetadata_base type -! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -use modd_conf_n, only: luserv, luserc, luserr, luseri, lusers, luserg, luserh -use modd_io, only: tfiledata -use modd_field, only: NMNHDIM_BUDGET_LES_TIME, NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_SV, NMNHDIM_BUDGET_LES_MASK, & - NMNHDIM_BUDGET_LES_PDF, & - NMNHDIM_SPECTRA_2PTS_NI, NMNHDIM_SPECTRA_2PTS_NJ, NMNHDIM_SPECTRA_LEVEL, NMNHDIM_UNUSED, & - TYPEREAL -use modd_grid_n, only: xdxhat, xdyhat -use modd_nsv, only: nsv -use modd_les -use modd_les_n -use modd_param_n, only: ccloud -use modd_param_c2r2, only: ldepoc -USE MODD_PARAM_ICE_n, only: ldeposc -use modd_parameters, only: XUNDEF - -use mode_les_spec_n, only: Les_spec_n -use mode_modeln_handler, only: Get_current_model_index -use mode_write_les_budget_n, only: Write_les_budget_n -use mode_write_les_rt_budget_n, only: Write_les_rt_budget_n -use mode_write_les_sv_budget_n, only: Write_les_sv_budget_n - -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE! file to write -! -! -!* 0.2 declaration of local variables -! -INTEGER :: IMASK -! -INTEGER :: JSV ! scalar loop counter -INTEGER :: JI ! loop counter -! -character(len=3) :: ynum -CHARACTER(len=5) :: YGROUP -character(len=7), dimension(nles_masks) :: ymasks -! -logical :: gdoavg ! Compute and store time average -logical :: gdonorm ! Compute and store normalized field -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZAVG_PTS_ll -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZUND_PTS_ll -REAL :: ZCART_PTS_ll -INTEGER :: IMI ! Current model inde -! -!------------------------------------------------------------------------------- -! -IF (.NOT. LLES) RETURN -! -! -!* 1. Initializations -! --------------- -! -IMI = GET_CURRENT_MODEL_INDEX() -! -! -!* 1.1 Normalization variables -! ----------------------- -! -IF (CLES_NORM_TYPE/='NONE' ) THEN - CALL LES_ALLOCATE('XLES_NORM_M', (/NLES_TIMES/)) - CALL LES_ALLOCATE('XLES_NORM_S', (/NLES_TIMES/)) - CALL LES_ALLOCATE('XLES_NORM_K', (/NLES_TIMES/)) - CALL LES_ALLOCATE('XLES_NORM_RHO',(/NLES_TIMES/)) - CALL LES_ALLOCATE('XLES_NORM_RV', (/NLES_TIMES/)) - CALL LES_ALLOCATE('XLES_NORM_SV', (/NLES_TIMES,NSV/)) - CALL LES_ALLOCATE('XLES_NORM_P', (/NLES_TIMES/)) - ! - IF (CLES_NORM_TYPE=='CONV') THEN - WHERE (XLES_WSTAR(:)>0.) - XLES_NORM_M(:) = XLES_BL_HEIGHT(:) - XLES_NORM_S(:) = XLES_NORM_M(:) / XLES_WSTAR(:) - XLES_NORM_K(:) = XLES_Q0(:) / XLES_WSTAR(:) - XLES_NORM_RHO(:) = XLES_MEAN_RHO(1,:,1) - XLES_NORM_RV(:) = XLES_E0(:) / XLES_WSTAR(:) - XLES_NORM_P(:) = XLES_MEAN_RHO(1,:,1) * XLES_WSTAR(:)**2 - ELSEWHERE - XLES_NORM_M(:) = 0. - XLES_NORM_S(:) = 0. - XLES_NORM_K(:) = 0. - XLES_NORM_RHO(:) = 0. - XLES_NORM_RV(:) = 0. - XLES_NORM_P(:) = 0. - END WHERE - DO JSV=1,NSV - WHERE (XLES_WSTAR(:)>0.) - XLES_NORM_SV(:,JSV)= XLES_SV0(:,JSV) / XLES_WSTAR(:) - ELSEWHERE - XLES_NORM_SV(:,JSV)= 0. - END WHERE - END DO - ELSE IF (CLES_NORM_TYPE=='EKMA') THEN - WHERE (XLES_USTAR(:)>0.) - XLES_NORM_M(:) = XLES_BL_HEIGHT(:) - XLES_NORM_S(:) = XLES_NORM_M(:) / XLES_USTAR(:) - XLES_NORM_K(:) = XLES_Q0(:) / XLES_USTAR(:) - XLES_NORM_RHO(:) = XLES_MEAN_RHO(1,:,1) - XLES_NORM_RV(:) = XLES_E0(:) / XLES_USTAR(:) - XLES_NORM_P(:) = XLES_MEAN_RHO(1,:,1) * XLES_USTAR(:)**2 - ELSEWHERE - XLES_NORM_M(:) = 0. - XLES_NORM_S(:) = 0. - XLES_NORM_K(:) = 0. - XLES_NORM_RHO(:) = 0. - XLES_NORM_RV(:) = 0. - XLES_NORM_P(:) = 0. - END WHERE - DO JSV=1,NSV - WHERE (XLES_USTAR(:)>0.) - XLES_NORM_SV(:,JSV)= XLES_SV0(:,JSV) / XLES_USTAR(:) - ELSEWHERE - XLES_NORM_SV(:,JSV)= 0. - END WHERE - END DO - ELSE IF (CLES_NORM_TYPE=='MOBU') THEN - XLES_NORM_M(:) = XLES_MO_LENGTH(:) - WHERE (XLES_USTAR(:)>0.) - XLES_NORM_S(:) = XLES_NORM_M(:) / XLES_USTAR(:) - XLES_NORM_K(:) = XLES_Q0(:) / XLES_USTAR(:) - XLES_NORM_RHO(:) = XLES_MEAN_RHO(1,:,1) - XLES_NORM_RV(:) = XLES_E0(:) / XLES_USTAR(:) - XLES_NORM_P(:) = XLES_MEAN_RHO(1,:,1) * XLES_USTAR(:)**2 - ELSEWHERE - XLES_NORM_S(:) = 0. - XLES_NORM_K(:) = 0. - XLES_NORM_RHO(:) = 0. - XLES_NORM_RV(:) = 0. - XLES_NORM_P(:) = 0. - END WHERE - DO JSV=1,NSV - WHERE (XLES_USTAR(:)>0.) - XLES_NORM_SV(:,JSV)= XLES_SV0(:,JSV) / XLES_USTAR(:) - ELSEWHERE - XLES_NORM_SV(:,JSV)= 0. - END WHERE - END DO - END IF -END IF -! -!* 1.2 Initializations for WRITE_DIACHRO -! --------------------------------- -! -NLES_CURRENT_TIMES=NLES_TIMES -! -CALL LES_ALLOCATE('XLES_CURRENT_Z',(/NLES_K/)) - -XLES_CURRENT_Z(:) = XLES_Z(:) -! -XLES_CURRENT_ZS = XLES_ZS -! -NLES_CURRENT_IINF=NLESn_IINF(IMI) -NLES_CURRENT_ISUP=NLESn_ISUP(IMI) -NLES_CURRENT_JINF=NLESn_JINF(IMI) -NLES_CURRENT_JSUP=NLESn_JSUP(IMI) -! -XLES_CURRENT_DOMEGAX=XDXHAT(1) -XLES_CURRENT_DOMEGAY=XDYHAT(1) - -tfield%ngrid = 0 !Not on the Arakawa grid -tfield%ntype = TYPEREAL -! -!* 2. (z,t) profiles (all masks) -! -------------- -IMASK = 1 -ymasks(imask) = 'cart' -IF (LLES_NEB_MASK) THEN - IMASK=IMASK+1 - ymasks(imask) = 'neb' - IMASK=IMASK+1 - ymasks(imask) = 'clear' -END IF -IF (LLES_CORE_MASK) THEN - IMASK=IMASK+1 - ymasks(imask) = 'core' - IMASK=IMASK+1 - ymasks(imask) = 'env' -END IF -IF (LLES_MY_MASK) THEN - DO JI=1,NLES_MASKS_USER - IMASK=IMASK+1 - Write( ynum, '( i3.3 )' ) ji - ymasks(imask) = 'user' // ynum - END DO -END IF -IF (LLES_CS_MASK) THEN - IMASK=IMASK+1 - ymasks(imask) = 'cs1' - IMASK=IMASK+1 - ymasks(imask) = 'cs2' - IMASK=IMASK+1 - ymasks(imask) = 'cs3' -END IF -! -!* 2.0 averaging diagnostics -! --------------------- -! -ALLOCATE(ZAVG_PTS_ll (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(ZUND_PTS_ll (NLES_K,NLES_TIMES,NLES_MASKS)) - -ZAVG_PTS_ll(:,:,:) = NLES_AVG_PTS_ll(:,:,:) -ZUND_PTS_ll(:,:,:) = NLES_UND_PTS_ll(:,:,:) -ZCART_PTS_ll = (NLESn_ISUP(IMI)-NLESn_IINF(IMI)+1) * (NLESn_JSUP(IMI)-NLESn_JINF(IMI)+1) - -tfield%ndims = 3 -tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL -tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME -tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK -tfield%ndimlist(4:) = NMNHDIM_UNUSED - -ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF -ldonorm = .false. - -cgroup = 'Miscellaneous' -cgroupcomment = 'Miscellaneous terms (geometry, various unclassified averaged terms...)' - -call Les_diachro_write( tpdiafile, zavg_pts_ll, 'AVG_PTS', 'number of points used for averaging', '1', ymasks ) -call Les_diachro_write( tpdiafile, zavg_pts_ll / zcart_pts_ll, 'AVG_PTSF', 'fraction of points used for averaging', '1', ymasks ) -call Les_diachro_write( tpdiafile, zund_pts_ll, 'UND_PTS', 'number of points below orography', '1', ymasks ) -call Les_diachro_write( tpdiafile, zund_pts_ll / zcart_pts_ll, 'UND_PTSF', 'fraction of points below orography', '1', ymasks ) - -DEALLOCATE(ZAVG_PTS_ll) -DEALLOCATE(ZUND_PTS_ll) -! -!* 2.1 mean quantities -! --------------- -! -cgroup = 'Mean' -cgroupcomment = 'Mean vertical profiles of the model variables' - -tfield%ndims = 3 -tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL -tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME -tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK -tfield%ndimlist(4:) = NMNHDIM_UNUSED - -ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF -ldonorm = trim(cles_norm_type) /= 'NONE' - -call Les_diachro_write( tpdiafile, XLES_MEAN_U, 'MEAN_U', 'Mean U Profile', 'm s-1', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_V, 'MEAN_V', 'Mean V Profile', 'm s-1', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_W, 'MEAN_W', 'Mean W Profile', 'm s-1', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_P, 'MEAN_PRE', 'Mean pressure Profile', 'Pa', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_DP, 'MEAN_DP', 'Mean Dyn production TKE Profile', 'm2 s-3', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_TP, 'MEAN_TP', 'Mean Thermal production TKE Profile', 'm2 s-3', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_TR, 'MEAN_TR', 'Mean transport production TKE Profile', 'm2 s-3', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_DISS, 'MEAN_DISS', 'Mean Dissipation TKE Profile', 'm2 s-3', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_LM, 'MEAN_LM', 'Mean mixing length Profile', 'm', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_RHO, 'MEAN_RHO', 'Mean density Profile', 'kg m-3', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_Th, 'MEAN_TH', 'Mean potential temperature Profile', 'K', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_Mf, 'MEAN_MF', 'Mass-flux Profile', 'm s-1', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Thl, 'MEAN_THL', 'Mean liquid potential temperature Profile', 'K', ymasks ) -if ( luserv ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Thv, 'MEAN_THV', 'Mean virtual potential temperature Profile', 'K', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rt, 'MEAN_RT', 'Mean Rt Profile', 'kg kg-1', ymasks ) -if ( luserv ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rv, 'MEAN_RV', 'Mean Rv Profile', 'kg kg-1', ymasks ) -if ( luserv ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rehu, 'MEAN_REHU', 'Mean Rh Profile', 'percent', ymasks ) -if ( luserv ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Qs, 'MEAN_QS', 'Mean Qs Profile', 'kg kg-1', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_KHt, 'MEAN_KHT', 'Eddy-diffusivity (temperature) Profile', 'm2 s-1', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_KHr, 'MEAN_KHR', 'Eddy-diffusivity (vapor) Profile', 'm2 s-1', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rc, 'MEAN_RC', 'Mean Rc Profile', 'kg kg-1', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Cf, 'MEAN_CF', 'Mean Cf Profile', '1', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_INDCf, 'MEAN_INDCF', 'Mean Cf>1-6 Profile (0 or 1)', '1', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_INDCf2, 'MEAN_INDCF2', 'Mean Cf>1-5 Profile (0 or 1)', '1', ymasks ) -if ( luserr ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rr, 'MEAN_RR', 'Mean Rr Profile', 'kg kg-1', ymasks ) -if ( luserr ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_RF, 'MEAN_RF', 'Mean RF Profile', '1', ymasks ) -if ( luseri ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Ri, 'MEAN_RI', 'Mean Ri Profile', 'kg kg-1', ymasks ) -if ( luseri ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_If, 'MEAN_IF', 'Mean If Profile', '1', ymasks ) -if ( lusers ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rs, 'MEAN_RS', 'Mean Rs Profile', 'kg kg-1', ymasks ) -if ( luserg ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rg, 'MEAN_RG', 'Mean Rg Profile', 'kg kg-1', ymasks ) -if ( luserh ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rh, 'MEAN_RH', 'Mean Rh Profile', 'kg kg-1', ymasks ) - -if ( nsv > 0 ) then - tfield%ndims = 4 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(5:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_MEAN_Sv, 'MEAN_SV', 'Mean Sv Profiles', 'kg kg-1', ymasks ) - - tfield%ndims = 3 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - !tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_UNUSED - !tfield%ndimlist(5:) = NMNHDIM_UNUSED -end if - -call Les_diachro_write( tpdiafile, XLES_MEAN_WIND, 'MEANWIND', 'Profile of Mean Modulus of Wind', 'm s-1', ymasks ) -call Les_diachro_write( tpdiafile, XLES_RESOLVED_MASSFX, 'MEANMSFX', 'Total updraft mass flux', 'kg m-2 s-1', ymasks ) - -if ( lles_pdf ) then - cgroup = 'PDF' - cgroupcomment = '' - - tfield%ndims = 4 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - !tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_BUDGET_LES_PDF - tfield%ndimlist(5:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_PDF_TH, 'PDF_TH', 'Pdf potential temperature Profiles', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_PDF_W, 'PDF_W', 'Pdf vertical velocity Profiles', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_PDF_THV, 'PDF_THV', 'Pdf virtual pot. temp. Profiles', '1', ymasks ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_PDF_RV, 'PDF_RV', 'Pdf Rv Profiles', '1', ymasks ) - if ( luserc ) then - call Les_diachro_write( tpdiafile, XLES_PDF_RC, 'PDF_RC', 'Pdf Rc Profiles', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_PDF_RT, 'PDF_RT', 'Pdf Rt Profiles', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_PDF_THL, 'PDF_THL', 'Pdf Thl Profiles', '1', ymasks ) - end if - if ( luserr ) & - call Les_diachro_write( tpdiafile, XLES_PDF_RR, 'PDF_RR', 'Pdf Rr Profiles', '1', ymasks ) - if ( luseri ) & - call Les_diachro_write( tpdiafile, XLES_PDF_RI, 'PDF_RI', 'Pdf Ri Profiles', '1', ymasks ) - if ( lusers ) & - call Les_diachro_write( tpdiafile, XLES_PDF_RS, 'PDF_RS', 'Pdf Rs Profiles', '1', ymasks ) - if ( luserg ) & - call Les_diachro_write( tpdiafile, XLES_PDF_RG, 'PDF_RG', 'Pdf Rg Profiles', '1', ymasks ) -end if -! -!* 2.2 resolved quantities -! ------------------- -! -if ( lles_resolved ) then - !Prepare metadata (used in Les_diachro_write calls) - ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF - ldonorm = trim(cles_norm_type) /= 'NONE' - - cgroup = 'Resolved' - cgroupcomment = 'Mean vertical profiles of the resolved fluxes, variances and covariances' - - tfield%ndims = 3 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_U2, 'RES_U2', 'Resolved <u2> variance', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_V2, 'RES_V2', 'Resolved <v2> variance', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2, 'RES_W2', 'Resolved <w2> variance', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_UV, 'RES_UV', 'Resolved <uv> Flux', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WU, 'RES_WU', 'Resolved <wu> Flux', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WV, 'RES_WV', 'Resolved <wv> Flux', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Ke, 'RES_KE', 'Resolved TKE Profile', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_P2, 'RES_P2', 'Resolved pressure variance', 'Pa2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_UP, 'RES_UPZ', 'Resolved <up> horizontal Flux', 'Pa s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VP, 'RES_VPZ', 'Resolved <vp> horizontal Flux', 'Pa s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WP, 'RES_WPZ', 'Resolved <wp> vertical Flux', 'Pa s-1', ymasks ) - - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThThv, 'RES_THTV', & - 'Resolved potential temperature - virtual potential temperature covariance', 'K2', ymasks ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlThv, 'RES_TLTV', & - 'Resolved liquid potential temperature - virtual potential temperature covariance', 'K2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Th2, 'RES_TH2', 'Resolved potential temperature variance', 'K2', ymasks ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Thl2, 'RES_THL2', 'Resolved liquid potential temperature variance', 'K2',& - ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_UTh, 'RES_UTH', 'Resolved <uth> horizontal Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VTh, 'RES_VTH', 'Resolved <vth> horizontal Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WTh, 'RES_WTH', 'Resolved <wth> vertical Flux', 'm K s-1', ymasks ) - - if ( luserc ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_UThl, 'RES_UTHL', 'Resolved <uthl> horizontal Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VThl, 'RES_VTHL', 'Resolved <vthl> horizontal Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThl, 'RES_WTHL', 'Resolved <wthl> vertical Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Rt2, 'RES_RT2', 'Resolved total water variance', 'kg2 kg-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRt, 'RES_WRT', 'Resolved <wrt> vertical Flux', 'm kg kg-1 s-1', ymasks ) - end if - - if ( luserv ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_UThv, 'RES_UTHV', 'Resolved <uthv> horizontal Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VThv, 'RES_VTHV', 'Resolved <vthv> horizontal Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThv, 'RES_WTHV', 'Resolved <wthv> vertical Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Rv2, 'RES_RV2', 'Resolved water vapor variance', 'kg2 kg-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThRv, 'RES_THRV', 'Resolved <thrv> covariance', 'K kg kg-1', ymasks ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlRv, 'RES_TLRV', 'Resolved <thlrv> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThvRv, 'RES_TVRV', 'Resolved <thvrv> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_URv, 'RES_URV', 'Resolved <urv> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VRv, 'RES_VRV', 'Resolved <vrv> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRv, 'RES_WRV', 'Resolved <wrv> vertical flux', 'm kg kg-1 s-1', ymasks ) - end if - - if ( luserc ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Rc2, 'RES_RC2', 'Resolved cloud water variance', 'kg2 kg-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThRc, 'RES_THRC', 'Resolved <thrc> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlRc, 'RES_TLRC', 'Resolved <thlrc> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThvRc, 'RES_TVRC', 'Resolved <thvrc> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_URc, 'RES_URC', 'Resolved <urc> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VRc, 'RES_VRC', 'Resolved <vrc> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRc, 'RES_WRC', 'Resolved <wrc> vertical flux', 'm kg kg-1 s-1', ymasks ) - end if - - if ( luseri ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Ri2, 'RES_RI2', 'Resolved cloud ice variance', 'kg2 kg-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThRi, 'RES_THRI', 'Resolved <thri> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlRi, 'RES_TLRI', 'Resolved <thlri> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThvRi, 'RES_TVRI', 'Resolved <thvri> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_URi, 'RES_URI', 'Resolved <uri> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VRi, 'RES_VRI', 'Resolved <vri> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRi, 'RES_WRI', 'Resolved <wri> vertical flux', 'm kg kg-1 s-1', ymasks ) - end if - - if ( luserr ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRr, 'RES_WRR', 'Resolved <wrr> vertical flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_INPRR3D, 'INPRR3D', 'Precipitation flux', 'm s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_MAX_INPRR3D, 'MAXINPR3D', 'Max Precip flux', 'm s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_EVAP3D, 'EVAP3D', 'Evaporation profile', 'kg kg-1 s-1', ymasks ) - end if - - if ( nsv > 0 ) then - tfield%ndims = 4 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(5:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Sv2, 'RES_SV2', 'Resolved scalar variables variances', 'kg2 kg-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThSv, 'RES_THSV', 'Resolved <ThSv> variance', 'K kg kg-1', ymasks ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlSv, 'RES_TLSV', 'Resolved <ThlSv> variance', 'K kg kg-1', ymasks ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThvSv, 'RES_TVSV', 'Resolved <ThvSv> variance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_USv, 'RES_USV', 'Resolved <uSv> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VSv, 'RES_VSV', 'Resolved <vSv> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WSv, 'RES_WSV', 'Resolved <wSv> vertical flux', 'm kg kg-1 s-1', ymasks ) - - tfield%ndims = 3 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - !tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_UNUSED - !tfield%ndimlist(5:) = NMNHDIM_UNUSED - end if - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_U3, 'RES_U3', 'Resolved <u3>', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_V3, 'RES_V3', 'Resolved <v3>', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W3, 'RES_W3', 'Resolved <w3>', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_U4, 'RES_U4', 'Resolved <u4>', 'm4 s-4', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_V4, 'RES_V4', 'Resolved <v4>', 'm4 s-4', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W4, 'RES_W4', 'Resolved <w4>', 'm4 s-4', ymasks ) - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThl2, 'RES_WTL2', 'Resolved <wThl2>', 'm K2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Thl, 'RES_W2TL', 'Resolved <w2Thl>', 'm2 K s-2', ymasks ) - - if ( luserv ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRv2, 'RES_WRV2', 'Resolved <wRv2>', 'm kg2 kg-2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Rv, 'RES_W2RV', 'Resolved <w2Rv>', 'm2 kg kg-1 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRt2, 'RES_WRT2', 'Resolved <wRt2>', 'm kg2 kg-2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Rt, 'RES_W2RT', 'Resolved <w2Rt>', 'm2 kg kg-1 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlRv, 'RE_WTLRV', 'Resolved <wThlRv>', 'm K kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlRt, 'RE_WTLRT', 'Resolved <wThlRt>', 'm K kg kg-1 s-1', ymasks ) - end if - - if ( luserc ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRc2, 'RES_WRC2', 'Resolved <wRc2>', 'm kg2 kg-2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Rc, 'RES_W2RC', 'Resolved <w2Rc>', 'm2 kg kg-1 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlRc, 'RE_WTLRC', 'Resolved <wThlRc>', 'm K kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRvRc, 'RE_WRVRC', 'Resolved <wRvRc>', 'm kg2 kg-2 s-1', ymasks ) - end if - - if ( luseri ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRi2, 'RES_WRI2', 'Resolved <wRi2>', 'm kg2 kg-2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Ri, 'RES_W2RI', 'Resolved <w2Ri>', 'm2 kg kg-1 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlRi, 'RE_WTLRI', 'Resolved <wThlRi>', 'm K kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRvRi, 'RE_WRVRI', 'Resolved <wRvRi>', 'm kg2 kg-2 s-1', ymasks ) - end if - - if ( nsv > 0 ) then - tfield%ndims = 4 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(5:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WSv2, 'RES_WSV2', 'Resolved <wSv2>', 'm kg2 kg-2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Sv, 'RES_W2SV', 'Resolved <w2Sv>', 'm2 kg kg-1 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlSv, 'RE_WTLSV', 'Resolved <wThlSv>', 'm K kg kg-1 s-1', ymasks ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRvSv, 'RE_WRVSV', 'Resolved <wRvSv>', 'm kg2 kg-2 s-1', ymasks ) - - tfield%ndims = 3 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - !tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_UNUSED - !tfield%ndimlist(5:) = NMNHDIM_UNUSED - end if - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlPz, 'RES_TLPZ', 'Resolved <Thldp/dz>', 'K Pa m-1', ymasks ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_RtPz, 'RES_RTPZ', 'Resolved <Rtdp/dz>', 'kg2 kg-2 Pa m-1', ymasks ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_RvPz, 'RES_RVPZ', 'Resolved <Rvdp/dz>', 'kg2 kg-2 Pa m-1', ymasks ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_RcPz, 'RES_RCPZ', 'Resolved <Rcdp/dz>', 'kg2 kg-2 Pa m-1', ymasks ) - if ( luseri ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_RiPz, 'RES_RIPZ', 'Resolved <Ridp/dz>', 'kg2 kg-2 Pa m-1', ymasks ) - - if ( nsv > 0 ) then - tfield%ndims = 4 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(5:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_SvPz, 'RES_SVPZ', 'Resolved <Svdp/dz>', 'kg2 kg-2 Pa m-1', ymasks ) - - tfield%ndims = 3 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - !tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_UNUSED - !tfield%ndimlist(5:) = NMNHDIM_UNUSED - end if - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_UKe, 'RES_UKE', 'Resolved flux of resolved kinetic energy', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VKe, 'RES_VKE', 'Resolved flux of resolved kinetic energy', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WKe, 'RES_WKE', 'Resolved flux of resolved kinetic energy', 'm3 s-3', ymasks ) -end if -! -! -!* 2.3 subgrid quantities -! ------------------ -! -if ( lles_subgrid ) then - !Prepare metadata (used in Les_diachro_write calls) - ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF - ldonorm = trim(cles_norm_type) /= 'NONE' - - cgroup = 'Subgrid' - cgroupcomment = 'Mean vertical profiles of the subgrid fluxes, variances and covariances' - - tfield%ndims = 3 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_SUBGRID_Tke, 'SBG_TKE', 'Subgrid TKE', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_U2, 'SBG_U2', 'Subgrid <u2> variance', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_V2, 'SBG_V2', 'Subgrid <v2> variance', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_W2, 'SBG_W2', 'Subgrid <w2> variance', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_UV, 'SBG_UV', 'Subgrid <uv> flux', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WU, 'SBG_WU', 'Subgrid <wu> flux', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WV, 'SBG_WV', 'Subgrid <wv> flux', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_Thl2, 'SBG_THL2', 'Subgrid liquid potential temperature variance', & - 'K2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_UThl, 'SBG_UTHL', 'Subgrid horizontal flux of liquid potential temperature', & - 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_VThl, 'SBG_VTHL', 'Subgrid horizontal flux of liquid potential temperature', & - 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WThl, 'SBG_WTHL', 'Subgrid vertical flux of liquid potential temperature', & - 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WP, 'SBG_WP', 'Subgrid <wp> vertical Flux', 'm Pa s-1', ymasks ) - - call Les_diachro_write( tpdiafile, XLES_SUBGRID_THLUP_MF, 'THLUP_MF', 'Subgrid <thl> of updraft', 'K', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_RTUP_MF, 'RTUP_MF', 'Subgrid <rt> of updraft', 'kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_RVUP_MF, 'RVUP_MF', 'Subgrid <rv> of updraft', 'kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_RCUP_MF, 'RCUP_MF', 'Subgrid <rc> of updraft', 'kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_RIUP_MF, 'RIUP_MF', 'Subgrid <ri> of updraft', 'kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WUP_MF, 'WUP_MF', 'Subgrid <w> of updraft', 'm s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_MASSFLUX, 'MAFLX_MF', 'Subgrid <MF> of updraft', 'kg m-2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_DETR, 'DETR_MF', 'Subgrid <detr> of updraft', 'kg m-3 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_ENTR, 'ENTR_MF', 'Subgrid <entr> of updraft', 'kg m-3 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_FRACUP, 'FRCUP_MF', 'Subgrid <FracUp> of updraft', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_THVUP_MF, 'THVUP_MF', 'Subgrid <thv> of updraft', 'K', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WTHLMF, 'WTHL_MF', 'Subgrid <wthl> of mass flux convection scheme', & - 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WRTMF, 'WRT_MF', 'Subgrid <wrt> of mass flux convection scheme', & - 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WTHVMF, 'WTHV_MF', 'Subgrid <wthv> of mass flux convection scheme', & - 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WUMF, 'WU_MF', 'Subgrid <wu> of mass flux convection scheme', & - 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WVMF, 'WV_MF', 'Subgrid <wv> of mass flux convection scheme', & - 'm2 s-2', ymasks ) - - call Les_diachro_write( tpdiafile, XLES_SUBGRID_PHI3, 'SBG_PHI3', 'Subgrid Phi3 function', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_LMix, 'SBG_LMIX', 'Subgrid Mixing Length', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_LDiss, 'SBG_LDIS', 'Subgrid Dissipation Length', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_Km, 'SBG_KM', 'Eddy diffusivity for momentum', 'm2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_Kh, 'SBG_KH', 'Eddy diffusivity for heat', 'm2 s-1', ymasks ) - - if ( luserv ) then - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WThv, 'SBG_WTHV', 'Subgrid vertical flux of liquid potential temperature', & - 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_Rt2, 'SBG_RT2', 'Subgrid total water variance', 'kg2 kg-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_ThlRt, 'SBG_TLRT', 'Subgrid <thlrt> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_URt, 'SBG_URT', 'Subgrid total water horizontal flux', & - 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_VRt, 'SBG_VRT', 'Subgrid total water horizontal flux', & - 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WRt, 'SBG_WRT', 'Subgrid total water vertical flux', & - 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_PSI3, 'SBG_PSI3', 'Subgrid Psi3 function', '1', ymasks ) - end if - - if ( luserc ) then - call Les_diachro_write( tpdiafile, XLES_SUBGRID_Rc2, 'SBG_RC2', 'Subgrid cloud water variance', 'kg2 kg-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_URc, 'SBG_URC', 'Subgrid cloud water horizontal flux', 'm kg kg-1 s-1', & - ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_VRc, 'SBG_VRC', 'Subgrid cloud water horizontal flux', 'm kg kg-1 s-1', & - ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WRc, 'SBG_WRC', 'Subgrid cloud water vertical flux', 'm kg kg-1 s-1', & - ymasks ) - end if - - if ( nsv > 0 ) then - tfield%ndims = 4 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(5:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_SUBGRID_USv, 'SBG_USV', 'Subgrid <uSv> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_VSv, 'SBG_VSV', 'Subgrid <vSv> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WSv, 'SBG_WSV', 'Subgrid <wSv> vertical flux', 'm kg kg-1 s-1', ymasks ) - - tfield%ndims = 3 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - !tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_UNUSED - !tfield%ndimlist(5:) = NMNHDIM_UNUSED - - - end if - - call Les_diachro_write( tpdiafile, XLES_SUBGRID_UTke, 'SBG_UTKE', 'Subgrid flux of subgrid kinetic energy', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_VTke, 'SBG_VTKE', 'Subgrid flux of subgrid kinetic energy', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WTke, 'SBG_WTKE', 'Subgrid flux of subgrid kinetic energy', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_W2Thl, 'SBG_W2TL', 'Subgrid flux of subgrid kinetic energy', 'm2 K s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WThl2, 'SBG_WTL2', 'Subgrid flux of subgrid kinetic energy', 'm K2 s-1', ymasks ) -end if - - -!Prepare metadata (used in Les_diachro_write calls) -tfield%ndims = 2 -tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL -tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME -tfield%ndimlist(3:) = NMNHDIM_UNUSED - -ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF -ldonorm = trim(cles_norm_type) /= 'NONE' -! -!* 2.4 Updraft quantities -! ------------------ -! -if ( lles_updraft ) then - cgroup = 'Updraft' - cgroupcomment = 'Updraft vertical profiles of some resolved and subgrid fluxes, variances and covariances' - - call Les_diachro_write( tpdiafile, XLES_UPDRAFT, 'UP_FRAC', 'Updraft fraction', '1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_W, 'UP_W', 'Updraft W mean value', 'm s-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Th, 'UP_TH', 'Updraft potential temperature mean value', 'K' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Thl, 'UP_THL', 'Updraft liquid potential temperature mean value', 'K' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Thv, 'UP_THV', 'Updraft virtual potential temperature mean value', 'K' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Ke, 'UP_KE', 'Updraft resolved TKE mean value', 'm2 s-2' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Tke, 'UP_TKE', 'Updraft subgrid TKE mean value', 'm2 s-2' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rv, 'UP_RV', 'Updraft water vapor mean value', 'kg kg-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rc, 'UP_RC', 'Updraft cloud water mean value', 'kg kg-1' ) - if ( luserr ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rr, 'UP_RR', 'Updraft rain mean value', 'kg kg-1' ) - if ( luseri ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Ri, 'UP_RI', 'Updraft ice mean value', 'kg kg-1' ) - if ( lusers ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rs, 'UP_RS', 'Updraft snow mean value', 'kg kg-1' ) - if ( luserg ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rg, 'UP_RG', 'Updraft graupel mean value', 'kg kg-1' ) - if ( luserh ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rh, 'UP_RH', 'Updraft hail mean value', 'kg kg-1' ) - - if ( nsv > 0 ) then - tfield%ndims = 3 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(4:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Sv, 'UP_SV', 'Updraft scalar variables mean values', 'kg kg-1' ) - - tfield%ndims = 2 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_UNUSED - !tfield%ndimlist(4:) = NMNHDIM_UNUSED - end if - - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Th2, 'UP_TH2', 'Updraft resolved Theta variance', 'K2' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Thl2, 'UP_THL2', 'Updraft resolved Theta_l variance', 'K2' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThThv, 'UP_THTV', 'Updraft resolved Theta Theta_v covariance', 'K2' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlThv, 'UP_TLTV', 'Updraft resolved Theta_l Theta_v covariance', 'K2' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WTh, 'UP_WTH', 'Updraft resolved WTh flux', 'm K s-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WThl, 'UP_WTHL', 'Updraft resolved WThl flux', 'm K s-1' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WThv, 'UP_WTHV', 'Updraft resolved WThv flux', 'm K s-1' ) - - if ( luserv ) then - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rv2, 'UP_RV2', 'Updraft resolved water vapor variance', 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThRv, 'UP_THRV', 'Updraft resolved <thrv> covariance', 'K kg kg-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlRv, 'UP_THLRV', 'Updraft resolved <thlrv> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThvRv, 'UP_THVRV', 'Updraft resolved <thvrv> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WRv, 'UP_WRV', 'Updraft resolved <wrv> vertical flux', 'm kg kg-1 s-1' ) - end if - - if ( luserc ) then - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rc2, 'UP_RC2', 'Updraft resolved cloud water variance', 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThRc, 'UP_THRC', 'Updraft resolved <thrc> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlRc, 'UP_THLRC', 'Updraft resolved <thlrc> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThvRc, 'UP_THVRC', 'Updraft resolved <thvrc> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WRc, 'UP_WRC', 'Updraft resolved <wrc> vertical flux', 'm kg kg-1 s-1' ) - end if - - if ( luseri ) then - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Ri2, 'UP_RI2', 'Updraft resolved cloud ice variance', 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThRi, 'UP_THRI', 'Updraft resolved <thri> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlRi, 'UP_THLRI', 'Updraft resolved <thlri> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThvRi, 'UP_THVRI', 'Updraft resolved <thvri> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WRi, 'UP_WRI', 'Updraft resolved <wri> vertical flux', 'm kg kg-1 s-1' ) - end if - - - if ( nsv > 0 ) then - tfield%ndims = 3 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(4:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Sv2, 'UP_SV2', 'Updraft resolved scalar variables variances', 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThSv, 'UP_THSV', 'Updraft resolved <ThSv> variance', 'K kg kg-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlSv, 'UP_THLSV', 'Updraft resolved <ThlSv> variance', 'K kg kg-1' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThvSv, 'UP_THVSV', 'Updraft resolved <ThvSv> variance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WSv, 'UP_WSV', 'Updraft resolved <wSv> vertical flux', 'm kg kg-1 s-1' ) - - tfield%ndims = 2 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_UNUSED - !tfield%ndimlist(4:) = NMNHDIM_UNUSED - end if -end if -! -! -!* 2.5 Downdraft quantities -! -------------------- -! -if ( lles_downdraft ) then - cgroup = 'Downdraft' - cgroupcomment = 'Downdraft vertical profiles of some resolved and subgrid fluxes, variances and covariances' - - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT, 'DW_FRAC', 'Downdraft fraction', '1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_W, 'DW_W', 'Downdraft W mean value', 'm s-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Th, 'DW_TH', 'Downdraft potential temperature mean value', 'K' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Thl, 'DW_THL', 'Downdraft liquid potential temperature mean value', 'K' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Thv, 'DW_THV', 'Downdraft virtual potential temperature mean value', 'K' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Ke, 'DW_KE', 'Downdraft resolved TKE mean value', 'm2 s-2' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Tke, 'DW_TKE', 'Downdraft subgrid TKE mean value', 'm2 s-2' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rv, 'DW_RV', 'Downdraft water vapor mean value', 'kg kg-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rc, 'DW_RC', 'Downdraft cloud water mean value', 'kg kg-1' ) - if ( luserr ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rr, 'DW_RR', 'Downdraft rain mean value', 'kg kg-1' ) - if ( luseri ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Ri, 'DW_RI', 'Downdraft ice mean value', 'kg kg-1' ) - if ( lusers ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rs, 'DW_RS', 'Downdraft snow mean value', 'kg kg-1' ) - if ( luserg ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rg, 'DW_RG', 'Downdraft graupel mean value', 'kg kg-1' ) - if ( luserh ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rh, 'DW_RH', 'Downdraft hail mean value', 'kg kg-1' ) - - if ( nsv > 0 ) then - tfield%ndims = 3 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(4:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Sv, 'DW_SV', 'Downdraft scalar variables mean values', 'kg kg-1' ) - - tfield%ndims = 2 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_UNUSED - !tfield%ndimlist(4:) = NMNHDIM_UNUSED - end if - - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Th2, 'DW_TH2', 'Downdraft resolved Theta variance', 'K2' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Thl2, 'DW_THL2', 'Downdraft resolved Theta_l variance', 'K2' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThThv, 'DW_THTV', 'Downdraft resolved Theta Theta_v covariance', 'K2' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlThv, 'DW_TLTV', 'Downdraft resolved Theta_l Theta_v covariance', 'K2' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WTh, 'DW_WTH', 'Downdraft resolved WTh flux', 'm K s-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WThl, 'DW_WTHL', 'Downdraft resolved WThl flux', 'm K s-1' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WThv, 'DW_WTHV', 'Downdraft resolved WThv flux', 'm K s-1' ) - - if ( luserv ) then - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rv2, 'DW_RV2', 'Downdraft resolved water vapor variance', 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThRv, 'DW_THRV', 'Downdraft resolved <thrv> covariance', 'K kg kg-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlRv, 'DW_THLRV', 'Downdraft resolved <thlrv> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThvRv, 'DW_THVRV', 'Downdraft resolved <thvrv> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WRv, 'DW_WRV', 'Downdraft resolved <wrv> vertical flux', & - 'm kg kg-1 s-1' ) - end if - - if ( luserc ) then - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rc2, 'DW_RC2', 'Downdraft resolved cloud water variance', 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThRc, 'DW_THRC', 'Downdraft resolved <thrc> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlRc, 'DW_THLRC', 'Downdraft resolved <thlrc> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThvRc, 'DW_THVRC', 'Downdraft resolved <thvrc> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WRc, 'DW_WRC', 'Downdraft resolved <wrc> vertical flux', & - 'm kg kg-1 s-1' ) - end if - - if ( luseri ) then - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Ri2, 'DW_RI2', 'Downdraft resolved cloud ice variance', 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThRi, 'DW_THRI', 'Downdraft resolved <thri> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlRi, 'DW_THLRI', 'Downdraft resolved <thlri> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThvRi, 'DW_THVRI', 'Downdraft resolved <thvri> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WRi, 'DW_WRI', 'Downdraft resolved <wri> vertical flux', & - 'm kg kg-1 s-1' ) - end if - - - if ( nsv > 0 ) then - tfield%ndims = 3 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(4:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Sv2, 'DW_SV2', 'Downdraft resolved scalar variables variances', & - 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThSv, 'DW_THSV', 'Downdraft resolved <ThSv> variance', & - 'K kg kg-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlSv, 'DW_THLSV', 'Downdraft resolved <ThlSv> variance', & - 'K kg kg-1' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThvSv, 'DW_THVSV', 'Downdraft resolved <ThvSv> variance', & - 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WSv, 'DW_WSV', 'Downdraft resolved <wSv> vertical flux', & - 'm kg kg-1 s-1' ) - - tfield%ndims = 2 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_UNUSED - !tfield%ndimlist(4:) = NMNHDIM_UNUSED - end if -end if -! -!------------------------------------------------------------------------------- -! -!* 3. surface normalization parameters -! -------------------------------- -! -cgroup = 'Radiation' -cgroupcomment = 'Radiative terms' - -!Prepare metadata (used in Les_diachro_write calls) -tfield%ndims = 2 -tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL -tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME -tfield%ndimlist(3:) = NMNHDIM_UNUSED - -ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF -ldonorm = .false. - -call Les_diachro_write( tpdiafile, XLES_SWU, 'SWU', 'SW upward radiative flux', 'W m-2' ) -call Les_diachro_write( tpdiafile, XLES_SWD, 'SWD', 'SW downward radiative flux', 'W m-2' ) -call Les_diachro_write( tpdiafile, XLES_LWU, 'LWU', 'LW upward radiative flux', 'W m-2' ) -call Les_diachro_write( tpdiafile, XLES_LWD, 'LWD', 'LW downward radiative flux', 'W m-2' ) -call Les_diachro_write( tpdiafile, XLES_DTHRADSW, 'DTHRADSW', 'SW radiative temperature tendency', 'K s-1' ) -call Les_diachro_write( tpdiafile, XLES_DTHRADLW, 'DTHRADLW', 'LW radiative temperature tendency', 'K s-1' ) -!writes mean_effective radius at all levels -call Les_diachro_write( tpdiafile, XLES_RADEFF, 'RADEFF', 'Mean effective radius', 'micron' ) - - -cgroup = 'Surface' -cgroupcomment = 'Averaged surface fields' - -! !Prepare metadate (used in Les_diachro_write calls) -tfield%ndims = 1 -tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_TIME -tfield%ndimlist(2:) = NMNHDIM_UNUSED - -call Les_diachro_write( tpdiafile, XLES_Q0, 'Q0', 'Sensible heat flux at the surface', 'm K s-1' ) -if ( luserv ) & -call Les_diachro_write( tpdiafile, XLES_E0, 'E0', 'Latent heat flux at the surface', 'kg kg-1 m s-1' ) - -if ( nsv > 0 ) then - tfield%ndims = 2 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(3:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_SV0, 'SV0', 'Scalar variable fluxes at the surface', 'kg kg-1 m s-1' ) - - tfield%ndims = 1 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(2) = NMNHDIM_UNUSED - !tfield%ndimlist(3:) = NMNHDIM_UNUSED -end if - -call Les_diachro_write( tpdiafile, XLES_USTAR, 'Ustar', 'Friction velocity', 'm s-1' ) -call Les_diachro_write( tpdiafile, XLES_WSTAR, 'Wstar', 'Convective velocity', 'm s-1' ) -call Les_diachro_write( tpdiafile, XLES_MO_LENGTH, 'L_MO', 'Monin-Obukhov length', 'm' ) -if ( luserr ) & -call Les_diachro_write( tpdiafile, XLES_PRECFR, 'PREC_FRAC', 'Fraction of columns where rain at surface', '1' ) -if ( luserr ) & -call Les_diachro_write( tpdiafile, XLES_INPRR, 'INST_PREC', 'Instantaneous precipitation rate', 'mm day-1' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_INPRC, 'INST_SEDIM', 'Instantaneous cloud precipitation rate', 'mm day-1' ) -if ( luserc .and. ( ldeposc .or. ldepoc ) ) & -call Les_diachro_write( tpdiafile, XLES_INDEP, 'INST_DEPOS', 'Instantaneous cloud deposition rate', 'mm day-1' ) -if ( luserr ) & -call Les_diachro_write( tpdiafile, XLES_RAIN_INPRR, 'RAIN_PREC', 'Instantaneous precipitation rate over rainy grid cells', & - 'mm day-1' ) -if ( luserr ) & -call Les_diachro_write( tpdiafile, XLES_ACPRR, 'ACCU_PREC', 'Accumulated precipitation rate', 'mm' ) - - -cgroup = 'Miscellaneous' -cgroupcomment = 'Miscellaneous terms (geometry, various unclassified averaged terms...)' - -call Les_diachro_write( tpdiafile, XLES_BL_HEIGHT, 'BL_H', 'Boundary Layer Height', 'm' ) -call Les_diachro_write( tpdiafile, XLES_INT_TKE, 'INT_TKE', 'Vertical integrated TKE', 'm2 s-2' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_ZCB, 'ZCB', 'Cloud base Height', 'm' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_CFtot, 'ZCFTOT', 'Total cloud cover (rc>1e-6)', '1' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_CF2tot, 'ZCF2TOT', 'Total cloud cover (rc>1e-5)', '1' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_LWP, 'LWP', 'Liquid Water path', 'kg m-2' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_LWPVAR, 'LWPVAR', 'Liquid Water path variance', 'kg m-4' ) -if ( luserr ) & -call Les_diachro_write( tpdiafile, XLES_RWP, 'RWP', 'Rain Water path', 'kg m-2' ) -if ( luseri ) & -call Les_diachro_write( tpdiafile, XLES_IWP, 'IWP', 'Ice Water path', 'kg m-2' ) -if ( lusers ) & -call Les_diachro_write( tpdiafile, XLES_SWP, 'SWP', 'Snow Water path', 'kg m-2' ) -if ( luserg ) & -call Les_diachro_write( tpdiafile, XLES_GWP, 'GWP', 'Graupel Water path', 'kg m-2' ) -if ( luserh ) & -call Les_diachro_write( tpdiafile, XLES_HWP, 'HWP', 'Hail Water path', 'kg m-2' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_ZMAXCF, 'ZMAXCF', 'Height of Cloud fraction maximum (rc>1e-6)', 'm' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_ZMAXCF2, 'ZMAXCF2', 'Height of Cloud fraction maximum (rc>1e-5)', 'm' ) - -!------------------------------------------------------------------------------- -! -!* 4. LES budgets -! ----------- -! -call Write_les_budget_n( tpdiafile ) - -if ( luserv ) call Write_les_rt_budget_n( tpdiafile ) - -if ( nsv > 0 ) call Write_les_sv_budget_n( tpdiafile ) -! -!------------------------------------------------------------------------------- -! -!* 5. (ni,z,t) and (nj,z,t) 2points correlations -! ------------------------------------------ -! -if ( nspectra_k > 0 ) then - tfieldx%cstdname = '' - tfieldx%ngrid = 0 !Not on the Arakawa grid - tfieldx%ntype = TYPEREAL - tfieldx%ndims = 3 - tfieldx%ndimlist(1) = NMNHDIM_SPECTRA_2PTS_NI - tfieldx%ndimlist(2) = NMNHDIM_SPECTRA_LEVEL - tfieldx%ndimlist(3) = NMNHDIM_BUDGET_LES_TIME - tfieldx%ndimlist(4:) = NMNHDIM_UNUSED - - tfieldy%cstdname = '' - tfieldy%ngrid = 0 !Not on the Arakawa grid - tfieldy%ntype = TYPEREAL - tfieldy%ndims = 3 - tfieldy%ndimlist(1) = NMNHDIM_SPECTRA_2PTS_NJ - tfieldy%ndimlist(2) = NMNHDIM_SPECTRA_LEVEL - tfieldy%ndimlist(3) = NMNHDIM_BUDGET_LES_TIME - tfieldy%ndimlist(4:) = NMNHDIM_UNUSED - - call Les_diachro_2pt_write( tpdiafile, XCORRi_UU, XCORRj_UU, 'UU', 'U*U 2 points correlations', 'm2 s-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_VV, XCORRj_VV, 'VV', 'V*V 2 points correlations', 'm2 s-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_WW, XCORRj_WW, 'WW', 'W*W 2 points correlations', 'm2 s-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_UV, XCORRj_UV, 'UV', 'U*V 2 points correlations', 'm2 s-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_WU, XCORRj_WU, 'WU', 'W*U 2 points correlations', 'm2 s-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_WV, XCORRj_WV, 'WV', 'W*V 2 points correlations', 'm2 s-2' ) - - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThTh, XCORRj_ThTh, 'THTH', 'Th*Th 2 points correlations', 'K2' ) - if ( luserc ) & - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThlThl, XCORRj_ThlThl, 'TLTL', 'Thl*Thl 2 points correlations', 'K2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_WTh, XCORRj_WTh, 'WTH', 'W*Th 2 points correlations', 'm K s-1' ) - if ( luserc ) & - call Les_diachro_2pt_write( tpdiafile, XCORRi_WThl, XCORRj_WThl, 'WTHL', 'W*Thl 2 points correlations', 'm K s-1' ) - - if ( luserv ) then - call Les_diachro_2pt_write( tpdiafile, XCORRi_RvRv, XCORRj_RvRv, 'RVRV', 'rv*rv 2 points correlations', 'kg2 kg-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThRv, XCORRj_ThRv, 'THRV', 'TH*RV 2 points correlations', 'K kg kg-1' ) - if ( luserc ) & - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThlRv, XCORRj_ThlRv, 'TLRV', 'thl*rv 2 points correlations', 'K kg kg-1' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_WRv, XCORRj_WRv, 'WRV', 'W*rv 2 points correlations', 'm kg s-1 kg-1' ) - end if - - if ( luserc ) then - call Les_diachro_2pt_write( tpdiafile, XCORRi_RcRc, XCORRj_RcRc, 'RCRC', 'rc*rc 2 points correlations', 'kg2 kg-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThRc, XCORRj_ThRc, 'THRC', 'th*rc 2 points correlations', 'K kg kg-1' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThlRc, XCORRj_ThlRc, 'TLRC', 'thl*rc 2 points correlations', 'K kg kg-1' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_WRc, XCORRj_WRc, 'WRC', 'W*rc 2 points correlations', 'm kg s-1 kg-1' ) - end if - - if ( luseri ) then - call Les_diachro_2pt_write( tpdiafile, XCORRi_RiRi, XCORRj_RiRi, 'RIRI', 'ri*ri 2 points correlations', 'kg2 kg-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThRi, XCORRj_ThRi, 'THRI', 'th*ri 2 points correlations', 'K kg kg-1' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThlRi, XCORRj_ThlRi, 'TLRI', 'thl*ri 2 points correlations', 'K kg kg-1' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_WRi, XCORRj_WRi, 'WRI', 'W*ri 2 points correlations', 'm kg s-1 kg-1' ) - end if - -!PW: TODO: ameliorer le ygroup (tenir compte de ce qu'est la variable scalaire et pas juste son jsv!) - do jsv = 1, nsv - Write( ygroup, fmt = "( a2, i3.3 )" ) "SS", jsv - call Les_diachro_2pt_write( tpdiafile, XCORRi_SvSv(:,:,:,JSV), XCORRj_SvSv(:,:,:,JSV), ygroup, & - 'Sv*Sv 2 points correlations','kg2 kg-2' ) - end do - -!PW: TODO: ameliorer le ygroup (tenir compte de ce qu'est la variable scalaire et pas juste son jsv!) - do jsv = 1, nsv - Write( ygroup, fmt = "( a2, i3.3 )" ) "WS", jsv - call Les_diachro_2pt_write( tpdiafile, XCORRi_WSv(:,:,:,JSV), XCORRj_WSv(:,:,:,JSV), ygroup, & - 'W*Sv 2 points correlations','m kg s-1 kg-1' ) - end do -end if -! -!------------------------------------------------------------------------------- -! -!* 6. spectra and time-averaged profiles (if first call to WRITE_LES_n) -! ---------------------------------- -! -call Les_spec_n( tpdiafile ) -! -!------------------------------------------------------------------------------- -! -!* 7. deallocations -! ------------- -! -CALL LES_DEALLOCATE('XLES_CURRENT_Z') - -IF (CLES_NORM_TYPE/='NONE' ) THEN - CALL LES_DEALLOCATE('XLES_NORM_M') - CALL LES_DEALLOCATE('XLES_NORM_S') - CALL LES_DEALLOCATE('XLES_NORM_K') - CALL LES_DEALLOCATE('XLES_NORM_RHO') - CALL LES_DEALLOCATE('XLES_NORM_RV') - CALL LES_DEALLOCATE('XLES_NORM_SV') - CALL LES_DEALLOCATE('XLES_NORM_P') -END IF - -end subroutine Write_les_n - -!------------------------------------------------------------------------------ - -subroutine Les_diachro_write_1D( tpdiafile, pdata, hmnhname, hcomment, hunits ) - -use modd_io, only: tfiledata - -use mode_les_diachro, only: Les_diachro - -type(tfiledata), intent(in) :: tpdiafile ! file to write -real, dimension(:), intent(in) :: pdata -character(len=*), intent(in) :: hmnhname -character(len=*), intent(in) :: hcomment -character(len=*), intent(in) :: hunits - -tfield%cmnhname = hmnhname -tfield%clongname = hmnhname -tfield%ccomment = hcomment -tfield%cunits = hunits - -call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata ) - -end subroutine Les_diachro_write_1D - -!------------------------------------------------------------------------------ - -subroutine Les_diachro_write_2D( tpdiafile, pdata, hmnhname, hcomment, hunits ) - -use modd_io, only: tfiledata - -use mode_les_diachro, only: Les_diachro - -type(tfiledata), intent(in) :: tpdiafile ! file to write -real, dimension(:,:), intent(in) :: pdata -character(len=*), intent(in) :: hmnhname -character(len=*), intent(in) :: hcomment -character(len=*), intent(in) :: hunits - -tfield%cmnhname = hmnhname -tfield%clongname = hmnhname -tfield%ccomment = hcomment -tfield%cunits = hunits - -call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata ) - -end subroutine Les_diachro_write_2D - -!------------------------------------------------------------------------------ - -subroutine Les_diachro_write_3D( tpdiafile, pdata, hmnhname, hcomment, hunits, hmasks ) - -use modd_io, only: tfiledata - -use mode_les_diachro, only: Les_diachro - -type(tfiledata), intent(in) :: tpdiafile ! file to write -real, dimension(:,:,:), intent(in) :: pdata -character(len=*), intent(in) :: hmnhname -character(len=*), intent(in) :: hcomment -character(len=*), intent(in) :: hunits -character(len=*), dimension(:), optional, intent(in) :: hmasks - -tfield%cmnhname = hmnhname -tfield%clongname = hmnhname -tfield%ccomment = hcomment -tfield%cunits = hunits - -call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata, hmasks = hmasks ) - -end subroutine Les_diachro_write_3D - -!------------------------------------------------------------------------------ - -subroutine Les_diachro_write_4D( tpdiafile, pdata, hmnhname, hcomment, hunits, hmasks ) - -use modd_io, only: tfiledata - -use mode_les_diachro, only: Les_diachro - -type(tfiledata), intent(in) :: tpdiafile ! file to write -real, dimension(:,:,:,:), intent(in) :: pdata -character(len=*), intent(in) :: hmnhname -character(len=*), intent(in) :: hcomment -character(len=*), intent(in) :: hunits -character(len=*), dimension(:), optional, intent(in) :: hmasks - -tfield%cmnhname = hmnhname -tfield%clongname = hmnhname -tfield%ccomment = hcomment -tfield%cunits = hunits - -call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata, hmasks = hmasks ) - -end subroutine Les_diachro_write_4D - -!------------------------------------------------------------------------------ - -subroutine Les_diachro_2pt_write( tpdiafile, zcorri, zcorrj, hmnhname, hcomment, hunits ) - -use modd_io, only: tfiledata - -use mode_les_diachro, only: Les_diachro_2pt - -type(tfiledata), intent(in) :: tpdiafile ! file to write -real, dimension(:,:,:), intent(in) :: zcorri ! 2 pts correlation data -real, dimension(:,:,:), intent(in) :: zcorrj ! 2 pts correlation data -character(len=*), intent(in) :: hmnhname -character(len=*), intent(in) :: hcomment -character(len=*), intent(in) :: hunits - -tfieldx%cmnhname = hmnhname -tfieldx%clongname = hmnhname -tfieldx%ccomment = hcomment -tfieldx%cunits = hunits - -tfieldy%cmnhname = hmnhname -tfieldy%clongname = hmnhname -tfieldy%ccomment = hcomment -tfieldy%cunits = hunits - -call Les_diachro_2pt( tpdiafile, tfieldx, tfieldy, zcorri, zcorrj ) - -end subroutine Les_diachro_2pt_write - -!------------------------------------------------------------------------------ - -end module mode_write_les_n diff --git a/src/PHYEX/ext/write_lfifm1_for_diag.f90 b/src/PHYEX/ext/write_lfifm1_for_diag.f90 deleted file mode 100644 index 84ff78bda..000000000 --- a/src/PHYEX/ext/write_lfifm1_for_diag.f90 +++ /dev/null @@ -1,4201 +0,0 @@ -!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!################################ -MODULE MODI_WRITE_LFIFM1_FOR_DIAG -!################################ -INTERFACE - SUBROUTINE WRITE_LFIFM1_FOR_DIAG(TPFILE,HDADFILE) -! -USE MODD_IO, ONLY: TFILEDATA -! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! outpput data file -CHARACTER(LEN=28), INTENT(IN) :: HDADFILE ! corresponding FM-file name of - ! its DAD model -! -END SUBROUTINE WRITE_LFIFM1_FOR_DIAG -END INTERFACE -END MODULE MODI_WRITE_LFIFM1_FOR_DIAG -! -! ################################################## - SUBROUTINE WRITE_LFIFM1_FOR_DIAG(TPFILE,HDADFILE) -! ################################################## -! -!!**** *WRITE_LFIFM1* - routine to write a LFIFM file for model 1 -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to write an initial LFIFM File -! of name YFMFILE2//'.lfi' with the FM routines. -! -!!** METHOD -!! ------ -!! The data are written in the LFIFM file : -!! - dimensions -!! - grid variables -!! - configuration variables -!! - prognostic variables at time t and t-dt -!! - 1D anelastic reference state -!! -!! The localization on the model grid is also indicated : -!! -!! IGRID = 1 for mass grid point -!! IGRID = 2 for U grid point -!! IGRID = 3 for V grid point -!! IGRID = 4 for w grid point -!! IGRID = 0 for meaningless case -!! -!! -!! EXTERNAL -!! -------- -!! FMWRIT : FM-routine to write a record -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_DIM1 : contains dimensions -!! Module MODD_TIME1 : contains time variables and uses MODD_TIME -!! Module MODD_GRID : contains spatial grid variables for all models -!! Module MODD_GRID1 : contains spatial grid variables -!! Module MODD_REF : contains reference state variables -!! Module MODD_LUNIT1: contains logical unit variables. -!! Module MODD_CONF : contains configuration variables for all models -!! Module MODD_CONF1 : contains configuration variables -!! Module MODD_FIELD1 : contains prognostic variables -!! Module MODD_GR_FIELD1 : contains surface prognostic variables -!! Module MODD_LSFIELD1 : contains Larger Scale variables -!! Module MODD_PARAM1 : contains parameterization options -!! Module MODD_TURB1 : contains turbulence options -!! Module MODD_FRC : contains forcing variables -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 06/05/94 -!! V. Ducrocq 27/06/94 -!! J.Stein 20/10/94 (name of the FMFILE) -!! J.Stein 06/12/94 add the LS fields -!! J.P. Lafore 09/01/95 add the DRYMASST -!! J.Stein 20/01/95 add TKE and change the ycomment for the water -!! variables -!! J.Stein 23/01/95 add a TKE switch and MODD_PARAM1 -!! J.Stein 16/03/95 remove R from the historical variables -!! J.Stein 20/03/95 add the EPS var. -!! J.Stein 30/06/95 add the variables related to the subgrid condens -!! S. Belair 01/09/95 add surface variables and ground parameters -!! J.-P. Pinty 15/09/95 add the radiation parameters -!! J.Stein 23/01/96 add the TSZ0 option for the surface scheme -!! M.Georgelin 13/12/95 add the forcing variables -!! J.-P. Pinty 15/02/96 add external control for the forcing -!! J.Stein P.Bougeault 15/03/96 add the cloud fraction and change the -!! surface parameters for TSZ0 option -!! J.Stein P.Jabouille 30/04/96 add the storage type -!! J.Stein P.Jabouille 20/05/96 switch for XSIGS and XSRC -!! J.Stein 10/10/96 change Xsrc into XSRCM and XRCT -!! J.P. Lafore 30/07/96 add YFMFILE2 and HDADFILE writing -!! corresponding to MY_NAME and DAD_NAME (for nesting) -!! V.Masson 08/10/96 add LTHINSHELL -!! J.-P. Pinty 15/12/96 add the microphysics (ice) -!! J.-P. Pinty 11/01/97 add the deep convection -!! J.-P. Pinty 27/01/97 split the recording of the SV array -!! J.-P. Pinty 29/01/97 set recording of PRCONV and PACCONV in mm/h and -!! mm respectively -!! J. Viviand 04/02/97 convert precipitation rates in mm/h -!! P. Hereil 04/12/97 add the calculation of cloud top and moist PV -!! P.Hereil N Asencio 3/02/98 add the calculation of precipitation on large scale grid mesh -!! N Asencio 2/10/98 suppress flux calculation if start file -!! V Masson 25/11/98 places dummy arguments in module MODD_DIAG_FLAG -!! V Masson 04/01/00 removes TSZ0 option -!! J.-P. Pinty 29/11/02 add C3R5, ICE2, ICE4, CELEC -!! V Masson 01/2004 removes surface (externalization) -!! P. Tulet 01/2005 add dust, orilam -!! M. Leriche 04/2007 add aqueous concentration in M -!! O. Caumont 03/2008 add simulation of radar observations -!! O. Caumont 14/09/2009 modifications to allow for polar outputs (radar diagnostics) -!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after -!! change of YCOMMENT -!! G. Tanguy 10/2009 add possibility to run radar after -!! PREP_REAL_CASE with AROME -!! O. Caumont 01/2011 [radar diagnostics] add control check for NMAX; revise comments -!! O. Caumont 05/2011 [radar diagnostics] change output format -!! G.Tanguy/ JP Pinty/ JP Chabureau 18/05/2011 : add lidar simulator -!! S.Bielli 12/2012 : add latitude and longitude -!! F. Duffourg 02/2013 : add new fields -!! J.Escobar 21/03/2013: for HALOK get correctly local array dim/bound -!! J. escobar 27/03/2014 : write LAT/LON only in not CARTESIAN case -!! G.Delautier 2014 : remplace MODD_RAIN_C2R2_PARAM par MODD_RAIN_C2R2_KHKO_PARAM -!! C. Augros 2014 : new radar simulator (T matrice) -!! D.Ricard 2015 : add THETAES + POVOES (LMOIST_ES=T) -!! Modification 01/2016 (JP Pinty) Add LIMA -!! C.Lac 04/2016 : add visibility and droplet deposition -!! 10/2017 (G.Delautier) New boundary layer height : replace LBLTOP by CBLTOP -!! T.Dauhut 10/2017 : add parallel 3D clustering -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! D.Ricard and P.Marquet 2016-2017 : THETAL + THETAS1 POVOS1 or THETAS2 POVOS2 -!! if LMOIST_L LMOIST_S1 or LMOIST_S2 -! P. Wautelet 08/02/2019: minor bug: compute ZWORK36 only when needed -! S Bielli 02/2019: sea salt: significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 18/03/2020: remove ICE2 option -! B. Vie 06/2020: Add prognostic supersaturation for LIMA -! P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL -! J.L Redelsperger 03/2021 Adding OCEAN LES Case and Autocoupled O-A LES -! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_BLOWSNOW, ONLY: LBLOWSNOW, NBLOWSNOW3D -USE MODD_BLOWSNOW_n, ONLY: XSNWSUBL3D -USE MODD_CH_AERO_n, ONLY: XN3D, XRG3D, XSIG3D -USE MODD_CH_AEROSOL -USE MODD_CH_M9_n, ONLY: NEQAQ -USE MODD_CH_MNHC_n, ONLY: LCH_CONV_LINOX, LUSECHEM, XRTMIN_AQ -USE MODD_CONDSAMP, ONLY: LCONDSAMP -USE MODD_CONF, ONLY: CBIBUSER, CEQNSYS, CPROGRAM, L1D, L2D, LCARTESIAN, LFORCING, LPACK, LTHINSHELL, NBUGFIX, NMASDEV -USE MODD_CONF_n, ONLY: IDX_RVT, IDX_RCT, IDX_RRT, IDX_RIT, IDX_RST, IDX_RGT, IDX_RHT, & - LUSERV, LUSERC, LUSERR, LUSERI, LUSERS, LUSERG, LUSERH, & - LUSECI, NRR, NRRI, NRRL -USE MODD_CST, ONLY: XALPI, XAVOGADRO, XBETAI, XCI, XCL, XCPD, XCPV, XG, XGAMI, XLSTT, XLVTT, & - XMD, XMV, XP00, XPI, XRADIUS, XRHOLW, XRD, XRV, XTT -USE MODD_CSTS_DUST, ONLY: XDENSITY_DUST, XM3TOUM3, XMOLARWEIGHT_DUST -USE MODD_CURVCOR_n, ONLY: XCORIOZ -USE MODD_DEEP_CONVECTION_n, ONLY: XCG_RATE, XCG_TOTAL_NUMBER, XIC_RATE, XIC_TOTAL_NUMBER, XPACCONV, XPRCONV, XPRSCONV -USE MODD_DIAG_FLAG -USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll, NKMAX -USE MODD_DUST, ONLY: LDEPOS_DST, LDUST, NMODE_DST -USE MODD_DYN_n, ONLY: LOCEAN -use modd_field, only: tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL -USE MODD_FIELD_n, ONLY: XCIT, XCLDFR, XICEFR, XPABSM, XPABST, XRT, XSIGS, XSRCT, XSVT, XTHT, XTKET, XUT, XVT, XWT, XZWS -USE MODD_FRC, ONLY: NFRC, XGXTHFRC, XGYTHFRC, XPGROUNDFRC, XRVFRC, XTENDRVFRC, XTENDTHFRC, XTHFRC, XUFRC, XVFRC, XWFRC -USE MODD_GRID, ONLY: XBETA, XLAT0, XLATORI, XLON0, XLONORI, XRPK -USE MODD_GRID_n, only: LSLEVE, NEXTE_XMIN, NEXTE_YMIN, XHATM_BOUND, & - XLAT, XLEN1, XLEN2, XLON, XZS, XXHAT, XXHATM, XYHAT, XYHATM, XZHAT, XZSMT, XZTOP, XZZ -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LSFIELD_n, ONLY: XLSRVM, XLSTHM, XLSUM, XLSVM, XLSWM -USE MODD_LUNIT, ONLY: TLUOUT0 -USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ -USE MODD_MPIF -USE MODD_NESTING, ONLY: NDXRATIO_ALL, NDYRATIO_ALL, NXOR_ALL, NYOR_ALL -USE MODD_NSV -USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT, XUNDEF -USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_CONC -USE MODD_PARAM_LIMA, ONLY: NMOD_CCN, NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM, & - LSCAV, LLIMA_DIAG, NMOM_S, NMOM_G, NMOM_H -USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_CONC, CAERO_MASS -USE MODD_PARAM_n, ONLY: CCLOUD, CDCONV, CELEC, CSURF, CTURB -USE MODD_PASPOL, ONLY: LPASPOL -USE MODD_PRECIP_n, ONLY: XACDEP, XACPRC, XACPRG, XACPRH, XACPRR, XACPRS, XEVAP3D, & - XINDEP, XINPRC, XINPRG, XINPRH, XINPRR, XINPRR3D, XINPRS -use modd_precision, only: MNHREAL_MPI -USE MODD_RADAR, ONLY: CNAME_RAD, LATT, LCART_RAD, LDNDZ, LREFR, LWBSCS, LWREFL, & - NBAZIM, NBELEV, NBRAD, NBSTEPMAX, NCURV_INTERPOL, NDIFF, NMAX, NPTS_H, NPTS_V, & - XALT_RAD, XDT_RAD, XELEV, XGRID, XLAM_RAD, XLAT_RAD, XLON_RAD, XSTEP_RAD -USE MODD_REF, ONLY: LBOUSS, LCOUPLES, XEXNTOP, XEXNTOPO, XRHODREFZ, XRHODREFZO, XTHVREFZ, XTHVREFZO -USE MODD_REF_n, ONLY: XEXNREF, XRHODREF, XTHVREF -USE MODD_SALT, ONLY: LDEPOS_SLT, LSALT, NMODE_SLT -USE MODD_TIME, ONLY: TDTEXP, TDTSEG -USE MODD_TIME_n, ONLY: TDTCUR, TDTMOD -USE MODD_TURB_n, only: CTOM, XBL_DEPTH -USE MODD_VAR_ll, ONLY: NMNH_COMM_WORLD - -USE MODE_AERO_PSD, ONLY: PPP2AERO -USE MODE_BLOWSNOW_PSD, ONLY: PPP2SNOW -USE MODE_DUST_PSD, ONLY: PPP2DUST -use mode_field, only: Find_field_id_from_mnhname -USE MODE_GRIDPROJ, ONLY: SM_LATLON -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -USE MODE_MODELN_HANDLER, only: GET_CURRENT_MODEL_INDEX -use mode_msg -USE MODE_SALT_PSD, ONLY: PPP2SALT -USE MODE_THERMO, ONLY: QSAT, SM_FOES -USE MODE_TOOLS, ONLY: UPCASE -USE MODE_TOOLS_ll, ONLY: GET_DIM_EXT_ll, GET_INDICE_ll - -USE MODI_CALCSOUND -USE MODI_CLUSTERING -USE MODI_COMPUTE_MEAN_PRECIP -USE MODI_CONTRAV -USE MODI_GPS_ZENITH -USE MODI_GRADIENT_M -USE MODI_GRADIENT_U -USE MODI_GRADIENT_V -USE MODI_GRADIENT_W -USE MODI_INI_RADAR -USE MODI_LIDAR -USE MODI_RADAR_RAIN_ICE -USE MODI_RADAR_SIMULATOR -USE MODI_SHUMAN -USE MODI_UV_TO_ZONAL_AND_MERID -! -IMPLICIT NONE -! -!* 0.1 Declarations of arguments -! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! outpput data file -CHARACTER(LEN=28), INTENT(IN) :: HDADFILE ! corresponding FM-file name of - ! its DAD model -! -!* 0.2 Declarations of local variables -! -INTEGER :: IRESP ! return-code for the file routines -! -CHARACTER(LEN=3) :: YFRC ! to mark the time of the forcing -CHARACTER(LEN=31) :: YFGRI ! file name for GPS stations -! -INTEGER :: IIU,IJU,IKU,IIB,IJB,IKB,IIE,IJE,IKE ! Arrays bounds -! -INTEGER :: JLOOP,JI,JJ,JK,JSV,JT,JH,JV,JEL ! loop index -INTEGER :: IMI ! Current model index -! -REAL :: ZRV_OV_RD ! XRV / XRD -REAL :: ZGAMREF ! Standard atmosphere lapse rate (K/m) -REAL :: ZX0D ! work real scalar -REAL :: ZLATOR, ZLONOR ! geographical coordinates of 1st mass point -! -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZPOVO -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZTEMP -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZVOX,ZVOY,ZVOZ -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZCORIOZ -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZWORK31,ZWORK32 -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZWORK33,ZWORK34 -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2)) :: ZWORK21,ZWORK22 -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2)) :: ZWORK23,ZWORK24 -REAL,DIMENSION(:,:,:,:,:), ALLOCATABLE :: ZWORK42 ! reflectivity on a cartesian grid (PREFL_CART) -REAL,DIMENSION(:,:,:,:,:), ALLOCATABLE :: ZWORK42_BIS -REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZWORK43 ! latlon coordinates of cartesian grid points (PLATLON) -REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZPHI,ZTHETAE,ZTHETAV -REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZTHETAES,ZTHETAL,ZTHETAS1,ZTHETAS2 -REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZVISIKUN,ZVISIGUL,ZVISIZHA -INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK1 -integer :: ICURR,INBOUT,IERR -! -REAL,DIMENSION(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NSP+NCARB+NSOA,JPMODE):: ZPTOTA -REAL,DIMENSION(:,:,:,:), POINTER :: ZSDSTDEP -REAL,DIMENSION(:,:,:,:), POINTER :: ZSSLTDEP -REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZSIG_DST, ZRG_DST, ZN0_DST -REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZSIG_SLT, ZRG_SLT, ZN0_SLT -REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZBET_SNW, ZRG_SNW -REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZMA_SNW -REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZRHOT, ZTMP ! work array -! -! GBOTUP = True does clustering from bottom up to top, False top down to surface -LOGICAL :: GBOTUP ! clustering propagation -LOGICAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: GCLOUD ! mask -INTEGER,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ICLUSTERID, ICLUSTERLV -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZCLDSIZE - -!ECRITURE DANS UN FICHIER ASCII DE RESULTATS -!INITIALISATION DU NOM DE FICHIER CREE EN PARALLELE AVEC CELUI LFI -TYPE(TFILEDATA),POINTER :: TZRSFILE -INTEGER :: ILURS -CHARACTER(LEN=32) :: YRS -CHARACTER(LEN=3),DIMENSION(:),ALLOCATABLE :: YRAD -CHARACTER(LEN=2*INT(NBSTEPMAX*XSTEP_RAD/XGRID)*2*9+1), DIMENSION(:), ALLOCATABLE :: CLATLON -CHARACTER(LEN=2*9) :: CBUFFER -CHARACTER(LEN=4) :: YELEV -CHARACTER(LEN=3) :: YGRID_SIZE -INTEGER :: IEL,IIELV -CHARACTER(LEN=5) :: YVIEW ! Upward or Downward integration -INTEGER :: IACCMODE -! -!------------------------------------------------------------------------------- -INTEGER :: IAUX ! work variable -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZW1, ZW2, ZW3 -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZWORK35,ZWORK36 -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2)) :: ZWORK25,ZWORK26 -REAL :: ZEAU ! Mean precipitable water -INTEGER, DIMENSION(SIZE(XZZ,1),SIZE(XZZ,2)) ::IKTOP ! level in which is the altitude 3000m -REAL, DIMENSION(SIZE(XZZ,1),SIZE(XZZ,2),SIZE(XZZ,3)) :: ZDELTAZ ! interval (m) between two levels K -INTEGER :: ILUOUT0 ! Logical unit number for output-listing -! -CHARACTER(LEN=2) :: INDICE -CHARACTER(LEN=100) :: YMSG -INTEGER :: IID -TYPE(TFIELDMETADATA) :: TZFIELD, TZFIELD2D -TYPE(TFIELDMETADATA), DIMENSION(2) :: TZFIELD2 -! -! LIMA LIDAR -REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZTMP1, ZTMP2, ZTMP3, ZTMP4 -! -! hauteur couche limite -REAL,DIMENSION(:,:,:),ALLOCATABLE :: ZZZ_GRID1 -REAL,DIMENSION(:,:),ALLOCATABLE :: ZTHVSOL,ZSHMIX -REAL,DIMENSION(:,:,:),ALLOCATABLE :: ZZONWIND,ZMERWIND,ZFFWIND2,ZRIB -! -!------------------------------------------------------------------------------- -! -!* 0. ARRAYS BOUNDS INITIALIZATION -! -CALL GET_DIM_EXT_ll ('B',IIU,IJU) -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKU=NKMAX+2*JPVEXT -IKB=1+JPVEXT -IKE=IKU-JPVEXT - -IMI = GET_CURRENT_MODEL_INDEX() -ILUOUT0 = TLUOUT0%NLU -TZRSFILE => NULL() -!------------------------------------------------------------------------------- -! -!* 1. WRITES IN THE LFI FILE -! ---------------------- -! -!* 1.0 TPFILE%CNAME and HDADFILE : -! -CALL IO_Field_write(TPFILE,'MASDEV', NMASDEV) -CALL IO_Field_write(TPFILE,'BUGFIX', NBUGFIX) -CALL IO_Field_write(TPFILE,'BIBUSER', CBIBUSER) -CALL IO_Field_write(TPFILE,'PROGRAM', CPROGRAM) -! -CALL IO_Field_write(TPFILE,'L1D', L1D) -CALL IO_Field_write(TPFILE,'L2D', L2D) -CALL IO_Field_write(TPFILE,'PACK', LPACK) -! -CALL IO_Field_write(TPFILE,'MY_NAME', TPFILE%CNAME) -CALL IO_Field_write(TPFILE,'DAD_NAME', HDADFILE) -! -IF (LEN_TRIM(HDADFILE)>0) THEN - CALL IO_Field_write(TPFILE,'DXRATIO',NDXRATIO_ALL(1)) - CALL IO_Field_write(TPFILE,'DYRATIO',NDYRATIO_ALL(1)) - CALL IO_Field_write(TPFILE,'XOR', NXOR_ALL(1)) - CALL IO_Field_write(TPFILE,'YOR', NYOR_ALL(1)) -END IF -! -CALL IO_Field_write(TPFILE,'SURF', CSURF) -! -!* 1.1 Type and Dimensions : -! -CALL IO_Field_write(TPFILE,'STORAGE_TYPE','DI') -! -CALL IO_Field_write(TPFILE,'IMAX',NIMAX_ll) -CALL IO_Field_write(TPFILE,'JMAX',NJMAX_ll) -CALL IO_Field_write(TPFILE,'KMAX',NKMAX) -! -CALL IO_Field_write(TPFILE,'JPHEXT',JPHEXT) -! -!* 1.2 Grid variables : -! -IF (.NOT.LCARTESIAN) THEN - CALL IO_Field_write(TPFILE,'RPK', XRPK) - CALL IO_Field_write(TPFILE,'LONORI',XLONORI) - CALL IO_Field_write(TPFILE,'LATORI',XLATORI) -! -!* diagnostic of 1st mass point -! - CALL SM_LATLON( XLATORI, XLONORI, XHATM_BOUND(NEXTE_XMIN), XHATM_BOUND(NEXTE_YMIN), ZLATOR, ZLONOR ) -! - CALL IO_Field_write(TPFILE,'LONOR',ZLONOR) - CALL IO_Field_write(TPFILE,'LATOR',ZLATOR) -! -END IF -! -CALL IO_Field_write(TPFILE,'THINSHELL',LTHINSHELL) -CALL IO_Field_write(TPFILE,'LAT0',XLAT0) -CALL IO_Field_write(TPFILE,'LON0',XLON0) -CALL IO_Field_write(TPFILE,'BETA',XBETA) -! -CALL IO_Field_write(TPFILE,'XHAT',XXHAT) -CALL IO_Field_write(TPFILE,'YHAT',XYHAT) -CALL IO_Field_write(TPFILE,'ZHAT',XZHAT) -CALL IO_Field_write(TPFILE,'ZTOP',XZTOP) -! -CALL IO_Field_write(TPFILE,'ZS', XZS) -CALL IO_Field_write(TPFILE,'ZWS', XZWS) -CALL IO_Field_write(TPFILE,'ZSMT', XZSMT) -CALL IO_Field_write(TPFILE,'SLEVE',LSLEVE) -! -IF (LSLEVE) THEN - CALL IO_Field_write(TPFILE,'LEN1',XLEN1) - CALL IO_Field_write(TPFILE,'LEN2',XLEN2) -END IF -! -! -CALL IO_Field_write(TPFILE,'DTMOD',TDTMOD) -CALL IO_Field_write(TPFILE,'DTCUR',TDTCUR) -CALL IO_Field_write(TPFILE,'DTEXP',TDTEXP) -CALL IO_Field_write(TPFILE,'DTSEG',TDTSEG) -! -!* 1.3 Configuration variables : -! -CALL IO_Field_write(TPFILE,'CARTESIAN',LCARTESIAN) -CALL IO_Field_write(TPFILE,'LBOUSS', LBOUSS) -CALL IO_Field_write(TPFILE,'LOCEAN', LOCEAN) -CALL IO_Field_write(TPFILE,'LCOUPLES', LCOUPLES) -! -IF (LCARTESIAN .AND. LWIND_ZM) THEN - LWIND_ZM=.FALSE. - PRINT*,'YOU ARE IN CARTESIAN GEOMETRY SO LWIND_ZM IS FORCED TO FALSE' -END IF -!* 1.4 Reference state variables : -! -IF (LCOUPLES.AND.LOCEAN) THEN - CALL IO_Field_write(TPFILE,'RHOREFZ',XRHODREFZO) - CALL IO_Field_write(TPFILE,'THVREFZ',XTHVREFZO) - CALL IO_Field_write(TPFILE,'EXNTOP', XEXNTOPO) -ELSE - CALL IO_Field_write(TPFILE,'RHOREFZ',XRHODREFZ) - CALL IO_Field_write(TPFILE,'THVREFZ',XTHVREFZ) - CALL IO_Field_write(TPFILE,'EXNTOP', XEXNTOP) -END IF -! -CALL IO_Field_write(TPFILE,'RHODREF',XRHODREF) -CALL IO_Field_write(TPFILE,'THVREF', XTHVREF) -! -! -!* 1.5 Variables necessary for plots -! -! PABST,THT,POVOM for cross sections at constant pressure -! level or constant theta level or constant PV level -! -IF (INDEX(CISO,'PR') /= 0) THEN - CALL IO_Field_write(TPFILE,'PABST',XPABST) -END IF -! -IF (INDEX(CISO,'TK') /= 0) THEN - CALL IO_Field_write(TPFILE,'THT',XTHT) -END IF -! -ZCORIOZ(:,:,:)=SPREAD( XCORIOZ(:,:),DIM=3,NCOPIES=IKU ) -ZVOX(:,:,:)=GY_W_VW(XWT,XDYY,XDZZ,XDZY)-GZ_V_VW(XVT,XDZZ) -ZVOX(:,:,2)=ZVOX(:,:,3) -ZVOY(:,:,:)=GZ_U_UW(XUT,XDZZ)-GX_W_UW(XWT,XDXX,XDZZ,XDZX) -ZVOY(:,:,2)=ZVOY(:,:,3) -ZVOZ(:,:,:)=GX_V_UV(XVT,XDXX,XDZZ,XDZX)-GY_U_UV(XUT,XDYY,XDZZ,XDZY) -ZVOZ(:,:,2)=ZVOZ(:,:,3) -ZVOZ(:,:,1)=ZVOZ(:,:,3) -ZWORK31(:,:,:)=GX_M_M(XTHT,XDXX,XDZZ,XDZX) -ZWORK32(:,:,:)=GY_M_M(XTHT,XDYY,XDZZ,XDZY) -ZWORK33(:,:,:)=GZ_M_M(XTHT,XDZZ) -ZPOVO(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:))) & - + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & - + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) -ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:) -ZPOVO(:,:,1) =-1.E+11 -ZPOVO(:,:,IKU)=-1.E+11 -IF (INDEX(CISO,'EV') /= 0) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'POVOT', & - CSTDNAME = '', & - CLONGNAME = 'POVOT', & - CUNITS = 'PVU', & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_POtential VOrticity', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZPOVO) -END IF -! -! -IF (LVAR_RS) THEN - CALL IO_Field_write(TPFILE,'UT',XUT) - CALL IO_Field_write(TPFILE,'VT',XVT) - ! - IF (LWIND_ZM) THEN - TZFIELD2(1) = TFIELDMETADATA( & - CMNHNAME = 'UM_ZM', & - CSTDNAME = '', & - CLONGNAME = 'UM_ZM', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'Zonal component of horizontal wind', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - TZFIELD2(2) = TFIELDMETADATA( & - CMNHNAME = 'VM_ZM', & - CSTDNAME = '', & - CLONGNAME = 'VM_ZM', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'Meridian component of horizontal wind', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - CALL UV_TO_ZONAL_AND_MERID(XUT,XVT,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2) - END IF - ! - CALL IO_Field_write(TPFILE,'WT',XWT) - ! - ! write mixing ratio for water vapor required to plot radio-soundings - ! - IF (LUSERV) THEN - CALL IO_Field_write(TPFILE,'RVT',XRT(:,:,:,IDX_RVT)) - END IF -END IF -! -!* Latitude and Longitude arrays -! -IF (.NOT.LCARTESIAN) THEN - CALL IO_Field_write(TPFILE,'LAT',XLAT) - CALL IO_Field_write(TPFILE,'LON',XLON) -END IF -! -! -!------------------------------------------------------------------------------- -! -!* 1.6 Other pronostic variables -! -ZTEMP(:,:,:)=XTHT(:,:,:)*(XPABST(:,:,:)/ XP00) **(XRD/XCPD) -! -IF (LVAR_TURB) THEN - IF (CTURB /= 'NONE') THEN - CALL IO_Field_write(TPFILE,'TKET',XTKET) - ! - IF( NRR > 1 ) THEN - CALL IO_Field_write(TPFILE,'SRCT',XSRCT) - CALL IO_Field_write(TPFILE,'SIGS',XSIGS) - END IF - ! - IF(CTOM=='TM06') THEN - CALL IO_Field_write(TPFILE,'BL_DEPTH',XBL_DEPTH) - END IF - END IF -END IF -! -!* Rains -! -IF (LVAR_PR .AND. LUSERR .AND. SIZE(XINPRR)>0 ) THEN - ! - ! explicit species - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_write(TPFILE,TZFIELD,XINPRR*3.6E6) - ! - CALL IO_Field_write(TPFILE,'INPRR3D',XINPRR3D) - CALL IO_Field_write(TPFILE,'EVAP3D', XEVAP3D) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm' - CALL IO_Field_write(TPFILE,TZFIELD,XACPRR*1.0E3) - ! - IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR.& - CCLOUD == 'KHKO' .OR. CCLOUD == 'LIMA') THEN - IF (SIZE(XINPRC) /= 0 ) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_write(TPFILE,TZFIELD,XINPRC*3.6E6) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm' - CALL IO_Field_write(TPFILE,TZFIELD,XACPRC*1.0E3) - END IF - IF (SIZE(XINDEP) /= 0 ) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_write(TPFILE,TZFIELD,XINDEP*3.6E6) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm' - CALL IO_Field_write(TPFILE,TZFIELD,XACDEP*1.0E3) - END IF - END IF - IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'LIMA') THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_write(TPFILE,TZFIELD,XINPRS*3.6E6) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm' - CALL IO_Field_write(TPFILE,TZFIELD,XACPRS*1.0E3) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_write(TPFILE,TZFIELD,XINPRG*3.6E6) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm' - CALL IO_Field_write(TPFILE,TZFIELD,XACPRG*1.0E3) - ! - IF (SIZE(XINPRH) /= 0 ) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_write(TPFILE,TZFIELD,XINPRH*3.6E6) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm' - CALL IO_Field_write(TPFILE,TZFIELD,XACPRH*1.0E3) - ENDIF - ! - ZWORK21(:,:) = XINPRR(:,:) + XINPRS(:,:) + XINPRG(:,:) - IF (SIZE(XINPRC) /= 0 ) & - ZWORK21(:,:) = ZWORK21(:,:) + XINPRC(:,:) - IF (SIZE(XINPRH) /= 0 ) & - ZWORK21(:,:) = ZWORK21(:,:) + XINPRH(:,:) - CALL FIND_FIELD_ID_FROM_MNHNAME('INPRT',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21*3.6E6) - ! - ZWORK21(:,:) = XACPRR(:,:) + XACPRS(:,:) + XACPRG(:,:) - IF (SIZE(XINPRC) /= 0 ) & - ZWORK21(:,:) = ZWORK21(:,:) + XACPRC(:,:) - IF (SIZE(XINPRH) /= 0 ) & - ZWORK21(:,:) = ZWORK21(:,:) + XACPRH(:,:) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRT',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm' - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21*1.0E3) - ! - END IF - ! - !* Convective rain - ! - IF (CDCONV /= 'NONE') THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_write(TPFILE,TZFIELD,XPRCONV*3.6E6) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm' - CALL IO_Field_write(TPFILE,TZFIELD,XPACCONV*1.0E3) - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'mm hour-1' - CALL IO_Field_write(TPFILE,TZFIELD,XPRSCONV*3.6E6) - END IF -END IF -IF (LVAR_PR ) THEN - !Precipitable water in kg/m**2 - ZWORK21(:,:) = 0. - ZWORK22(:,:) = 0. - ZWORK23(:,:) = 0. - ZWORK31(:,:,:) = DZF(XZZ(:,:,:)) - DO JK = IKB,IKE - !* Calcul de qtot - IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN - ZWORK23(IIB:IIE,IJB:IJE) = XRT(IIB:IIE,IJB:IJE,JK,1) + & - XRT(IIB:IIE,IJB:IJE,JK,2) + XRT(IIB:IIE,IJB:IJE,JK,3) + & - XRT(IIB:IIE,IJB:IJE,JK,4) + XRT(IIB:IIE,IJB:IJE,JK,5) + & - XRT(IIB:IIE,IJB:IJE,JK,6) - ELSE - ZWORK23(IIB:IIE,IJB:IJE) = XRT(IIB:IIE,IJB:IJE,JK,1) - ENDIF - !* Calcul de l'eau precipitable - ZWORK21(IIB:IIE,IJB:IJE)=XRHODREF(IIB:IIE,IJB:IJE,JK)* & - ZWORK23(IIB:IIE,IJB:IJE)* ZWORK31(IIB:IIE,IJB:IJE,JK) - !* Sum - ZWORK22(IIB:IIE,IJB:IJE) = ZWORK22(IIB:IIE,IJB:IJE)+ZWORK21(IIB:IIE,IJB:IJE) - ZWORK21(:,:) = 0. - ZWORK23(:,:) = 0. - END DO - !* Precipitable water in kg/m**2 - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'PRECIP_WAT', & - CSTDNAME = '', & - CLONGNAME = 'PRECIP_WAT', & - CUNITS = 'kg m-2', & - CDIR = 'XY', & - CCOMMENT = '', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) -ENDIF -! -! -!* Flux d'humidite et d'hydrometeores -IF (LHU_FLX) THEN - ZWORK35(:,:,:) = XRHODREF(:,:,:) * XRT(:,:,:,1) - ZWORK31(:,:,:) = MXM(ZWORK35(:,:,:)) * XUT(:,:,:) - ZWORK32(:,:,:) = MYM(ZWORK35(:,:,:)) * XVT(:,:,:) - ZWORK35(:,:,:) = GX_U_M(ZWORK31,XDXX,XDZZ,XDZX) + GY_V_M(ZWORK32,XDYY,XDZZ,XDZY) - IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN - ZWORK36(:,:,:) = ZWORK35(:,:,:) + XRHODREF(:,:,:) * (XRT(:,:,:,2) + & - XRT(:,:,:,3) + XRT(:,:,:,4) + XRT(:,:,:,5) + XRT(:,:,:,6)) - ZWORK33(:,:,:) = MXM(ZWORK36(:,:,:)) * XUT(:,:,:) - ZWORK34(:,:,:) = MYM(ZWORK36(:,:,:)) * XVT(:,:,:) - ZWORK36(:,:,:) = GX_U_M(ZWORK33,XDXX,XDZZ,XDZX) + GY_V_M(ZWORK34,XDYY,XDZZ,XDZY) - ENDIF - ! - ! Integration sur 3000 m - ! - IKTOP(:,:)=0 - DO JK=1,IKU-1 - WHERE (((XZZ(:,:,JK) -XZS(:,:))<= 3000.0) .AND. ((XZZ(:,:,JK+1) -XZS(:,:))> 3000.0)) - IKTOP(:,:)=JK - END WHERE - END DO - ZDELTAZ(:,:,:)=DZF(XZZ) - ZWORK21(:,:) = 0. - ZWORK22(:,:) = 0. - ZWORK25(:,:) = 0. - DO JJ=1,IJU - DO JI=1,IIU - IAUX=IKTOP(JI,JJ) - DO JK=IKB,IAUX-1 - ZWORK21(JI,JJ) = ZWORK21(JI,JJ) + ZWORK31(JI,JJ,JK) * ZDELTAZ(JI,JJ,JK) - ZWORK22(JI,JJ) = ZWORK22(JI,JJ) + ZWORK32(JI,JJ,JK) * ZDELTAZ(JI,JJ,JK) - ZWORK25(JI,JJ) = ZWORK25(JI,JJ) + ZWORK35(JI,JJ,JK) * ZDELTAZ(JI,JJ,JK) - ENDDO - IF (IAUX >= IKB) THEN - ZDELTAZ(JI,JJ,IAUX)= 3000. - (XZZ(JI,JJ,IAUX) -XZS(JI,JJ)) - ZWORK21(JI,JJ) = ZWORK21(JI,JJ) + ZWORK31(JI,JJ,IAUX) * ZDELTAZ(JI,JJ,IAUX) - ZWORK22(JI,JJ) = ZWORK22(JI,JJ) + ZWORK32(JI,JJ,IAUX) * ZDELTAZ(JI,JJ,IAUX) - ZWORK25(JI,JJ) = ZWORK25(JI,JJ) + ZWORK35(JI,JJ,IAUX) * ZDELTAZ(JI,JJ,IAUX) - ENDIF - ENDDO - ENDDO - IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN - ZWORK23(:,:) = 0. - ZWORK24(:,:) = 0. - ZWORK26(:,:) = 0. - DO JJ=1,IJU - DO JI=1,IIU - IAUX=IKTOP(JI,JJ) - DO JK=IKB,IAUX-1 - ZWORK23(JI,JJ) = ZWORK23(JI,JJ) + ZWORK33(JI,JJ,JK) * ZDELTAZ(JI,JJ,JK) - ZWORK24(JI,JJ) = ZWORK24(JI,JJ) + ZWORK34(JI,JJ,JK) * ZDELTAZ(JI,JJ,JK) - ZWORK26(JI,JJ) = ZWORK26(JI,JJ) + ZWORK36(JI,JJ,JK) * ZDELTAZ(JI,JJ,JK) - ENDDO - IF (IAUX >= IKB) THEN - ZDELTAZ(JI,JJ,IAUX)= 3000. - (XZZ(JI,JJ,IAUX) -XZS(JI,JJ)) - ZWORK23(JI,JJ) = ZWORK23(JI,JJ) + ZWORK33(JI,JJ,IAUX) * ZDELTAZ(JI,JJ,IAUX) - ZWORK24(JI,JJ) = ZWORK24(JI,JJ) + ZWORK34(JI,JJ,IAUX) * ZDELTAZ(JI,JJ,IAUX) - ZWORK26(JI,JJ) = ZWORK26(JI,JJ) + ZWORK36(JI,JJ,IAUX) * ZDELTAZ(JI,JJ,IAUX) - ENDIF - ENDDO - ENDDO - ENDIF - ! Ecriture - ! composantes U et V du flux surfacique d'humidite - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'UM90', & - CSTDNAME = '', & - CLONGNAME = 'UM90', & - CUNITS = 'kg s-1 m-2', & - CDIR = 'XY', & - CCOMMENT = '', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VM90', & - CSTDNAME = '', & - CLONGNAME = 'VM90', & - CUNITS = 'kg s-1 m-2', & - CDIR = 'XY', & - CCOMMENT = '', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) - ! composantes U et V du flux d'humidite integre sur 3000 metres - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'UM91', & - CSTDNAME = '', & - CLONGNAME = 'UM91', & - CUNITS = 'kg s-1 m-1', & - CDIR = 'XY', & - CCOMMENT = '', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VM91', & - CSTDNAME = '', & - CLONGNAME = 'VM91', & - CUNITS = 'kg s-1 m-1', & - CDIR = 'XY', & - CCOMMENT = '', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) - ! - ! Convergence d'humidite - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'HMCONV', & - CSTDNAME = '', & - CLONGNAME = 'HMCONV', & - CUNITS = 'kg s-1 m-3', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Horizontal CONVergence of moisture flux', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK35) - ! - ! Convergence d'humidite integre sur 3000 metres - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'HMCONV3000', & - CSTDNAME = '', & - CLONGNAME = 'HMCONV3000', & - CUNITS = 'kg s-1 m-3', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Horizontal CONVergence of moisture flux', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK25) - ! - IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN - ! composantes U et V du flux surfacique d'hydrometeores - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'UM92', & - CSTDNAME = '', & - CLONGNAME = 'UM92', & - CUNITS = 'kg s-1 m-2', & - CDIR = 'XY', & - CCOMMENT = '', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VM92', & - CSTDNAME = '', & - CLONGNAME = 'VM92', & - CUNITS = 'kg s-1 m-2', & - CDIR = 'XY', & - CCOMMENT = '', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34) - ! composantes U et V du flux d'hydrometeores integre sur 3000 metres - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'UM93', & - CSTDNAME = '', & - CLONGNAME = 'UM93', & - CUNITS = 'kg s-1 m-1', & - CDIR = 'XY', & - CCOMMENT = '', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK23) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VM93', & - CSTDNAME = '', & - CLONGNAME = 'VM93', & - CUNITS = 'kg s-1 m-1', & - CDIR = 'XY', & - CCOMMENT = '', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK24) - ! Convergence d'hydrometeores - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'HMCONV_TT', & - CSTDNAME = '', & - CLONGNAME = 'HMCONV_TT', & - CUNITS = 'kg s-1 m-3', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Horizontal CONVergence of hydrometeor flux', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK36) - ! Convergence d'hydrometeores integre sur 3000 metres - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'HMCONV3000_TT', & - CSTDNAME = '', & - CLONGNAME = 'HMCONV3000_TT', & - CUNITS = 'kg s-1 m-3', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Horizontal CONVergence of hydrometeor flux', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK26) - ENDIF -ENDIF -! -!* Moist variables -! -IF (LVAR_MRW .OR. LLIMA_DIAG) THEN - IF (NRR >=1) THEN - ! Moist variables are written individually in file - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic for moist variables', & !Temporary name to ease identification - CSTDNAME = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - IF (LUSERV) THEN - TZFIELD%CMNHNAME = 'MRV' - TZFIELD%CLONGNAME = 'MRV' - TZFIELD%CUNITS = 'g kg-1' - TZFIELD%CCOMMENT = 'X_Y_Z_MRV' - CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RVT)*1.E3) - END IF - IF (LUSERC) THEN - TZFIELD%CMNHNAME = 'MRC' - TZFIELD%CLONGNAME = 'MRC' - TZFIELD%CUNITS = 'g kg-1' - TZFIELD%CCOMMENT = 'X_Y_Z_MRC' - CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RCT)*1.E3) -! - TZFIELD%CMNHNAME = 'VRC' - TZFIELD%CLONGNAME = 'VRC' - TZFIELD%CUNITS = 'ppv' !vol/vol - TZFIELD%CCOMMENT = 'X_Y_Z_VRC (vol/vol)' - CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RCT)*XRHODREF(:,:,:)/1.E3) - END IF - IF (LUSERR) THEN - TZFIELD%CMNHNAME = 'MRR' - TZFIELD%CLONGNAME = 'MRR' - TZFIELD%CUNITS = 'g kg-1' - TZFIELD%CCOMMENT = 'X_Y_Z_MRR' - CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RRT)*1.E3) -! - TZFIELD%CMNHNAME = 'VRR' - TZFIELD%CLONGNAME = 'VRR' - TZFIELD%CUNITS = 'ppv' !vol/vol - TZFIELD%CCOMMENT = 'X_Y_Z_VRR (vol/vol)' - CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RRT)*XRHODREF(:,:,:)/1.E3) - END IF - IF (LUSERI) THEN - TZFIELD%CMNHNAME = 'MRI' - TZFIELD%CLONGNAME = 'MRI' - TZFIELD%CUNITS = 'g kg-1' - TZFIELD%CCOMMENT = 'X_Y_Z_MRI' - CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RIT)*1.E3) -! - IF (LUSECI) THEN - CALL IO_Field_write(TPFILE,'CIT',XCIT(:,:,:)) - END IF - END IF - IF (LUSERS) THEN - TZFIELD%CMNHNAME = 'MRS' - TZFIELD%CLONGNAME = 'MRS' - TZFIELD%CUNITS = 'g kg-1' - TZFIELD%CCOMMENT = 'X_Y_Z_MRS' - CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RST)*1.E3) - END IF - IF (LUSERG) THEN - TZFIELD%CMNHNAME = 'MRG' - TZFIELD%CLONGNAME = 'MRG' - TZFIELD%CUNITS = 'g kg-1' - TZFIELD%CCOMMENT = 'X_Y_Z_MRG' - CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RGT)*1.E3) - END IF - IF (LUSERH) THEN - TZFIELD%CMNHNAME = 'MRH' - TZFIELD%CLONGNAME = 'MRH' - TZFIELD%CUNITS = 'g kg-1' - TZFIELD%CCOMMENT = 'X_Y_Z_MRH' - CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RHT)*1.E3) - END IF - END IF -END IF -! -!* Scalar Variables -! -! User scalar variables -! individually in the file -IF (LVAR_MRSV) THEN - DO JSV = 1,NSV_USER - TZFIELD = TSVLIST(JSV) - WRITE( TZFIELD%CMNHNAME, '( A4, I3.3 )' ) 'MRSV', JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'g kg-1' - WRITE( TZFIELD%CCOMMENT, '( A, I3.3 )' ) 'Mixing Ratio for user Scalar Variable', JSV - CALL IO_Field_write( TPFILE, TZFIELD, XSVT(:,:,:,JSV) * 1.E3 ) - END DO -END IF -! microphysical C2R2 scheme scalar variables -IF(LVAR_MRW) THEN - DO JSV = NSV_C2R2BEG,NSV_C2R2END - TZFIELD = TSVLIST(JSV) - IF (JSV < NSV_C2R2END) THEN - TZFIELD%CUNITS = 'cm-3' - ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-6 - ELSE - TZFIELD%CUNITS = 'l-1' - ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-3 - END IF - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','MRSV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END DO - ! microphysical C3R5 scheme additional scalar variables - DO JSV = NSV_C1R3BEG,NSV_C1R3END - TZFIELD = TSVLIST(JSV) - TZFIELD%CUNITS = 'l-1' - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E-3) - END DO -END IF -! -! microphysical LIMA scheme scalar variables -! -IF (LLIMA_DIAG) THEN - IF (NSV_LIMA_END>=NSV_LIMA_BEG) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic LIMA diag', & !Temporary name to ease identification - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - END IF - ! - DO JSV = NSV_LIMA_BEG,NSV_LIMA_END - ! - TZFIELD%CUNITS = 'cm-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - ! -! Nc - IF (JSV .EQ. NSV_LIMA_NC) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(1)) - END IF -! Nr - IF (JSV .EQ. NSV_LIMA_NR) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(2)) - END IF -! N CCN free - IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(3))//INDICE - END IF -! N CCN acti - IF (JSV .GE. NSV_LIMA_CCN_ACTI .AND. JSV .LT. NSV_LIMA_CCN_ACTI + NMOD_CCN) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(4))//INDICE - END IF -! Scavenging - IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN - TZFIELD%CMNHNAME = TRIM(CAERO_MASS(1)) - TZFIELD%CUNITS = 'kg cm-3' - END IF -! Ni - IF (JSV .EQ. NSV_LIMA_NI) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(1)) - END IF -! Ns - IF (JSV .EQ. NSV_LIMA_NS) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(2)) - END IF -! Ng - IF (JSV .EQ. NSV_LIMA_NG) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(3)) - END IF -! Nh - IF (JSV .EQ. NSV_LIMA_NH) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(4)) - END IF -! N IFN free - IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(5))//INDICE - END IF -! N IFN nucl - IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(6))//INDICE - END IF -! N IMM nucl - IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN - WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(JSV - NSV_LIMA_IMM_NUCL + 1)) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(7))//INDICE - END IF -! Hom. freez. of CCN - IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(8)) - END IF - ! -! Supersaturation - IF (JSV .EQ. NSV_LIMA_SPRO) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(5)) - END IF - ! - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-6*XRHODREF(:,:,:) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END DO -! - IF (LUSERC) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'LWC', & - CSTDNAME = '', & - CLONGNAME = 'LWC', & - CUNITS = 'g m-3', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_LWC', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ZWORK31(:,:,:)=XRT(:,:,:,2)*1.E3*XRHODREF(:,:,:) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END IF -! - IF (LUSERI) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'IWC', & - CSTDNAME = '', & - CLONGNAME = 'IWC', & - CUNITS = 'g m-3', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_MRI', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ZWORK31(:,:,:)=XRT(:,:,:,4)*1.E3*XRHODREF(:,:,:) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END IF -! -END IF -IF (LELECDIAG .AND. CELEC .NE. "NONE") THEN - DO JSV = NSV_ELECBEG,NSV_ELECEND - TZFIELD = TSVLIST(JSV) - IF ( JSV > NSV_ELECBEG .AND. JSV < NSV_ELECEND ) THEN - TZFIELD%CUNITS = 'C m-3' - WRITE( TZFIELD%CCOMMENT, '( A6, A3, I3.3 )' ) 'X_Y_Z_', 'SVT', JSV - ELSE - TZFIELD%CUNITS = 'm-3' - WRITE( TZFIELD%CCOMMENT, '( A6, A3, I3.3, A8 )' ) 'X_Y_Z_', 'SVT', JSV, ' (nb ions/m3)' - END IF - ZWORK31(:,:,:)=XSVT(:,:,:,JSV) * XRHODREF(:,:,:) ! C/kg --> C/m3 - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END DO -END IF -! -! Lagrangian variables -IF (LTRAJ) THEN - DO JSV = NSV_LGBEG, NSV_LGEND - TZFIELD = TSVLIST(JSV) - WRITE(TZFIELD%CCOMMENT,'(A6,A20,I3.3,A4)')'X_Y_Z_','Lagrangian variable ',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - END DO - - ! X coordinate - DO JK=1,IKU - DO JJ=1,IJU - ZWORK31(:,JJ,JK) = 1E-3*XXHATM(:) - END DO - END DO - - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'X', & - CSTDNAME = '', & - CLONGNAME = 'X', & - CUNITS = 'km', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_X coordinate', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - - ! Y coordinate - DO JK=1,IKU - DO JI=1,IIU - ZWORK31(JI,:,JK) = 1E-3 * XYHATM(:) - END DO - END DO - - TZFIELD%CMNHNAME = 'Y' - TZFIELD%CLONGNAME = 'Y' - TZFIELD%CCOMMENT = 'X_Y_Z_Y coordinate' - - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -END IF -! -! Passive polluant scalar variables -IF (LPASPOL) THEN - ALLOCATE(ZRHOT( SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3))) - ALLOCATE(ZTMP( SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3))) -! -!* Density -! - ZRHOT(:,:,:)=XPABST(:,:,:)/(XRD*XTHT(:,:,:)*((XPABST(:,:,:)/XP00)**(XRD/XCPD))) -! -!* Conversion g/m3. -! - ZRHOT(:,:,:)=ZRHOT(:,:,:)*1000.0 - ! - DO JSV = NSV_PPBEG, NSV_PPEND - TZFIELD = TSVLIST(JSV) - TZFIELD%CUNITS = 'g m-3' - - ZTMP(:,:,:)=ABS( XSVT(:,:,:,JSV)*ZRHOT(:,:,:) ) - CALL IO_Field_write(TPFILE,TZFIELD,ZTMP) - END DO - - DEALLOCATE(ZTMP) - DEALLOCATE(ZRHOT) -END IF -! Conditional sampling variables -IF (LCONDSAMP) THEN - DO JSV = NSV_CSBEG, NSV_CSEND - TZFIELD = TSVLIST(JSV) - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - END DO -END IF -! chemical scalar variables in gas phase ppb -IF (LCHEMDIAG) THEN - DO JSV = NSV_CHGSBEG,NSV_CHGSEND - TZFIELD = TSVLIST(JSV) - TZFIELD%CUNITS = 'ppb' - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHIM',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) - END DO -END IF -IF (LCHAQDIAG) THEN !aqueous concentration in M - ZWORK31(:,:,:)=0. - DO JSV = NSV_CHACBEG, NSV_CHACBEG-1+NEQAQ/2 !cloud water - TZFIELD = TSVLIST(JSV) - TZFIELD%CUNITS = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1 - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHAQ',JSV - WHERE(((XRT(:,:,:,2)*XRHODREF(:,:,:))/1.e3) .GE. XRTMIN_AQ) - ZWORK31(:,:,:)=(XSVT(:,:,:,JSV)*1000.)/(XMD*1.E+3*XRT(:,:,:,2)) - ENDWHERE - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END DO - ! - ZWORK31(:,:,:)=0. - DO JSV = NSV_CHACBEG+NEQAQ/2, NSV_CHACEND !rain water - TZFIELD = TSVLIST(JSV) - TZFIELD%CUNITS = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1 - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHAQ',JSV - WHERE(((XRT(:,:,:,3)*XRHODREF(:,:,:))/1.e3) .GE. XRTMIN_AQ) - ZWORK31(:,:,:)=(XSVT(:,:,:,JSV)*1000.)/(XMD*1.E+3*XRT(:,:,:,3)) - ENDWHERE - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END DO - - - - -! ZWORK31(:,:,:)=0. -! DO JSV = NSV_CHICBEG,NSV_CHICEND ! ice phase -! TZFIELD%CMNHNAME = TRIM(CICNAMES(JSV-NSV_CHICBEG+1)) -! TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) -! WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3,A4)')'X_Y_Z_','CHIC',JSV,' (M)' -! WHERE(((XRT(:,:,:,3)*XRHODREF(:,:,:))/1.e3) .GE. XRTMIN_AQ) -! ZWORK31(:,:,:)=(XSVT(:,:,:,JSV)*1000.)/(XMD*1.E+3*XRT(:,:,:,3)) -! ENDWHERE -! CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -! END DO -END IF -! Aerosol -IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN - DO JSV = NSV_AERBEG, NSV_AEREND - TZFIELD = TSVLIST(JSV) - TZFIELD%CUNITS = 'ppb' - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','AERO',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) - END DO - ! - IF (.NOT.(ASSOCIATED(XN3D))) & - ALLOCATE(XN3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XRG3D))) & - ALLOCATE(XRG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XSIG3D))) & - ALLOCATE(XSIG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - ! - IF (CRGUNIT=="MASS") THEN - XRG3D(:,:,:,1) = XINIRADIUSI * EXP(-3.*(LOG(XINISIGI))**2) - XRG3D(:,:,:,2) = XINIRADIUSJ * EXP(-3.*(LOG(XINISIGJ))**2) - ELSE - XRG3D(:,:,:,1) = XINIRADIUSI - XRG3D(:,:,:,2) = XINIRADIUSJ - END IF - XSIG3D(:,:,:,1) = XINISIGI - XSIG3D(:,:,:,2) = XINISIGJ - XN3D(:,:,:,1) = XN0IMIN - XN3D(:,:,:,2) = XN0JMIN - - ZPTOTA(:,:,:,:,:) = 0. - - CALL PPP2AERO(XSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_AERBEG:NSV_AEREND),& - XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & - PSIG3D=XSIG3D(IIB:IIE,IJB:IJE,IKB:IKE,:),& - PRG3D=XRG3D(IIB:IIE,IJB:IJE,IKB:IKE,:),& - PN3D=XN3D(IIB:IIE,IJB:IJE,IKB:IKE,:),& - PCTOTA=ZPTOTA(IIB:IIE,IJB:IJE,IKB:IKE,:,:)) - - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic for aerosol modes', & - CSTDNAME = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - - DO JJ=1,JPMODE - WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'RGA',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'RG (nb) AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,XRG3D(:,:,:,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'RGAM',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A20,I1)')'RG (m) AEROSOL MODE ',JJ - ZWORK31(:,:,:)=XRG3D(:,:,:,JJ) / (EXP(-3.*(LOG(XSIG3D(:,:,:,JJ)))**2)) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! - WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'N0A',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'cm-3' - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,XN3D(:,:,:,JJ)*1.E-6) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SIGA',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '1' - WRITE(TZFIELD%CCOMMENT,'(A19,I1)')'SIGMA AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,XSIG3D(:,:,:,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MSO4',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS SO4 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SO4,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNO3',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NO3 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NO3,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNH3',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NH3 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NH3,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MH2O',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS H2O AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_H2O,JJ)) - ! - IF (NSOA .EQ. 10) THEN - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA1',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA1 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA1,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA2',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA2 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA2,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA3',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA3 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA3,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA4',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA4 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA4,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA5',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA5 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA5,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA6',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA6 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA6,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA7',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA7 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA7,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA8',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA8 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA8,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA9',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA9 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA9,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'MSOA10',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA10,JJ)) - END IF - ! - WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MOC',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS OC AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_OC,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MBC',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS BC AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_BC,JJ)) - ENDDO -END IF -! Dust variables -IF (LDUST) THEN - IF(.NOT.ALLOCATED(ZSIG_DST)) & - ALLOCATE(ZSIG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) - IF(.NOT.ALLOCATED(ZRG_DST)) & - ALLOCATE(ZRG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) - IF(.NOT.ALLOCATED(ZN0_DST)) & - ALLOCATE(ZN0_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) - ! - DO JSV = NSV_DSTBEG, NSV_DSTEND - TZFIELD = TSVLIST(JSV) - TZFIELD%CUNITS = 'ppb' - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','DUST',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) - END DO - ! - CALL PPP2DUST(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND),XRHODREF,& - PSIG3D=ZSIG_DST, PRG3D=ZRG_DST, PN3D=ZN0_DST) - - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic for dust modes', & - CSTDNAME = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - - TZFIELD2D = TFIELDMETADATA( & - CMNHNAME = 'generic for dust modes', & - CSTDNAME = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - - DO JJ=1,NMODE_DST - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTRGA',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) DUST MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZRG_DST(:,:,:,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTRGAM',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) DUST MODE ',JJ - ZWORK31(:,:,:)=ZRG_DST(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_DST(:,:,:,JJ)))**2)) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTN0A',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm-3' - WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 DUST MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZN0_DST(:,:,:,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTSIGA',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '1' - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA DUST MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_DST(:,:,:,JJ)) - !DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'DSTMSS',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A14,I1)')'MASSCONC MODE ',JJ - ZWORK31(:,:,:)= ZN0_DST(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - !DUST BURDEN (g/m2) - ZWORK21(:,:)=0.0 - DO JK=IKB,IKE - ZWORK31(:,:,JK) = ZWORK31(:,:,JK) *(XZZ(:,:,JK+1)-XZZ(:,:,JK)) & - *1.d-6 ! Convert to ug/m2-->g/m2 in each layer - END DO - ! - DO JK=IKB,IKE - DO JT=IJB,IJE - DO JI=IIB,IIE - ZWORK21(JI,JT)=ZWORK21(JI,JT)+ZWORK31(JI,JT,JK) - ENDDO - ENDDO - ENDDO - WRITE(TZFIELD2D%CMNHNAME,'(A7,I1)')'DSTBRDN',JJ - TZFIELD2D%CLONGNAME = TRIM(TZFIELD2D%CMNHNAME) - TZFIELD2D%CUNITS = 'g m-2' - WRITE(TZFIELD2D%CCOMMENT,'(A6,I1)')'BURDEN',JJ - CALL IO_Field_write(TPFILE,TZFIELD2D,ZWORK21) - ENDDO -END IF -IF (LDUST.AND.LDEPOS_DST(IMI)) THEN - DO JSV = NSV_DSTBEG, NSV_DSTEND - TZFIELD = TSVLIST(JSV) - TZFIELD%CUNITS = 'ppb' - WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_DUSTDEP', JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) - END DO - ! - ZSDSTDEP => XSVT(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic for dustdep modes', & - CSTDNAME = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - DO JJ=1,NMODE_DST - ! FOR CLOUDS - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ - TZFIELD%CUNITS = 'm-3' - ! CLOUD: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS - ZWORK31(:,:,:) = ZSDSTDEP(:,:,:,JJ) &!==>molec_{aer}/molec_{air} - *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} - *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} - /XDENSITY_DUST &!==>m3_{aer}/m3_{air} - *XM3TOUM3 &!==>um3_{aer}/m3_{air} - /(XPI*4./3.) !==>um3_{aer}/m3_{air} - !==>volume 3rd moment - !CLOUD: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS - ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & - ((ZRG_DST(:,:,:,JJ)**3)* & - EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2)) - !CLOUD: RETURN TO CONCENTRATION #/m3 - ZWORK31(:,:,:)= ZWORK31(:,:,:) * XMD/ & - (XAVOGADRO*XRHODREF(:,:,:)) - !CLOUD: Get number concentration (#/molec_{air}==>#/m3) - ZWORK31(:,:,:)= & - ZWORK31(:,:,:) & !#/molec_{air} - * XAVOGADRO & !==>#/mole - / XMD & !==>#/kg_{air} - * XRHODREF(:,:,:) !==>#/m3 - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! CLOUD: DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ - TZFIELD%CUNITS = 'ug m-3' - ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! FOR RAIN DROPS - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ+NMODE_DST - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_DST - TZFIELD%CUNITS = 'm-3' - ! RAIN: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS - ZWORK31(:,:,:)=ZSDSTDEP(:,:,:,JJ+NMODE_DST) &!==>molec_{aer}/molec_{air} - *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} - *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} - *(1.d0/XDENSITY_DUST) &!==>m3_{aer}/m3_{air} - *XM3TOUM3 &!==>um3_{aer}/m3_{air} - /(XPI*4./3.) !==>um3_{aer}/m3_{air} - !==>volume 3rd moment - !RAIN: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS - ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & - ((ZRG_DST(:,:,:,JJ)**3)* & - EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2)) - !RAIN: RETURN TO CONCENTRATION #/m3 - ZWORK31(:,:,:)= ZWORK31(:,:,:) * XMD/ & - (XAVOGADRO*XRHODREF(:,:,:)) - !RAIN: Get number concentration (#/molec_{air}==>#/m3) - ZWORK31(:,:,:)= & - ZWORK31(:,:,:) & !#/molec_{air} - * XAVOGADRO & !==>#/mole - / XMD & !==>#/kg_{air} - * XRHODREF(:,:,:) !==>#/m3 - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! RAIN: DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ+NMODE_DST - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_DST - TZFIELD%CUNITS = 'ug m-3' - ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END DO - - ZSDSTDEP => NULL() -! -END IF -! Sea Salt variables -IF (LSALT) THEN - IF(.NOT.ALLOCATED(ZSIG_SLT)) & - ALLOCATE(ZSIG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) - IF(.NOT.ALLOCATED(ZRG_SLT)) & - ALLOCATE(ZRG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) - IF(.NOT.ALLOCATED(ZN0_SLT)) & - ALLOCATE(ZN0_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) - ! - DO JSV = NSV_SLTBEG, NSV_SLTEND - TZFIELD = TSVLIST(JSV) - TZFIELD%CUNITS = 'ppb' - WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_SALT', JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) - END DO - ! - CALL PPP2SALT(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND),XRHODREF,& - PSIG3D=ZSIG_SLT, PRG3D=ZRG_SLT, PN3D=ZN0_SLT) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic for salt modes', & - CSTDNAME = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - TZFIELD2D = TFIELDMETADATA( & - CMNHNAME = 'generic for salt modes', & - CSTDNAME = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - ! - DO JJ=1,NMODE_SLT - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTRGA',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) SALT MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SLT(:,:,:,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTRGAM',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) SALT MODE ',JJ - ZWORK31(:,:,:)=ZRG_SLT(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_SLT(:,:,:,JJ)))**2)) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTN0A',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm-3' - WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 SALT MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZN0_SLT(:,:,:,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTSIGA',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '1' - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA SALT MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_SLT(:,:,:,JJ)) - !SALT MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SLTMSS',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A14,I1)')'MASSCONC MODE ',JJ - ZWORK31(:,:,:)= ZN0_SLT(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - !SALT BURDEN (g/m2) - ZWORK21(:,:)=0.0 - DO JK=IKB,IKE - ZWORK31(:,:,JK) = ZWORK31(:,:,JK) *(XZZ(:,:,JK+1)-XZZ(:,:,JK)) & - *1.d-6 ! Convert to ug/m2-->g/m2 in each layer - END DO - ! - DO JK=IKB,IKE - DO JT=IJB,IJE - DO JI=IIB,IIE - ZWORK21(JI,JT)=ZWORK21(JI,JT)+ZWORK31(JI,JT,JK) - ENDDO - ENDDO - ENDDO - WRITE(TZFIELD2D%CMNHNAME,'(A7,I1)')'SLTBRDN',JJ - TZFIELD2D%CLONGNAME = TRIM(TZFIELD2D%CMNHNAME) - TZFIELD2D%CUNITS = 'g m-2' - WRITE(TZFIELD2D%CCOMMENT,'(A6,I1)')'BURDEN',JJ - CALL IO_Field_write(TPFILE,TZFIELD2D,ZWORK21) - ENDDO -END IF -IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN - ! - DO JSV = NSV_SLTDEPBEG, NSV_SLTDEPEND - TZFIELD = TSVLIST(JSV) - TZFIELD%CUNITS = 'ppb' - WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_SALTDEP', JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) - END DO - ! - ZSSLTDEP => XSVT(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic for saltdep modes', & - CSTDNAME = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - DO JJ=1,NMODE_SLT - ! FOR CLOUDS - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ - TZFIELD%CUNITS = 'm-3' - ! CLOUD: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS - ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ) &!==>molec_{aer}/molec_{air} - *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} - *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} - /XDENSITY_DUST &!==>m3_{aer}/m3_{air} - *XM3TOUM3 &!==>um3_{aer}/m3_{air} - /(XPI*4./3.) !==>um3_{aer}/m3_{air} - !==>volume 3rd moment - !CLOUD: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS - ZWORK31(:,:,:) = ZWORK31(:,:,:)/ & - ((ZRG_SLT(:,:,:,JJ)**3)* & - EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2)) - !CLOUD: RETURN TO CONCENTRATION #/m3 - ZWORK31(:,:,:)= ZWORK31(:,:,:) * XMD/ & - (XAVOGADRO*XRHODREF(:,:,:)) - !CLOUD: Get number concentration (#/molec_{air}==>#/m3) - ZWORK31(:,:,:)= & - ZWORK31(:,:,:) & !#/molec_{air} - * XAVOGADRO & !==>#/mole - / XMD & !==>#/kg_{air} - * XRHODREF(:,:,:) !==>#/m3 - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! CLOUD: DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ - TZFIELD%CUNITS = 'ug m-3' - ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! FOR RAIN DROPS - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ+NMODE_SLT - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_SLT - TZFIELD%CUNITS = 'm-3' - ! RAIN: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS - ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ+NMODE_SLT) &!==>molec_{aer}/molec_{air} - *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} - *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} - /XDENSITY_DUST &!==>m3_{aer}/m3_{air} - *XM3TOUM3 &!==>um3_{aer}/m3_{air} - /(XPI*4./3.) !==>um3_{aer}/m3_{air} - !==>volume 3rd moment - !RAIN: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS - ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & - ((ZRG_SLT(:,:,:,JJ)**3)* & - EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2)) - !RAIN: RETURN TO CONCENTRATION #/m3 - ZWORK31(:,:,:)= ZWORK31(:,:,:) * XMD/ & - (XAVOGADRO*XRHODREF(:,:,:)) - !RAIN: Get number concentration (#/molec_{air}==>#/m3) - ZWORK31(:,:,:)= & - ZWORK31(:,:,:) & !#/molec_{air} - * XAVOGADRO & !==>#/mole - / XMD & !==>#/kg_{air} - * XRHODREF(:,:,:) !==>#/m3 - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! RAIN: DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ+NMODE_SLT - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_SLT - TZFIELD%CUNITS = 'ug m-3' - ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END DO - - ZSSLTDEP => NULL() -! -END IF -! -! Blowing snow variables -! -IF(LBLOWSNOW) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SNWSUBL3D', & - CSTDNAME = '', & - CLONGNAME = 'SNWSUBL3D', & - CUNITS = 'kg m-3 s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_INstantaneous 3D Drifting snow sublimation flux', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XSNWSUBL3D(:,:,:)) - ! - ZWORK21(:,:) = 0. - DO JK = IKB,IKE - ZWORK21(:,:) = ZWORK21(:,:)+XSNWSUBL3D(:,:,JK) * & - (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW*3600*24 - END DO - ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'COL_SNWSUBL', & - CSTDNAME = '', & - CLONGNAME = 'COL_SNWSUBL', & - CUNITS = 'mm day-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Column Sublimation Rate (mmSWE/day)', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:)) - ! - IF(.NOT.ALLOCATED(ZBET_SNW)) & - ALLOCATE(ZBET_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3))) - IF(.NOT.ALLOCATED(ZRG_SNW)) & - ALLOCATE(ZRG_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3))) - IF(.NOT.ALLOCATED(ZMA_SNW)) & - ALLOCATE(ZMA_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3),NBLOWSNOW3D)) - ! - CALL PPP2SNOW(XSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND),XRHODREF,& - PBET3D=ZBET_SNW, PRG3D=ZRG_SNW, PM3D=ZMA_SNW) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SNWRGA', & - CSTDNAME = '', & - CLONGNAME = 'SNWRGA', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'RG (mean) SNOW', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SNW(:,:,:)) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SNWBETA', & - CSTDNAME = '', & - CLONGNAME = 'SNWBETA', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'BETA SNOW', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZBET_SNW(:,:,:)) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SNWNOA', & - CSTDNAME = '', & - CLONGNAME = 'SNWNOA', & - CUNITS = 'm-3', & - CDIR = 'XY', & - CCOMMENT = 'NUM CONC SNOW (#/m3)', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,1)) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SNWMASS', & - CSTDNAME = '', & - CLONGNAME = 'SNWMASS', & - CUNITS = 'kg m-3', & - CDIR = 'XY', & - CCOMMENT = 'MASS CONC SNOW', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,2)) - ! - ZWORK21(:,:) = 0. - DO JK = IKB,IKE - ZWORK21(:,:) = ZWORK21(:,:)+ZMA_SNW(:,:,JK,2) * & - (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW - END DO - ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THDS', & - CSTDNAME = '', & - CLONGNAME = 'THDS', & - CUNITS = 'mm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_THickness of Drifting Snow (mm SWE)', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:)) -END IF -! linox scalar variables -IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) THEN - DO JSV = NSV_LNOXBEG, NSV_LNOXEND - TZFIELD = TSVLIST(JSV) - TZFIELD%CUNITS = 'ppb' - WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_LNOX', JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) - END DO -END IF -! -!* Large Scale variables -! -IF (LVAR_LS) THEN - CALL IO_Field_write(TPFILE,'LSUM', XLSUM) - CALL IO_Field_write(TPFILE,'LSVM', XLSVM) - ! - IF (LWIND_ZM) THEN - TZFIELD2(1) = TFIELDMETADATA( & - CMNHNAME = 'LSUM_ZM', & - CSTDNAME = '', & - CLONGNAME = 'LSUM_ZM', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'Large Scale Zonal component of horizontal wind', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - TZFIELD2(2) = TFIELDMETADATA( & - CMNHNAME = 'LSVM_ZM', & - CSTDNAME = '', & - CLONGNAME = 'LSVM_ZM', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'Large Scale Meridian component of horizontal wind', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - CALL UV_TO_ZONAL_AND_MERID(XLSUM,XLSVM,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2) - ENDIF - ! - CALL IO_Field_write(TPFILE,'LSWM', XLSWM) - CALL IO_Field_write(TPFILE,'LSTHM',XLSTHM) -! - IF (LUSERV) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('LSRVM',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CUNITS = 'g kg-1' - CALL IO_Field_write(TPFILE,TZFIELD,XLSRVM(:,:,:)*1.E3) - END IF -END IF -! -!* Forcing variables -! -IF (LVAR_FRC .AND. LFORCING) THEN -! - DO JT=1,NFRC - WRITE (YFRC,'(I3.3)') JT -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'UFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'UFRC'//YFRC, & - CUNITS = 'm s-1', & - CDIR = '--', & - CCOMMENT = 'Zonal component of horizontal forcing wind', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XUFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'VFRC'//YFRC, & - CUNITS = 'm s-1', & - CDIR = '--', & - CCOMMENT = 'Meridian component of horizontal forcing wind', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XVFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'WFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'WFRC'//YFRC, & - CUNITS = 'm s-1', & - CDIR = '--', & - CCOMMENT = 'Vertical forcing wind', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XWFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'THFRC'//YFRC, & - CUNITS = 'K', & - CDIR = '--', & - CCOMMENT = 'Forcing potential temperature', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XTHFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'RVFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'RVFRC'//YFRC, & - CUNITS = 'kg kg-1', & - CDIR = '--', & - CCOMMENT = 'Forcing vapor mixing ratio', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XRVFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'TENDTHFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'TENDTHFRC'//YFRC, & - CUNITS = 'K s-1', & - CDIR = '--', & - CCOMMENT = 'Large-scale potential temperature tendency for forcing', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XTENDTHFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'TENDRVFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'TENDRVFRC'//YFRC, & - CUNITS = 'kg kg-1 s-1', & - CDIR = '--', & - CCOMMENT = 'Large-scale vapor mixing ratio tendency for forcing', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XTENDRVFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'GXTHFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'GXTHFRC'//YFRC, & - CUNITS = 'K m-1', & - CDIR = '--', & - CCOMMENT = 'Large-scale potential temperature gradient for forcing', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XGXTHFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'GYTHFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'GYTHFRC'//YFRC, & - CUNITS = 'K m-1', & - CDIR = '--', & - CCOMMENT = 'Large-scale potential temperature gradient for forcing', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XGYTHFRC(:,JT)) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'PGROUNDFRC'//YFRC, & - CSTDNAME = '', & - CLONGNAME = 'PGROUNDFRC'//YFRC, & - CUNITS = 'Pa', & - CDIR = '--', & - CCOMMENT = 'Forcing ground pressure', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 0, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XPGROUNDFRC(JT)) -! - END DO -END IF -! -!------------------------------------------------------------------------------- -! -!* 1.7 Some diagnostic variables -! -IF (LTPZH .OR. LCOREF) THEN -! -!* Temperature in celsius - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'TEMP', & - CSTDNAME = 'air_temperature', & - CLONGNAME = 'TEMP', & - CUNITS = 'celsius', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_TEMPerature', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ZWORK31(:,:,:)=ZTEMP(:,:,:) - XTT - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -! -!* Pressure in hPa - CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'PRES' - TZFIELD%CUNITS = 'hPa' - CALL IO_Field_write(TPFILE,TZFIELD,XPABST(:,:,:)*1E-2) -! -!* Geopotential in meters - CALL IO_Field_write(TPFILE,'ALT',XZZ) -! -!* Relative humidity in percent - IF (LUSERV) THEN - ZWORK31(:,:,:)=SM_FOES(ZTEMP(:,:,:)) - ZWORK33(:,:,:)=ZWORK31(:,:,:) - ZWORK31(:,:,:)=(XMV/XMD)*ZWORK31(:,:,:)/(XPABST(:,:,:)-ZWORK31(:,:,:)) - ZWORK32(:,:,:)=100.*XRT(:,:,:,1)/ZWORK31(:,:,:) - IF (CCLOUD(1:3) =='ICE' .OR. CCLOUD =='C3R5' .OR. CCLOUD == 'LIMA') THEN - WHERE ( ZTEMP(:,:,:)< XTT) - ZWORK31(:,:,:) = EXP( XALPI - XBETAI/ZTEMP(:,:,:) & - - XGAMI*ALOG(ZTEMP(:,:,:)) ) !saturation over ice - ZWORK33(:,:,:)=ZWORK31(:,:,:) - ZWORK31(:,:,:)=(XMV/XMD)*ZWORK31(:,:,:)/(XPABST(:,:,:)-ZWORK31(:,:,:)) - ZWORK32(:,:,:)=100.*XRT(:,:,:,1)/ZWORK31(:,:,:) - END WHERE - END IF - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'REHU', & - CSTDNAME = 'relative_humidity', & - CLONGNAME = 'REHU', & - CUNITS = 'percent', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_RElative HUmidity', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VPRES', & - CSTDNAME = 'water_vapor_partial_pressure_in_air', & - CLONGNAME = 'VPRES', & - CUNITS = 'hPa', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Vapor PRESsure', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ZWORK33(:,:,:)=ZWORK33(:,:,:)*ZWORK32(:,:,:)*1E-4 - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) - ! - IF (LCOREF) THEN - ZWORK33(:,:,:)=(77.6*( XPABST(:,:,:)*1E-2 & - +ZWORK33(:,:,:)*4810/ZTEMP(:,:,:)) & - -6*ZWORK33(:,:,:) )/ZTEMP(:,:,:) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'COREF', & - CSTDNAME = '', & - CLONGNAME = 'COREF', & - CUNITS = '1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_REFraction COindex (N-units)', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) - ! - ZWORK33(:,:,:)=ZWORK33(:,:,:)+MZF(XZZ(:,:,:))*1E6/XRADIUS - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'MCOREF', & - CSTDNAME = '', & - CLONGNAME = 'MCOREF', & - CUNITS = '1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Modified REFraction COindex (M-units)', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) - END IF - ELSE - PRINT*, 'NO WATER VAPOR IN ',TPFILE%CNAME,' RELATIVE HUMIDITY IS NOT COMPUTED' - END IF -! -END IF -! -!------------------------------------------------------------------------------- -! -!* Virtual potential temperature -! -IF ( LMOIST_V .OR. LMSLP .OR. CBLTOP/='NONE' ) THEN - ALLOCATE(ZTHETAV(IIU,IJU,IKU)) -! - IF(NRR > 0) THEN -! compute the ratio : 1 + total water mass / dry air mass - ZRV_OV_RD = XRV / XRD - ZTHETAV(:,:,:) = 1. + XRT(:,:,:,1) - DO JLOOP = 2,1+NRRL+NRRI - ZTHETAV(:,:,:) = ZTHETAV(:,:,:) + XRT(:,:,:,JLOOP) - END DO -! compute the virtual potential temperature when water is present in any form - ZTHETAV(:,:,:) = XTHT(:,:,:) * (1.+XRT(:,:,:,1)*ZRV_OV_RD) / ZTHETAV(:,:,:) - ELSE -! compute the virtual potential temperature when water is absent - ZTHETAV(:,:,:) = XTHT(:,:,:) - END IF -! - IF (LMOIST_V .AND. NRR > 0) THEN -! Virtual potential temperature - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THETAV', & - CSTDNAME = '', & - CLONGNAME = 'THETAV', & - CUNITS = 'K', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Virtual potential temperature', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAV) - END IF -! -END IF -! -!------------------------------------------------------------------------------- -! -!* Fog Visibility -! -IF (LVISI) THEN -! - IF ((CCLOUD /= 'NONE') .AND. (CCLOUD /='REVE')) ALLOCATE(ZVISIKUN(IIU,IJU,IKU)) - IF ((CCLOUD == 'C2R2') .OR. (CCLOUD =='KHKO')) THEN - ALLOCATE(ZVISIGUL(IIU,IJU,IKU)) - ALLOCATE(ZVISIZHA(IIU,IJU,IKU)) - END IF -! - IF ((CCLOUD /= 'NONE') .AND. (CCLOUD /='REVE')) THEN - ZVISIKUN(:,:,:) = 10000. - WHERE ( XRT(:,:,:,2) >= 1E-08 ) - ZVISIKUN(:,:,:) =0.027/(XRT(:,:,:,2)*XRHODREF(:,:,:))**0.88*1000. - END WHERE -! Visibity Kunkel - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VISIKUN', & - CSTDNAME = '', & - CLONGNAME = 'VISIKUN', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Visibility Kunkel', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZVISIKUN) -! - IF ((CCLOUD == 'C2R2') .OR. (CCLOUD =='KHKO')) THEN - ZVISIGUL(:,:,:) = 10000. - ZVISIZHA(:,:,:) = 10000. - WHERE ( (XRT(:,:,:,2) >= 1E-08 ) .AND. (XSVT(:,:,:,NSV_C2R2BEG+1) >=0.001 ) ) - ZVISIGUL(:,:,:) =1.002/(XRT(:,:,:,2)*XRHODREF(:,:,:)*XSVT(:,:,:,NSV_C2R2BEG+1))**0.6473*1000. - ZVISIZHA(:,:,:) =0.187/(XRT(:,:,:,2)*XRHODREF(:,:,:)*XSVT(:,:,:,NSV_C2R2BEG+1))**0.34*1000. - END WHERE -! Visibity Gultepe - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VISIGUL', & - CSTDNAME = '', & - CLONGNAME = 'VISIGUL', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Visibility Gultepe', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZVISIGUL) -! Visibity Zhang - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VISIZHA', & - CSTDNAME = '', & - CLONGNAME = 'VISIZHA', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Visibility Zhang', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZVISIZHA) -! - DEALLOCATE(ZVISIGUL,ZVISIZHA) - END IF - DEALLOCATE(ZVISIKUN) - END IF -! -END IF -! -!------------------------------------------------------------------------------- -! -!* Thetae computation according eq.(21), (43) of Bolton 1980 (MWR108,p 1046-1053) -! -IF (( LMOIST_E .OR. LBV_FR ) .AND. (NRR>0)) THEN - ALLOCATE(ZTHETAE(IIU,IJU,IKU)) - ! - ZWORK31(:,:,:) = MAX(XRT(:,:,:,1),1.E-10) - ZTHETAE(:,:,:)= ( 2840./ & - (3.5*ALOG(XTHT(:,:,:)*( XPABST(:,:,:)/XP00 )**(XRD/XCPD) ) & - - ALOG( XPABST(:,:,:)*0.01*ZWORK31(:,:,:) / ( 0.622+ZWORK31(:,:,:) ) ) & - -4.805 ) ) + 55. - ZTHETAE(:,:,:)= XTHT(:,:,:) * EXP( (3376. / ZTHETAE(:,:,:) - 2.54) & - *ZWORK31(:,:,:) *(1. +0.81 *ZWORK31(:,:,:)) ) -! - IF (LMOIST_E) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THETAE', & - CSTDNAME = '', & - CLONGNAME = 'THETAE', & - CUNITS = 'K', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Equivalent potential temperature', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAE) - END IF -END IF -!------------------------------------------------------------------------------- -! -!* Thetaes computation -! -IF (LMOIST_ES .AND. (NRR>0)) THEN - ALLOCATE(ZTHETAES(IIU,IJU,IKU)) - ZWORK31(:,:,:) = MAX(QSAT(ZTEMP(:,:,:),XPABST(:,:,:)),1.E-10) - ZTHETAES(:,:,:)= ( 2840./ & - (3.5*ALOG(XTHT(:,:,:)*( XPABST(:,:,:)/XP00 )**(XRD/XCPD) ) & - - ALOG( XPABST(:,:,:)*0.01*ZWORK31(:,:,:) / ( 0.622+ZWORK31(:,:,:) ) ) & - -4.805 ) ) + 55. - ZTHETAES(:,:,:)= XTHT(:,:,:) * EXP( (3376. / ZTHETAE(:,:,:) - 2.54) & - *ZWORK31(:,:,:) *(1. +0.81 *ZWORK31(:,:,:)) ) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THETAES', & - CSTDNAME = '', & - CLONGNAME = 'THETAES', & - CUNITS = 'K', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Equivalent Saturated potential temperature', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAES) -ENDIF -! -!------------------------------------------------------------------------------- -!* The Liquid-Water potential temperature (Betts, 1973) -! (also needed for THETAS1 or THETAS2) -! -IF ( LMOIST_L .OR. LMOIST_S1 .OR. LMOIST_S2 ) THEN -! - ALLOCATE(ZTHETAL(IIU,IJU,IKU)) -! - IF(NRR > 1) THEN -! The latent heat of Vaporization: - ZWORK31(:,:,:) = XLVTT + (XCPV-XCL)*(ZTEMP(:,:,:)-XTT) -! The latent heat of Sublimation: - ZWORK32(:,:,:) = XLSTT + (XCPV-XCI)*(ZTEMP(:,:,:)-XTT) -! The numerator in the exponential -! and the total water mixing ratio: - ZTHETAL(:,:,:) = 0.0 - ZWORK33(:,:,:) = XRT(:,:,:,1) - DO JLOOP = 2,1+NRRL - ZTHETAL(:,:,:) = ZTHETAL(:,:,:) + XRT(:,:,:,JLOOP)*ZWORK31(:,:,:) - ZWORK33(:,:,:) = ZWORK33(:,:,:) + XRT(:,:,:,JLOOP) - END DO - DO JLOOP = 1+NRRL+1,1+NRRL+NRRI - ZTHETAL(:,:,:) = ZTHETAL(:,:,:) + XRT(:,:,:,JLOOP)*ZWORK32(:,:,:) - ZWORK33(:,:,:) = ZWORK33(:,:,:) + XRT(:,:,:,JLOOP) - END DO -! compute the liquid-water potential temperature -! theta_l = theta * exp[ -(L_vap * ql + L_sub * qi) / (c_pd * T) ] -! when water is present in any form: - ZTHETAL(:,:,:) = XTHT(:,:,:) & - * exp(-ZTHETAL(:,:,:)/(1.0+ZWORK33(:,:,:))/XCPD/ZTEMP(:,:,:)) - ELSE -! compute the liquid-water potential temperature -! when water is absent: - ZTHETAL(:,:,:) = XTHT(:,:,:) - END IF -! - IF (LMOIST_L .AND. NRR > 0) THEN - ! Liquid-Water potential temperature - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THETAL', & - CSTDNAME = '', & - CLONGNAME = 'THETAL', & - CUNITS = 'K', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Liquid water potential temperature', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAL) - END IF -! -END IF -! -!------------------------------------------------------------------------------- -! -!* The Moist-air Entropy potential temperature (Marquet, QJ2011, HDR2016) -! -IF ( LMOIST_S1 .OR. LMOIST_S2 ) THEN - IF (LMOIST_S1) THEN - ALLOCATE(ZTHETAS1(IIU,IJU,IKU)) - END IF - IF (LMOIST_S2) THEN - ALLOCATE(ZTHETAS2(IIU,IJU,IKU)) - END IF -! -! The total water (ZWORK31) and condensed water (ZWORK32) mixing ratios: - ZWORK32(:,:,:) = 0.0 - IF(NRR > 0) THEN - DO JLOOP = 2,1+NRRL+NRRI - ZWORK32(:,:,:) = ZWORK32(:,:,:) + XRT(:,:,:,JLOOP) - END DO - END IF - ZWORK31(:,:,:) = ZWORK32(:,:,:) + XRT(:,:,:,1) -! - IF (LMOIST_S1) THEN -!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -! thetas1 = thetal * exp[ 5.87 * qt ] ; with qt=rt/(1+rt) -!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ZTHETAS1(:,:,:) = ZTHETAL(:,:,:) * & - exp( 5.87*ZWORK31(:,:,:)/(1.0+ZWORK31(:,:,:)) ) - END IF - IF (LMOIST_S2) THEN -!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -! thetas2 = thetal * exp[ (5.87-0.46*ln(rv/0.0124)-0.46*qc) * qt ] -! where qt=rt/(1+rt) and qc=rc/(1+rt) -!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ZWORK33(:,:,:) = 5.87 - 0.46 * log(MAX(XRT(:,:,:,1),1.E-10)/0.0124) - ZTHETAS2(:,:,:) = ZTHETAL(:,:,:) * & - exp( ZWORK33(:,:,:)*ZWORK31(:,:,:)/(1.0+ZWORK31(:,:,:)) & - - 0.46*ZWORK32(:,:,:)/(1.0+ZWORK31(:,:,:)) ) - END IF - IF (LMOIST_S1) THEN -! The Moist-air Entropy potential temperature (1st order) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THETAS1', & - CSTDNAME = '', & - CLONGNAME = 'THETAS1', & - CUNITS = 'K', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Moist air Entropy (1st order) potential temperature', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAS1) - END IF - IF (LMOIST_S2) THEN -! The Moist-air Entropy potential temperature (2nd order) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THETAS2', & - CSTDNAME = '', & - CLONGNAME = 'THETAS2', & - CUNITS = 'K', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Moist air Entropy (2nd order) potential temperature', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAS2) - END IF -! -END IF -! -!------------------------------------------------------------------------------- -!! -! -!* Vorticity quantities -! -IF (LVORT) THEN -! Vorticity x - ZWORK31(:,:,:)=MYF(MZF(MXM(ZVOX(:,:,:)))) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'UM1', & - CSTDNAME = '', & - CLONGNAME = 'UM1', & - CUNITS = 's-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_x component of vorticity', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -! -! Vorticity y - ZWORK32(:,:,:)=MZF(MXF(MYM(ZVOY(:,:,:)))) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VM1', & - CSTDNAME = '', & - CLONGNAME = 'VM1', & - CUNITS = 's-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_y component of vorticity', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) - ! - IF (LWIND_ZM) THEN - TZFIELD2(1) = TFIELDMETADATA( & - CMNHNAME = 'UM1_ZM', & - CSTDNAME = '', & - CLONGNAME = 'UM1_ZM', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'Zonal component of horizontal vorticity', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - TZFIELD2(2) = TFIELDMETADATA( & - CMNHNAME = 'VM1_ZM', & - CSTDNAME = '', & - CLONGNAME = 'VM1_ZM', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'Meridian component of horizontal vorticity', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2) - ENDIF -! -! Vorticity z - ZWORK31(:,:,:)=MXF(MYF(MZM(ZVOZ(:,:,:)))) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'WM1', & - CSTDNAME = '', & - CLONGNAME = 'WM1', & - CUNITS = 's-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_relative vorticity', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -! -! Absolute Vorticity - ZWORK31(:,:,:)=MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ABVOR', & - CSTDNAME = '', & - CLONGNAME = 'ABVOR', & - CUNITS = 's-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_z ABsolute VORticity', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -! -END IF -! -IF ( LMEAN_POVO ) THEN - ! - ALLOCATE(IWORK1(SIZE(XTHT,1),SIZE(XTHT,2))) - ! - IWORK1(:,:)=0 - ZWORK21(:,:)=0. - IF (XMEAN_POVO(1)>XMEAN_POVO(2)) THEN - !Invert values (smallest must be first) - ZX0D = XMEAN_POVO(1) - XMEAN_POVO(1) = XMEAN_POVO(2) - XMEAN_POVO(2) = ZX0D - END IF - DO JK=IKB,IKE - WHERE((XPABST(:,:,JK)>XMEAN_POVO(1)).AND.(XPABST(:,:,JK)<XMEAN_POVO(2))) - ZWORK21(:,:)=ZWORK21(:,:)+ZPOVO(:,:,JK) - IWORK1(:,:)=IWORK1(:,:)+1 - END WHERE - END DO - WHERE (IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) ) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'MEAN_POVO', & - CSTDNAME = '', & - CLONGNAME = 'MEAN_POVO', & - CUNITS = 'PVU', & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_MEAN of POtential VOrticity', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) -END IF -! -! Virtual Potential Vorticity in PV units -IF (LMOIST_V .AND. (NRR>0) ) THEN - ZWORK31(:,:,:)=GX_M_M(ZTHETAV,XDXX,XDZZ,XDZX) - ZWORK32(:,:,:)=GY_M_M(ZTHETAV,XDYY,XDZZ,XDZY) - ZWORK33(:,:,:)=GZ_M_M(ZTHETAV,XDZZ) - ZWORK34(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:))) & - + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & - + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) - ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'POVOV', & - CSTDNAME = '', & - CLONGNAME = 'POVOV', & - CUNITS = 'PVU', & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Virtual POtential VOrticity', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34) -! - IF (LMEAN_POVO) THEN - IWORK1(:,:)=0 - ZWORK21(:,:)=0. - DO JK=IKB,IKE - WHERE((XPABST(:,:,JK)>XMEAN_POVO(1)).AND.(XPABST(:,:,JK)<XMEAN_POVO(2))) - ZWORK21(:,:)=ZWORK21(:,:)+ZWORK34(:,:,JK) - IWORK1(:,:)=IWORK1(:,:)+1 - END WHERE - END DO - WHERE(IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) ) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'MEAN_POVOV', & - CSTDNAME = '', & - CLONGNAME = 'MEAN_POVOV', & - CUNITS = 'PVU', & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_MEAN of Virtual POtential VOrticity', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - END IF -END IF -! -! Equivalent Potential Vorticity in PV units -IF (LMOIST_E .AND. (NRR>0) ) THEN -! - ZWORK31(:,:,:)=GX_M_M(ZTHETAE,XDXX,XDZZ,XDZX) - ZWORK32(:,:,:)=GY_M_M(ZTHETAE,XDYY,XDZZ,XDZY) - ZWORK33(:,:,:)=GZ_M_M(ZTHETAE,XDZZ) - ZWORK34(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:))) & - + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & - + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) - ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'POVOE', & - CSTDNAME = '', & - CLONGNAME = 'POVOE', & - CUNITS = 'PVU', & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Equivalent POtential VOrticity', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34) -! - IF (LMEAN_POVO) THEN - IWORK1(:,:)=0 - ZWORK21(:,:)=0. - DO JK=IKB,IKE - WHERE((XPABST(:,:,JK)>XMEAN_POVO(1)).AND.(XPABST(:,:,JK)<XMEAN_POVO(2))) - ZWORK21(:,:)=ZWORK21(:,:)+ZWORK34(:,:,JK) - IWORK1(:,:)=IWORK1(:,:)+1 - END WHERE - END DO - WHERE(IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) ) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'MEAN_POVOE', & - CSTDNAME = '', & - CLONGNAME = 'MEAN_POVOE', & - CUNITS = 'PVU', & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_MEAN of Equivalent POtential VOrticity', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - DEALLOCATE(IWORK1) - END IF - ! -END IF -! -! Equivalent Saturated Potential Vorticity in PV units -IF (LMOIST_ES .AND. (NRR>0) ) THEN - ZWORK31(:,:,:)=GX_M_M(ZTHETAES,XDXX,XDZZ,XDZX) - ZWORK32(:,:,:)=GY_M_M(ZTHETAES,XDYY,XDZZ,XDZY) - ZWORK33(:,:,:)=GZ_M_M(ZTHETAES,XDZZ) - ZWORK34(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:))) & - + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & - + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) - ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'POVOES', & - CSTDNAME = '', & - CLONGNAME = 'POVOES', & - CUNITS = 'PVU', & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Equivalent Saturated POtential VOrticity', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34) -ENDIF -! -! -!------------------------------------------------------------------------------- -! -!* Horizontal divergence -! -IF (LDIV) THEN -! - ZWORK31=GX_U_M(XUT,XDXX,XDZZ,XDZX) + GY_V_M(XVT,XDYY,XDZZ,XDZY) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'HDIV', & - CSTDNAME = '', & - CLONGNAME = 'HDIV', & - CUNITS = 's-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Horizontal DIVergence', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -! - IF (LUSERV) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'HMDIV', & - CSTDNAME = '', & - CLONGNAME = 'HMDIV', & - CUNITS = 'kg m-3 s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Horizontal Moisture DIVergence HMDIV', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ZWORK31=MXM(XRHODREF*XRT(:,:,:,1))*XUT - ZWORK32=MYM(XRHODREF*XRT(:,:,:,1))*XVT - ZWORK33=GX_U_M(ZWORK31,XDXX,XDZZ,XDZX) + GY_V_M(ZWORK32,XDYY,XDZZ,XDZY) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) - END IF -! -ENDIF -! -!------------------------------------------------------------------------------- -! -!* Clustering -! -IF (LCLSTR) THEN - GCLOUD(:,:,:)=.FALSE. - GBOTUP=LBOTUP - IF (CFIELD=='W') THEN - WHERE(XWT(:,:,:).GT.XTHRES) GCLOUD(:,:,:)=.TRUE. - END IF - IF (CFIELD=='CLOUD') THEN - WHERE((XRT(:,:,:,2)+XRT(:,:,:,4)+XRT(:,:,:,5)+XRT(:,:,:,6)).GT.XTHRES) GCLOUD(:,:,:)=.TRUE. - END IF - PRINT *,'CALL CLUSTERING COUNT(GCLOUD)=',COUNT(GCLOUD) - CALL CLUSTERING(GBOTUP,GCLOUD,XWT,ICLUSTERID,ICLUSTERLV,ZCLDSIZE) - PRINT *,'GOT OUT OF CLUSTERING' - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'CLUSTERID', & - CSTDNAME = '', & - CLONGNAME = 'CLUSTERID', & - CUNITS = '', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_CLUSTER (ID NUMBER)', & - NGRID = 1, & - NTYPE = TYPEINT, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ICLUSTERID) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'CLUSTERLV', & - CSTDNAME = '', & - CLONGNAME = 'CLUSTERLV', & - CUNITS = '', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_CLUSTER (BASE OR TOP LEVEL)', & - NGRID = 1, & - NTYPE = TYPEINT, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ICLUSTERLV) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'CLDSIZE', & - CSTDNAME = '', & - CLONGNAME = 'CLDSIZE', & - CUNITS = '', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_CLDSIZE (HOR. SECTION)', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZCLDSIZE) -END IF -! -!------------------------------------------------------------------------------- -! -!* Geostrophic and Ageostrophic wind (m/s) -! -IF (LGEO .OR. LAGEO) THEN - ALLOCATE(ZPHI(IIU,IJU,IKU)) - IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN - ZPHI(:,:,:)=(XPABST(:,:,:)/XP00)**(XRD/XCPD)-XEXNREF(:,:,:) - ! - ZPHI(1,1,:)=2*ZPHI(1,2,:)-ZPHI(1,3,:) - ZPHI(1,IJU,:)=2*ZPHI(1,IJU-1,:)-ZPHI(1,IJU-2,:) - ZPHI(IIU,1,:)=2*ZPHI(IIU,2,:)-ZPHI(IIU,3,:) - ZPHI(IIU,IJU,:)=2*ZPHI(IIU,IJU-1,:)-ZPHI(IIU,IJU-2,:) - ZWORK31(:,:,:)=-MXM(GY_M_M(ZPHI,XDYY,XDZZ,XDZY)*XCPD*XTHVREF/ZCORIOZ) - ! - ZPHI(1,1,:)=2*ZPHI(2,1,:)-ZPHI(3,1,:) - ZPHI(IIU,1,:)=2*ZPHI(IIU-1,1,:)-ZPHI(IIU-2,1,:) - ZPHI(1,IJU,:)=2*ZPHI(2,IJU,:)-ZPHI(3,IJU,:) - ZPHI(IIU,IJU,:)=2*ZPHI(IIU-1,IJU,:)-ZPHI(IIU-2,IJU,:) - ZWORK32(:,:,:)=MYM(GX_M_M(ZPHI,XDXX,XDZZ,XDZX)*XCPD*XTHVREF/ZCORIOZ) - ! - ELSE IF(CEQNSYS=='LHE') THEN - ZPHI(:,:,:)= ((XPABST(:,:,:)/XP00)**(XRD/XCPD)-XEXNREF(:,:,:)) & - * XCPD * XTHVREF(:,:,:) - ! - ZPHI(1,1,:)=2*ZPHI(1,2,:)-ZPHI(1,3,:) - ZPHI(1,IJU,:)=2*ZPHI(1,IJU-1,:)-ZPHI(1,IJU-2,:) - ZPHI(IIU,1,:)=2*ZPHI(IIU,2,:)-ZPHI(IIU,3,:) - ZPHI(IIU,IJU,:)=2*ZPHI(IIU,IJU-1,:)-ZPHI(IIU,IJU-2,:) - ZWORK31(:,:,:)=-MXM(GY_M_M(ZPHI,XDYY,XDZZ,XDZY)/ZCORIOZ) - ! - ZPHI(1,1,:)=2*ZPHI(2,1,:)-ZPHI(3,1,:) - ZPHI(IIU,1,:)=2*ZPHI(IIU-1,1,:)-ZPHI(IIU-2,1,:) - ZPHI(1,IJU,:)=2*ZPHI(2,IJU,:)-ZPHI(3,IJU,:) - ZPHI(IIU,IJU,:)=2*ZPHI(IIU-1,IJU,:)-ZPHI(IIU-2,IJU,:) - ZWORK32(:,:,:)=MYM(GX_M_M(ZPHI,XDXX,XDZZ,XDZX)/ZCORIOZ) - END IF - DEALLOCATE(ZPHI) -! - IF (LGEO) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'UM88', & - CSTDNAME = '', & - CLONGNAME = 'UM88', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_U component of GEOstrophic wind', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VM88', & - CSTDNAME = '', & - CLONGNAME = 'VM88', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_V component of GEOstrophic wind', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) - ! - IF (LWIND_ZM) THEN - TZFIELD2(1) = TFIELDMETADATA( & - CMNHNAME = 'UM88_ZM', & - CSTDNAME = '', & - CLONGNAME = 'UM88_ZM', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'Zonal component of GEOstrophic wind', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - TZFIELD2(2) = TFIELDMETADATA( & - CMNHNAME = 'VM88_ZM', & - CSTDNAME = '', & - CLONGNAME = 'VM88_ZM', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'Meridian component of GEOstrophic wind', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2) - ENDIF -! -! wm necessary to plot vertical cross sections of wind vectors - CALL FIND_FIELD_ID_FROM_MNHNAME('WT',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'WM88' - TZFIELD%CLONGNAME = 'WM88' - CALL IO_Field_write(TPFILE,TZFIELD,XWT) - END IF -! - IF (LAGEO) THEN - ZWORK31(:,:,:)=XUT(:,:,:)-ZWORK31(:,:,:) - ZWORK32(:,:,:)=XVT(:,:,:)-ZWORK32(:,:,:) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'UM89', & - CSTDNAME = '', & - CLONGNAME = 'UM89', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_U component of AGEOstrophic wind', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VM89', & - CSTDNAME = '', & - CLONGNAME = 'VM89', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_V component of AGEOstrophic wind', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) - ! - IF (LWIND_ZM) THEN - TZFIELD2(1) = TFIELDMETADATA( & - CMNHNAME = 'UM89_ZM', & - CSTDNAME = '', & - CLONGNAME = 'UM89_ZM', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'Zonal component of AGEOstrophic wind', & - NGRID = 2, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - TZFIELD2(2) = TFIELDMETADATA( & - CMNHNAME = 'VM89_ZM', & - CSTDNAME = '', & - CLONGNAME = 'VM89_ZM', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'Meridian component of AGEOstrophic wind', & - NGRID = 3, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2) - ENDIF -! -! wm necessary to plot vertical cross sections of wind vectors - CALL FIND_FIELD_ID_FROM_MNHNAME('WT',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%CMNHNAME = 'WM89' - TZFIELD%CLONGNAME = 'WM89' - CALL IO_Field_write(TPFILE,TZFIELD,XWT) - END IF -! -END IF -! -!------------------------------------------------------------------------------- -! -!* Contravariant wind field -! -! -IF(LWIND_CONTRAV) THEN!$ - CALL CONTRAV ((/"TEST","TEST"/),(/"TEST","TEST"/),XUT,XVT,XWT,XDXX,XDYY,XDZZ,XDZX,XDZY, & - ZWORK31,ZWORK32,ZWORK33,2) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'WNORM', & - CSTDNAME = '', & - CLONGNAME = 'WNORM', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_W surface normal wind', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) -END IF -!------------------------------------------------------------------------------- -! -!* Mean Sea Level Pressure in hPa -! -IF (LMSLP) THEN - ZGAMREF=-6.5E-3 -! Exner function at the first mass point - ZWORK21(:,:) = (XPABST(:,:,IKB) /XP00)**(XRD/XCPD) -! virtual temperature at the first mass point - ZWORK21(:,:) = ZWORK21(:,:) * ZTHETAV(:,:,IKB) -! virtual temperature at ground level - ZWORK21(:,:) = ZWORK21(:,:) - ZGAMREF*((XZZ(:,:,IKB)+XZZ(:,:,IKB+1))/2.-XZS(:,:)) -! virtual temperature at sea level - ZWORK22(:,:) = ZWORK21(:,:) - ZGAMREF*XZS(:,:) -! average underground virtual temperature - ZWORK22(:,:) = 0.5*(ZWORK21(:,:)+ZWORK22(:,:)) -! surface pressure - ZWORK21(:,:) = ( XPABST(:,:,IKB) + XPABST(:,:,IKB-1) )*.5 -! sea level pressure (hPa) - ZWORK22(:,:) = 1.E-2*ZWORK21(:,:)*EXP(XG*XZS(:,:)/(XRD*ZWORK22(:,:))) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'MSLP', & - CSTDNAME = 'air_pressure_at_sea_level', & - CLONGNAME = 'MSLP', & - CUNITS = 'hPa', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Mean Sea Level Pressure', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) -END IF -!------------------------------------------------------------------------------- -! -!* Vapor, cloud water and ice thickness -! -IF (LTHW) THEN -! - ZWORK21(:,:) = 0. - IF(SIZE(XRT,4)>=1)THEN - DO JK = IKB,IKE - ZWORK21(:,:) = ZWORK21(:,:)+XRHODREF(:,:,JK)*XRT(:,:,JK,1) * & - (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW - END DO - ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THVW', & - CSTDNAME = '', & - CLONGNAME = 'THVW', & - CUNITS = 'mm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_THickness of Vapor Water', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - END IF - ! - ZWORK21(:,:) = 0. - IF(SIZE(XRT,4)>=2)THEN - DO JK = IKB,IKE - ZWORK21(:,:) = ZWORK21(:,:)+XRHODREF(:,:,JK)*XRT(:,:,JK,2) * & - (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW - END DO - ZWORK21(:,:) = ZWORK21(:,:)*1000. ! cloud water in mm unit - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THCW', & - CSTDNAME = '', & - CLONGNAME = 'THCW', & - CUNITS = 'mm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_THickness of Cloud Water', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - END IF - ! - ZWORK21(:,:) = 0. - IF(SIZE(XRT,4)>=3)THEN - DO JK = IKB,IKE - ZWORK21(:,:) = ZWORK21(:,:)+XRHODREF(:,:,JK)*XRT(:,:,JK,3) * & - (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW - END DO - ZWORK21(:,:) = ZWORK21(:,:)*1000. ! rain water in mm unit - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THRW', & - CSTDNAME = '', & - CLONGNAME = 'THRW', & - CUNITS = 'mm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_THickness of Rain Water', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - END IF - ! - ZWORK21(:,:) = 0. - IF(SIZE(XRT,4)>=4)THEN - DO JK = IKB,IKE - ZWORK21(:,:) = ZWORK21(:,:)+XRHODREF(:,:,JK)*XRT(:,:,JK,4) * & - (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW - END DO - ZWORK21(:,:) = ZWORK21(:,:)*1000. ! ice thickness in mm unit - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THIC', & - CSTDNAME = '', & - CLONGNAME = 'THIC', & - CUNITS = 'mm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_THickness of ICe', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - END IF - ! - ZWORK21(:,:) = 0. - IF(SIZE(XRT,4)>=5)THEN - DO JK = IKB,IKE - ZWORK21(:,:) = ZWORK21(:,:)+XRHODREF(:,:,JK)*XRT(:,:,JK,5) * & - (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW - END DO - ZWORK21(:,:) = ZWORK21(:,:)*1000. ! snow thickness in mm unit - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THSN', & - CSTDNAME = '', & - CLONGNAME = 'THSN', & - CUNITS = 'mm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_THickness of SNow', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - END IF - ! - ZWORK21(:,:) = 0. - IF(SIZE(XRT,4)>=6)THEN - DO JK = IKB,IKE - ZWORK21(:,:) = ZWORK21(:,:)+XRHODREF(:,:,JK)*XRT(:,:,JK,6) * & - (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW - END DO - ZWORK21(:,:) = ZWORK21(:,:)*1000. ! graupel thickness in mm unit - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THGR', & - CSTDNAME = '', & - CLONGNAME = 'THGR', & - CUNITS = 'mm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_THickness of GRaupel', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - END IF - ! - ZWORK21(:,:) = 0. - IF(SIZE(XRT,4)>=7)THEN - DO JK = IKB,IKE - ZWORK21(:,:) = ZWORK21(:,:)+XRHODREF(:,:,JK)*XRT(:,:,JK,7) * & - (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW - END DO - ZWORK21(:,:) = ZWORK21(:,:)*1000. ! hail thickness in mm unit - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'THHA', & - CSTDNAME = '', & - CLONGNAME = 'THHA', & - CUNITS = 'mm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_THickness of HAil', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - END IF -END IF -! -!------------------------------------------------------------------------------- -! -!* Accumulated and instantaneous total precip rates in mm and mm/h -! -IF (LTOTAL_PR .AND. SIZE (XACPRR)>0 ) THEN - ZWORK21(:,:) = 0. - ! - IF (LUSERR) THEN - ZWORK21(:,:) = XACPRR(:,:)*1E3 - END IF - IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'LIMA') THEN - ZWORK21(:,:) = ZWORK21(:,:) + (XACPRS(:,:) + XACPRG(:,:))*1E3 - IF (SIZE(XINPRC) /= 0 ) & - ZWORK21(:,:) = ZWORK21(:,:) + XACPRC(:,:) *1E3 - IF (SIZE(XINPRH) /= 0 ) & - ZWORK21(:,:) = ZWORK21(:,:) + XACPRH(:,:) *1E3 - END IF - IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' & - .OR. CCLOUD == 'LIMA' ) THEN - IF (SIZE(XINPRC) /= 0 ) & - ZWORK21(:,:) = ZWORK21(:,:) + XACPRC(:,:) *1E3 - END IF - IF (CDCONV /= 'NONE') THEN - ZWORK21(:,:) = ZWORK21(:,:) + XPACCONV(:,:)*1E3 - END IF - IF (LUSERR .OR. CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. & - CCLOUD == 'LIMA' .OR. CDCONV /= 'NONE') THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ACTOPR', & - CSTDNAME = '', & - CLONGNAME = 'ACTOPR', & - CUNITS = 'mm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_ACccumulated TOtal Precipitation Rate', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - ELSE - PRINT * ,'YOU WANT TO COMPUTE THE ACCUMULATED RAIN' - PRINT * ,'BUT NO RAIN IS PRESENT IN THE MODEL' - END IF - ! - ! calculation of the mean accumulated precipitations in the mesh-grid of a - !large-scale model - IF (LMEAN_PR .AND. LUSERR) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic LS_ACTOPR', & !Temporary name to ease identification - CUNITS = 'mm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Large Scale ACccumulated TOtal Precipitation Rate', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - ! - DO JK=1,SIZE(XMEAN_PR),2 - IF (XMEAN_PR(JK) .NE. XUNDEF .AND. XMEAN_PR(JK+1) .NE. XUNDEF) THEN - PRINT * ,'MEAN accumulated RAIN: GRID ', XMEAN_PR(JK), XMEAN_PR(JK+1) - CALL COMPUTE_MEAN_PRECIP(ZWORK21,XMEAN_PR(JK:JK+1),ZWORK22,TZFIELD%NGRID) - ! - JI=INT(XMEAN_PR(JK)) - JJ=INT(XMEAN_PR(JK+1)) - WRITE(TZFIELD%CMNHNAME,'(A9,2I2.2)')'LS_ACTOPR',JI,JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) - END IF - END DO - ! - END IF - ! - ! - ZWORK21(:,:) = 0. - ! - IF (LUSERR) THEN - ZWORK21(:,:) = XINPRR(:,:)*3.6E6 - END IF - IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'LIMA') THEN - ZWORK21(:,:) = ZWORK21(:,:) + (XINPRS(:,:) + XINPRG(:,:))*3.6E6 - IF (SIZE(XINPRC) /= 0 ) & - ZWORK21(:,:) = ZWORK21(:,:) + XINPRC(:,:) *3.6E6 - IF (SIZE(XINPRH) /= 0 ) & - ZWORK21(:,:) = ZWORK21(:,:) + XINPRH(:,:) *3.6E6 - END IF - IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' & - .OR. CCLOUD == 'LIMA' ) THEN - IF (SIZE(XINPRC) /= 0 ) & - ZWORK21(:,:) = ZWORK21(:,:) + XINPRC(:,:) *3.6E6 - END IF - IF (CDCONV /= 'NONE') THEN - ZWORK21(:,:) = ZWORK21(:,:) + XPRCONV(:,:)*3.6E6 - END IF - IF (LUSERR .OR. CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. & - CCLOUD == 'LIMA' .OR. CDCONV /= 'NONE') THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'INTOPR', & - CSTDNAME = '', & - CLONGNAME = 'INTOPR', & - CUNITS = 'mm hour-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_INstantaneous TOtal Precipitation Rate', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - ELSE - PRINT * ,'YOU WANT TO COMPUTE THE RAIN RATE' - PRINT * ,'BUT NO RAIN IS PRESENT IN THE MODEL' - END IF -! - ! calculation of the mean instantaneous precipitations in the mesh-grid of a - ! large-scale model - IF (LMEAN_PR .AND. LUSERR) THEN - CALL COMPUTE_MEAN_PRECIP(ZWORK21,XMEAN_PR,ZWORK22,TZFIELD%NGRID) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'LS_INTOPR', & - CSTDNAME = '', & - CLONGNAME = 'LS_INTOPR', & - CUNITS = 'mm hour-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Large Scale INstantaneous TOtal Precipitation Rate', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) - END IF -! -END IF -! -!------------------------------------------------------------------------------- -! -!* CAPEMAX, CINMAX (corresponding to CAPEMAX), CAPE, CIN, DCAPE, VKE in J/kg -! -IF (NCAPE >=0 .AND. LUSERV) THEN - ZWORK31(:,:,:) = XRT(:,:,:,1) * 1000. ! vapour mixing ratio in g/kg - ZWORK32(:,:,:)=0.0 - ZWORK33(:,:,:)=0.0 - ZWORK34(:,:,:)=0.0 - CALL CALCSOUND( XPABST(:,:,IKB:IKE)* 0.01 ,ZTEMP(:,:,IKB:IKE)- XTT, & - ZWORK31(:,:,IKB:IKE), & - ZWORK32(:,:,IKB:IKE),ZWORK33(:,:,IKB:IKE), & - ZWORK34(:,:,IKB:IKE),ZWORK21,ZWORK22 ) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'CAPEMAX', & - CSTDNAME = '', & - CLONGNAME = 'CAPEMAX', & - CUNITS = 'J kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_MAX of Convective Available Potential Energy', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'CINMAX', & - CSTDNAME = '', & - CLONGNAME = 'CINMAX', & - CUNITS = 'J kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_MAX of Convective INhibition energy', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) - ! - IF (NCAPE >=1) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'CAPE3D', & - CSTDNAME = 'atmosphere_convective_available_potential_energy', & - CLONGNAME = 'CAPE3D', & - CUNITS = 'J kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Convective Available Potential Energy', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'CIN3D', & - CSTDNAME = 'atmosphere_convective_inhibition', & - CLONGNAME = 'CIN3D', & - CUNITS = 'J kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Convective INhibition energy', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'DCAPE3D', & - CSTDNAME = '', & - CLONGNAME = 'DCAPE3D', & - CUNITS = 'J kg-1', & - CDIR = 'XY', & - CCOMMENT = '', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34) - END IF - ! - IF (NCAPE >=2) THEN - ZWORK31(:,:,1:IKU-1)= 0.5*(XWT(:,:,1:IKU-1)+XWT(:,:,2:IKU)) - ZWORK31(:,:,IKU) = 0. - ZWORK31=0.5*ZWORK31**2 - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VKE', & - CSTDNAME = '', & - CLONGNAME = 'VKE', & - CUNITS = 'J kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Vertical Kinetic Energy', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END IF -ENDIF -! -!------------------------------------------------------------------------------- -! -!* B-V frequency to assess thermal tropopause -! -IF (LBV_FR) THEN - ZWORK32(:,:,:)=DZM(XTHT(:,:,:))/ MZM(XTHT(:,:,:)) - DO JK=1,IKU - DO JJ=1,IJU - DO JI=1,IIU - IF(ZWORK32(JI,JJ,JK)<0.) THEN - ZWORK31(JI,JJ,JK)= -1.*SQRT( ABS( XG*ZWORK32(JI,JJ,JK)/ XDZZ(JI,JJ,JK) ) ) - ELSE - ZWORK31(JI,JJ,JK)= SQRT( ABS( XG*ZWORK32(JI,JJ,JK)/ XDZZ(JI,JJ,JK) ) ) - END IF - ENDDO - ENDDO - ENDDO - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'BV', & - CSTDNAME = '', & - CLONGNAME = 'BV', & - CUNITS = 's-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Brunt-Vaissala frequency', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -! - IF (NRR > 0) THEN - ZWORK32(:,:,:)=DZM(ZTHETAE(:,:,:))/ MZM(ZTHETAE(:,:,:)) - DO JK=1,IKU - DO JJ=1,IJU - DO JI=1,IIU - IF (ZWORK32(JI,JJ,JK)<0.) THEN - ZWORK31(JI,JJ,JK)= -1.*SQRT( ABS( XG*ZWORK32(JI,JJ,JK)/ XDZZ(JI,JJ,JK) ) ) - ELSE - ZWORK31(JI,JJ,JK)= SQRT( ABS( XG*ZWORK32(JI,JJ,JK)/ XDZZ(JI,JJ,JK) ) ) - END IF - ENDDO - ENDDO - ENDDO -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'BVE', & - CSTDNAME = '', & - CLONGNAME = 'BVE', & - CUNITS = 's-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Equivalent Brunt-Vaissala frequency', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END IF -END IF -! -IF(ALLOCATED(ZTHETAE)) DEALLOCATE(ZTHETAE) -IF(ALLOCATED(ZTHETAES)) DEALLOCATE(ZTHETAES) -!------------------------------------------------------------------------------- -! -!* GPS synthetic ZTD, ZHD, ZWD -! -IF ( NGPS>=0 ) THEN - ! surface temperature - ZGAMREF=-6.5E-3 - ZWORK21(:,:) = ZTEMP(:,:,IKB) - ZGAMREF*((XZZ(:,:,IKB)+XZZ(:,:,IKB+1))/2.-XZS(:,:)) - ! - YFGRI=ADJUSTL(ADJUSTR(TPFILE%CNAME)//'GPS') - CALL GPS_ZENITH (YFGRI,XRT(:,:,:,1),ZTEMP,XPABST,ZWORK21,ZWORK22,ZWORK23,ZWORK24) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ZTD', & - CSTDNAME = '', & - CLONGNAME = 'ZTD', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Zenithal Total Delay', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) - ! - IF (NGPS>=1) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ZHD', & - CSTDNAME = '', & - CLONGNAME = 'ZHD', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Zenithal Hydrostatic Delay', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK23) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ZWD', & - CSTDNAME = '', & - CLONGNAME = 'ZWD', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Zenithal Wet Delay', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK24) - ! - END IF - ! -END IF -! -!------------------------------------------------------------------------------- -! -!* Radar reflectivities -! -IF(LRADAR .AND. LUSERR) THEN -! CASE PREP_REAL_CASE after arome - IF (CCLOUD=='NONE' .OR. CCLOUD=='KESS') THEN - DEALLOCATE(XCIT) - ALLOCATE(XCIT(IIU,IJU,IKU)) - XCIT(:,:,:)=800. - CALL INI_RADAR('PLAT') - ELSE IF (CCLOUD=='LIMA') THEN - DEALLOCATE(XCIT) - ALLOCATE(XCIT(IIU,IJU,IKU)) - XCIT(:,:,:)=XSVT(:,:,:,NSV_LIMA_NI) - CALL INI_RADAR('PLAT') - END IF -! - IF (NVERSION_RAD == 1) THEN -! original version of radar diagnostics - WRITE(ILUOUT0,*) 'radar diagnostics from RADAR_RAIN_ICE routine' - IF (CCLOUD=='LIMA') THEN - ALLOCATE( ZW1(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3)) ) - ALLOCATE( ZW2(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3)) ) - ALLOCATE( ZW3(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3)) ) - IF ( NMOM_S >= 2 ) ZW1(:,:,:)=XSVT(:,:,:,NSV_LIMA_NS) - IF ( NMOM_G >= 2 ) ZW2(:,:,:)=XSVT(:,:,:,NSV_LIMA_NG) - IF ( NMOM_H >= 2 ) ZW3(:,:,:)=XSVT(:,:,:,NSV_LIMA_NH) - CALL RADAR_RAIN_ICE( XRT, XCIT, XRHODREF, ZTEMP, ZWORK31, ZWORK32, & - ZWORK33, ZWORK34,XSVT(:,:,:,NSV_LIMA_NR), & - ZW1(:,:,:), ZW2(:,:,:), ZW3(:,:,:) ) - DEALLOCATE( ZW1, ZW2, ZW3 ) - ELSE - CALL RADAR_RAIN_ICE (XRT, XCIT, XRHODREF, ZTEMP, ZWORK31, ZWORK32, & - ZWORK33, ZWORK34 ) - ENDIF -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'RARE', & - CSTDNAME = 'equivalent_reflectivity_factor', & - CLONGNAME = 'RARE', & - CUNITS = 'dBZ', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_RAdar REflectivity', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VDOP', & - CSTDNAME = '', & - CLONGNAME = 'VDOP', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_radar DOPpler fall speed', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ZDR', & - CSTDNAME = '', & - CLONGNAME = 'ZDR', & - CUNITS = 'dBZ', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Differential polar Reflectivity', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'KDP', & - CSTDNAME = '', & - CLONGNAME = 'KDP', & - CUNITS = 'degree km-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Differential Phase Reflectivity', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34) -! - ELSE - ! - WRITE(ILUOUT0,*) 'radar diagnostics from RADAR_SIMULATOR routine' - - NBRAD=COUNT(XLAT_RAD(:) /= XUNDEF) - NMAX=INT(NBSTEPMAX*XSTEP_RAD/XGRID) - IF(NBSTEPMAX*XSTEP_RAD/XGRID/=NMAX .AND. (LCART_RAD)) THEN - CALL PRINT_MSG(NVERB_FATAL,'GEN','WRITE_LFIFM1_FOR_DIAG', & - 'NBSTEPMAX*XSTEP_RAD/XGRID is not an integer; please choose another combination') - ENDIF - DO JI=1,NBRAD - NBELEV(JI)=COUNT(XELEV(JI,:) /= XUNDEF) - WRITE(ILUOUT0,*) 'Number of ELEVATIONS : ', NBELEV(JI), 'FOR RADAR:', JI - END DO - IIELV=MAXVAL(NBELEV(1:NBRAD)) - WRITE(ILUOUT0,*) 'Maximum number of ELEVATIONS',IIELV - WRITE(ILUOUT0,*) 'YOU HAVE ASKED FOR ', NBRAD, 'RADARS' - ! - IF (LCART_RAD) NBAZIM=8*NMAX ! number of azimuths - WRITE(ILUOUT0,*) ' Number of AZIMUTHS : ', NBAZIM - IF (LCART_RAD) THEN - ALLOCATE(ZWORK43(NBRAD,4*NMAX,2*NMAX)) - ELSE - ALLOCATE(ZWORK43(1,NBAZIM,1)) - END IF -!! Some controls... - IF(NBRAD/=COUNT(XLON_RAD(:) /= XUNDEF).OR.NBRAD/=COUNT(XALT_RAD(:) /= XUNDEF).OR. & - NBRAD/=COUNT(XLAM_RAD(:) /= XUNDEF).OR.NBRAD/=COUNT(XDT_RAD(:) /= XUNDEF).OR. & - NBRAD/=COUNT(CNAME_RAD(:) /= "UNDEF")) THEN - CALL PRINT_MSG(NVERB_FATAL,'GEN','WRITE_LFIFM1_FOR_DIAG','inconsistency in DIAG1.nam') - END IF - IF(NCURV_INTERPOL==0.AND.(LREFR.OR.LDNDZ)) THEN - LREFR=.FALSE. - LDNDZ=.FALSE. - WRITE(ILUOUT0,*) "Warning: cannot output refractivity nor its vertical gradient when NCURV_INTERPOL=0" - END IF - IF(MOD(NPTS_H,2)==0) THEN - NPTS_H=NPTS_H+1 - WRITE(ILUOUT0,*) "Warning: NPTS_H has to be ODD. Setting it to ",NPTS_H - END IF - IF(MOD(NPTS_V,2)==0) THEN - NPTS_V=NPTS_V+1 - WRITE(ILUOUT0,*) "Warning: NPTS_V has to be ODD. Setting it to ",NPTS_V - END IF - IF(LWBSCS.AND.LWREFL) THEN - LWREFL=.FALSE. - WRITE(ILUOUT0,*) "Warning: LWREFL cannot be set to .TRUE. if LWBSCS is also set to .TRUE.. Setting LWREFL to .FALSE.." - END IF - IF(CCLOUD=="LIMA" .AND. NDIFF/=7) THEN - WRITE(YMSG,*) 'NDIFF=',NDIFF,' not available with CCLOUD=LIMA' - CALL PRINT_MSG(NVERB_FATAL,'GEN','WRITE_LFIFM1_FOR_DIAG',YMSG) - END IF - INBOUT=28 !28: Temperature + RHR, RHS, RHG, ZDA, ZDS, ZDG, KDR, KDS, KDG - IF (CCLOUD=='LIMA') INBOUT=INBOUT+1 ! rain concentration CRT - IF(LREFR) INBOUT=INBOUT+1 !+refractivity - IF(LDNDZ) INBOUT=INBOUT+1 !+refractivity vertical gradient - IF(LATT) INBOUT=INBOUT+12 !+AER-AEG AVR-AVG (vertical specific attenuation) and ATR-ATG - IF ( CCLOUD=='ICE4' ) THEN - INBOUT=INBOUT+5 ! HAIL ZEH RHH ZDH KDH M_H - IF (LATT) THEN - INBOUT=INBOUT+3 ! AEH AVH ATH - ENDIF - END IF - WRITE(ILUOUT0,*) "Nombre de variables dans ZWORK42 en sortie de radar_simulator:",INBOUT - - IF (LCART_RAD) THEN - ALLOCATE(ZWORK42(NBRAD,IIELV,2*NMAX,2*NMAX,INBOUT)) - ELSE - ALLOCATE(ZWORK42(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,INBOUT)) - ALLOCATE(ZWORK42_BIS(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,INBOUT)) - END IF - ! - IF (CCLOUD=='LIMA') THEN - CALL RADAR_SIMULATOR(XUT,XVT,XWT,XRT,XSVT(:,:,:,NSV_LIMA_NI),XRHODREF,& - ZTEMP,XPABST,ZWORK42,ZWORK43,XSVT(:,:,:,NSV_LIMA_NR)) - ELSE ! ICE3 - CALL RADAR_SIMULATOR(XUT,XVT,XWT,XRT,XCIT,XRHODREF,ZTEMP,XPABSM,ZWORK42,ZWORK43) - ENDIF - ALLOCATE(YRAD(INBOUT)) - YRAD(1:8)=(/"ZHH","ZDR","KDP","CSR","ZER","ZEI","ZES","ZEG"/) - ICURR=9 - IF (CCLOUD=='ICE4') THEN - YRAD(ICURR)="ZEH" - ICURR=ICURR+1 - END IF - YRAD(ICURR)="VRU" - ICURR=ICURR+1 - IF(LATT) THEN - IF (CCLOUD=='ICE4') THEN - YRAD(ICURR:ICURR+14)=(/"AER","AEI","AES","AEG","AEH","AVR","AVI","AVS","AVG","AVH","ATR","ATI","ATS","ATG","ATH"/) - ICURR=ICURR+15 - ELSE - YRAD(ICURR:ICURR+11)=(/"AER","AEI","AES","AEG","AVR","AVI","AVS","AVG","ATR","ATI","ATS","ATG"/) - ICURR=ICURR+12 - END IF - END IF - YRAD(ICURR:ICURR+2)=(/"RHV","PDP","DHV"/) - ICURR=ICURR+3 - YRAD(ICURR:ICURR+2)=(/"RHR","RHS","RHG"/) - ICURR=ICURR+3 - IF (CCLOUD=='ICE4') THEN - YRAD(ICURR)="RHH" - ICURR=ICURR+1 - END IF - YRAD(ICURR:ICURR+2)=(/"ZDA","ZDS","ZDG"/) - ICURR=ICURR+3 - IF (CCLOUD=='ICE4') THEN - YRAD(ICURR)="ZDH" - ICURR=ICURR+1 - END IF - YRAD(ICURR:ICURR+2)=(/"KDR","KDS","KDG"/) - ICURR=ICURR+3 - IF (CCLOUD=='ICE4') THEN - YRAD(ICURR)="KDH" - ICURR=ICURR+1 - END IF - YRAD(ICURR:ICURR+4)=(/"HAS","M_R","M_I","M_S","M_G"/) - ICURR=ICURR+5 - IF (CCLOUD=='ICE4') THEN - YRAD(ICURR)="M_H" - ICURR=ICURR+1 - END IF - YRAD(ICURR:ICURR+1)=(/"CIT","TEM"/) - ICURR=ICURR+2 - IF (CCLOUD=='LIMA') THEN - YRAD(ICURR)="CRT" - ICURR=ICURR+1 - ENDIF - IF(LREFR) THEN - YRAD(ICURR)="RFR" - ICURR=ICURR+1 - END IF - IF(LDNDZ) THEN - YRAD(ICURR)="DNZ" - ICURR=ICURR+1 - END IF - IF (LCART_RAD) THEN - DO JI=1,NBRAD - IEL=NBELEV(JI) - ! writing latlon in internal files - ALLOCATE(CLATLON(2*NMAX)) - CLATLON="" - DO JV=2*NMAX,1,-1 - DO JH=1,2*NMAX - WRITE(CBUFFER,'(2(f8.3,1X))') ZWORK43(JI,2*JH-1,JV),ZWORK43(JI,2*JH,JV) - CLATLON(JV)=TRIM(CLATLON(JV)) // " " // TRIM(CBUFFER) - END DO - CLATLON(JV)=TRIM(ADJUSTL(CLATLON(JV))) - END DO - DO JEL=1,IEL - WRITE(YELEV,'(I2.2,A1,I1.1)') FLOOR(XELEV(JI,JEL)),'.',& - INT(ANINT(10.*XELEV(JI,JEL))-10*INT(XELEV(JI,JEL))) - WRITE(YGRID_SIZE,'(I3.3)') 2*NMAX - DO JJ=1,SIZE(ZWORK42(:,:,:,:,:),5) - YRS=YRAD(JJ)//CNAME_RAD(JI)(1:3)//YELEV//YGRID_SIZE//TRIM(TPFILE%CNAME) - CALL IO_File_add2list(TZRSFILE,YRS,'TXT','WRITE',KRECL=8192) - CALL IO_File_open(TZRSFILE,HSTATUS='NEW') - ILURS = TZRSFILE%NLU - WRITE(ILURS,'(A,4F12.6,2I5)') '**domaine LATLON ',ZWORK43(JI,1,1),ZWORK43(JI,4*NMAX-1,2*NMAX), & - ZWORK43(JI,2,1),ZWORK43(JI,4*NMAX,2*NMAX),2*NMAX,2*NMAX !! HEADER - DO JV=2*NMAX,1,-1 - DO JH=1,2*NMAX - WRITE(ILURS,'(E11.5,1X)',ADVANCE='NO') ZWORK42(JI,JEL,JH,JV,JJ) - END DO - WRITE(ILURS,*) '' - END DO - - DO JV=2*NMAX,1,-1 - WRITE(ILURS,*) CLATLON(JV) - END DO - CALL IO_File_close(TZRSFILE) - TZRSFILE => NULL() - END DO - END DO - DEALLOCATE(CLATLON) - END DO - ELSE ! polar output - CALL MPI_ALLREDUCE(ZWORK42, ZWORK42_BIS, SIZE(ZWORK42), MNHREAL_MPI, MPI_MAX, NMNH_COMM_WORLD, IERR) - DO JI=1,NBRAD - IEL=NBELEV(JI) - DO JEL=1,IEL - WRITE(YELEV,'(I2.2,A1,I1.1)') FLOOR(XELEV(JI,JEL)),'.',& - INT(ANINT(10.*XELEV(JI,JEL))-10*INT(XELEV(JI,JEL))) - DO JJ=1,SIZE(ZWORK42(:,:,:,:,:),5) - YRS="P"//YRAD(JJ)//CNAME_RAD(JI)(1:3)//YELEV//TRIM(TPFILE%CNAME) - CALL IO_File_add2list(TZRSFILE,YRS,'TXT','WRITE') - CALL IO_File_open(TZRSFILE) - ILURS = TZRSFILE%NLU - DO JH=1,NBAZIM - DO JV=1,NBSTEPMAX+1 - WRITE(ILURS,"(F15.7)") ZWORK42_BIS(JI,JEL,JH,JV,JJ) - END DO - END DO - CALL IO_File_close(TZRSFILE) - TZRSFILE => NULL() - END DO - END DO - END DO - END IF !polar output - DEALLOCATE(ZWORK42,ZWORK43) - END IF -END IF -! -IF (LLIDAR) THEN - PRINT *,'CALL LIDAR/RADAR with TPFILE%CNAME =',TPFILE%CNAME - YVIEW=' ' - YVIEW=TRIM(CVIEW_LIDAR) - PRINT *,'CVIEW_LIDAR REQUESTED ',YVIEW - IF (YVIEW/='NADIR'.AND.YVIEW/='ZENIT') YVIEW='NADIR' - PRINT *,'CVIEW_LIDAR USED ',YVIEW - PRINT *,'XALT_LIDAR REQUESTED (m) ',XALT_LIDAR - PRINT *,'XWVL_LIDAR REQUESTED (m) ',XWVL_LIDAR - IF (XWVL_LIDAR==XUNDEF) XWVL_LIDAR=0.532E-6 - IF (XWVL_LIDAR<1.E-7.OR.XWVL_LIDAR>2.E-6) THEN - PRINT *,'CAUTION: THE XWVL_LIDAR REQUESTED IS OUTSIDE THE USUAL RANGE' - XWVL_LIDAR=0.532E-6 - ENDIF - PRINT *,'XWVL_LIDAR USED (m) ',XWVL_LIDAR -! - IF (LDUST) THEN - IACCMODE=MIN(2,NMODE_DST) - ALLOCATE(ZTMP1(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), 1)) - ALLOCATE(ZTMP2(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), 1)) - ALLOCATE(ZTMP3(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), 1)) - ZTMP1(:,:,:,1)=ZN0_DST(:,:,:,IACCMODE) - ZTMP2(:,:,:,1)=ZRG_DST(:,:,:,IACCMODE) - ZTMP3(:,:,:,1)=ZSIG_DST(:,:,:,IACCMODE) - SELECT CASE ( CCLOUD ) - CASE('KESS''ICE3','ICE4') - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, & - XRT, ZWORK31, ZWORK32, & - PDSTC=ZTMP1, & - PDSTD=ZTMP2, & - PDSTS=ZTMP3) - CASE('C2R2') - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, & - XRT, ZWORK31, ZWORK32, & - PCT=XSVT(:,:,:,NSV_C2R2BEG+1:NSV_C2R2END), & - PDSTC=ZTMP1, & - PDSTD=ZTMP2, & - PDSTS=ZTMP3) - CASE('C3R5') - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, & - XRT, ZWORK31, ZWORK32, & - PCT=XSVT(:,:,:,NSV_C2R2BEG+1:NSV_C1R3END-1), & - PDSTC=ZTMP1, & - PDSTD=ZTMP2, & - PDSTS=ZTMP3) - CASE('LIMA') -! PCT(2) = droplets (3)=drops (4)=ice crystals - ALLOCATE(ZTMP4(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), 4)) - ZTMP4(:,:,:,1)=0. - ZTMP4(:,:,:,2)=XSVT(:,:,:,NSV_LIMA_NC) - ZTMP4(:,:,:,3)=XSVT(:,:,:,NSV_LIMA_NR) - ZTMP4(:,:,:,4)=XSVT(:,:,:,NSV_LIMA_NI) -! - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, MAX(XCLDFR,XICEFR),& - XRT, ZWORK31, ZWORK32, & - PCT=ZTMP4, & - PDSTC=ZTMP1, & - PDSTD=ZTMP2, & - PDSTS=ZTMP3) -! - END SELECT - ELSE - SELECT CASE ( CCLOUD ) - CASE('KESS','ICE3','ICE4') - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, & - XRT, ZWORK31, ZWORK32) - CASE('C2R2') - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, & - XRT, ZWORK31, ZWORK32, & - PCT=XSVT(:,:,:,NSV_C2R2BEG+1:NSV_C2R2END)) - CASE('C3R5') - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, & - XRT, ZWORK31, ZWORK32, & - PCT=XSVT(:,:,:,NSV_C2R2BEG+1:NSV_C1R3END-1)) - CASE('LIMA') -! PCT(2) = droplets (3)=drops (4)=ice crystals - ALLOCATE(ZTMP4(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), 4)) - ZTMP4(:,:,:,1)=0. - ZTMP4(:,:,:,2)=XSVT(:,:,:,NSV_LIMA_NC) - ZTMP4(:,:,:,3)=XSVT(:,:,:,NSV_LIMA_NR) - ZTMP4(:,:,:,4)=XSVT(:,:,:,NSV_LIMA_NI) -! - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, MAX(XCLDFR,XICEFR),& - XRT, ZWORK31, ZWORK32, & - PCT=ZTMP4) - END SELECT - ENDIF -! - IF( ALLOCATED(ZTMP1) ) DEALLOCATE(ZTMP1) - IF( ALLOCATED(ZTMP2) ) DEALLOCATE(ZTMP2) - IF( ALLOCATED(ZTMP3) ) DEALLOCATE(ZTMP3) - IF( ALLOCATED(ZTMP4) ) DEALLOCATE(ZTMP4) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'LIDAR', & - CSTDNAME = '', & - CLONGNAME = 'LIDAR', & - CUNITS = 'm-1 sr-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Normalized_Lidar_Profile', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'LIPAR', & - CSTDNAME = '', & - CLONGNAME = 'LIPAR', & - CUNITS = 'm-1 sr-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Particle_Lidar_Profile', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) -! -END IF -! -!------------------------------------------------------------------------------- -! -!* Height of boundary layer -! -IF (CBLTOP == 'THETA') THEN - ! - ! methode de la parcelle - ! - ALLOCATE(ZSHMIX(IIU,IJU)) - - ZWORK31(:,:,1:IKU-1)=0.5*(XZZ(:,:,1:IKU-1)+XZZ(:,:,2:IKU)) - ZWORK31(:,:,IKU)=2.*ZWORK31(:,:,IKU-1)-ZWORK31(:,:,IKU-2) - ZWORK21(:,:) = ZTHETAV(:,:,IKB)+0.5 - ZSHMIX(:,:) = 0.0 - DO JJ=1,IJU - DO JI=1,IIU - DO JK=IKB,IKE - IF ( ZTHETAV(JI,JJ,JK).GT.ZWORK21(JI,JJ) ) THEN - ZSHMIX(JI,JJ) = ZWORK31(JI,JJ,JK-1) & - +( ZWORK31(JI,JJ,JK) - ZWORK31 (JI,JJ,JK-1) ) & - /( ZTHETAV(JI,JJ,JK) - ZTHETAV(JI,JJ,JK-1) ) & - *( ZWORK21(JI,JJ) - ZTHETAV(JI,JJ,JK-1) ) - EXIT - END IF - END DO - END DO - END DO - ZSHMIX(:,:)=ZSHMIX(:,:)-XZS(:,:) - ZSHMIX(:,:)=MAX(ZSHMIX(:,:),50.0) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'HBLTOP', & - CSTDNAME = 'atmosphere_boundary_layer_thickness', & - CLONGNAME = 'HBLTOP', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'Height of Boundary Layer TOP', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZSHMIX) - ! - DEALLOCATE(ZSHMIX) -ELSEIF (CBLTOP == 'RICHA') THEN - ! - ! methode du "bulk Richardson number" - ! - ALLOCATE(ZRIB(IIU,IJU,IKU)) - ALLOCATE(ZSHMIX(IIU,IJU)) - - ZWORK31(:,:,1:IKU-1)=0.5*(XZZ(:,:,1:IKU-1)+XZZ(:,:,2:IKU)) - ZWORK31(:,:,IKU)=2.*ZWORK31(:,:,IKU-1)-ZWORK31(:,:,IKU-2) - ZWORK32=MXF(XUT) - ZWORK33=MYF(XVT) - ZWORK34=ZWORK32**2+ZWORK33**2 - DO JK=IKB,IKE - ZRIB(:,:,JK)=XG*ZWORK31(:,:,JK)*(ZTHETAV(:,:,JK)-ZTHETAV(:,:,IKB))/(ZTHETAV(:,:,IKB)*ZWORK34(:,:,JK)) - ENDDO - ZSHMIX=0.0 - DO JJ=1,IJU - DO JI=1,IIU - DO JK=IKB,IKE - IF ( ZRIB(JI,JJ,JK).GT.0.25 ) THEN - ZSHMIX(JI,JJ) = ZWORK31(JI,JJ,JK-1) & - +( ZWORK31(JI,JJ,JK) - ZWORK31(JI,JJ,JK-1) ) & - *( 0.25 - ZRIB(JI,JJ,JK-1) ) & - /( ZRIB(JI,JJ,JK) - ZRIB(JI,JJ,JK-1) ) - EXIT - END IF - END DO - END DO - END DO - ZSHMIX(:,:)=ZSHMIX(:,:)-XZS(:,:) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'HBLTOP', & - CSTDNAME = 'atmosphere_boundary_layer_thickness', & - CLONGNAME = 'HBLTOP', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'Height of Boundary Layer TOP', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZSHMIX) - ! - DEALLOCATE(ZRIB,ZSHMIX) -ENDIF -! -IF (ALLOCATED(ZTHETAV)) DEALLOCATE(ZTHETAV) -! -! -!* Ligthning -! -IF ( LCH_CONV_LINOX ) THEN - CALL IO_Field_write(TPFILE,'IC_RATE', XIC_RATE) - CALL IO_Field_write(TPFILE,'CG_RATE', XCG_RATE) - CALL IO_Field_write(TPFILE,'IC_TOTAL_NB',XIC_TOTAL_NUMBER) - CALL IO_Field_write(TPFILE,'CG_TOTAL_NB',XCG_TOTAL_NUMBER) -END IF -!------------------------------------------------------------------------------- -!------------------------------------------------------------------------------- -! -!* 1.8 My own variables : -! -!------------------------------------------------------------------------------- -!------------------------------------------------------------------------------- -! -!------------------------------------------------------------------------------- -END SUBROUTINE WRITE_LFIFM1_FOR_DIAG diff --git a/src/PHYEX/ext/write_lfifm1_for_diag_supp.f90 b/src/PHYEX/ext/write_lfifm1_for_diag_supp.f90 deleted file mode 100644 index 380dc9fd6..000000000 --- a/src/PHYEX/ext/write_lfifm1_for_diag_supp.f90 +++ /dev/null @@ -1,1664 +0,0 @@ -!MNH_LIC Copyright 2000-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ###################################### - MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP -! ###################################### -INTERFACE -! - SUBROUTINE WRITE_LFIFM1_FOR_DIAG_SUPP(TPFILE) -! -USE MODD_IO, ONLY: TFILEDATA -! -!* 0.1 Declarations of arguments -! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -END SUBROUTINE WRITE_LFIFM1_FOR_DIAG_SUPP -! -END INTERFACE -! -END MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP -! -! ############################################## - SUBROUTINE WRITE_LFIFM1_FOR_DIAG_SUPP(TPFILE) -! ############################################## -! -!!**** *WRITE_LFIFM1_FOR_DIAG_SUPP* - write records in the diag file -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to write in the file -! of name YFMFILE//'.lfi' with the FM routines. -! -!!** METHOD -!! ------ -!! The data are written in the LFIFM file : -!! - diagnostics from the convection -!! - diagnostics from the radiatif transfer code -!! -!! The localization on the model grid is also indicated : -!! IGRID = 1 for mass grid point -!! IGRID = 2 for U grid point -!! IGRID = 3 for V grid point -!! IGRID = 4 for w grid point -!! IGRID = 0 for meaningless case -!! -!! EXTERNAL -!! -------- -!! FMWRIT : FM-routine to write a record -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! J. Stein *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 13/09/00 -!! N. Asencio 15/09/00 computation of temperature and height of clouds is moved -!! here and deleted in WRITE_LFIFM1_FOR_DIAG routine -!! I. Mallet 02/11/00 add the call to RADTR_SATEL -!! J.-P. Chaboureau 11/12/03 add call the CALL_RTTOV (table NRTTOVINFO to -!! choose the platform, the satellite, the sensor for all channels -!! (see the table in rttov science and validation report) and the -!! type of calculations in the namelist: 0 = tb, 1 = tb + jacobian, -!! 2 = tb + adjoint, 3 = tb + jacobian + adjoint) -!! V. Masson 01/2004 removes surface (externalization) -!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after -!! change of YCOMMENT -!! October 2011 (C.Lac) FF10MAX : interpolation of 10m wind -!! between 2 Meso-NH levels if 10m is above the first atmospheric level -!! 2015 : D.Ricard add UM10/VM10 for LCARTESIAN=T cases -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! P.Tulet : Diag for salt and orilam -!! J.-P. Chaboureau 07/03/2016 fix the dimensions of local arrays -!! P.Wautelet : 11/07/2016 : removed MNH_NCWRIT define -!! J.-P. Chaboureau 31/10/2016 add the call to RTTOV11 -!! F. Brosse 10/2016 add chemical production destruction terms outputs -!! M.Leriche 01/07/2017 Add DIAG chimical surface fluxes -!! J.-P. Chaboureau 01/2018 add altitude interpolation -!! J.-P. Chaboureau 01/2018 add coarse graining -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! J.-P. Chaboureau 07/2018 bug fix on XEMIS when calling CALL_RTTOVxx -!! J.-P. Chaboureau 09/04/2021 add the call to RTTOV13 -! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables -!! D. Ricard & Q.Rodier 08/2023 add some diagnostics on pressure levels -!! (temperature, relative and specific humidity, vertical velocity, TKE) -!! D. Ricard 08/2023 add a diagnostic: maximum of cloud fraction on vertical levels -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CH_AEROSOL, ONLY: LORILAM -USE MODD_CH_BUDGET_n, ONLY: CNAMES_BUDGET, NEQ_BUDGET, XTCHEM -USE MODD_CH_FLX_n, ONLY: XCHFLX -USE MODD_CH_PRODLOSSTOT_n, ONLY: CNAMES_PRODLOSST, NEQ_PLT, XLOSS, XPROD -USE MODD_CST, ONLY: XCPD, XP00, XRD, XTT, XMV, XMD, XALPI, XGAMI, XBETAI -USE MODD_CURVCOR_n, ONLY: XCORIOZ -USE MODD_DIAG_IN_RUN, ONLY: XCURRENT_ZON10M, XCURRENT_MER10M, & - XCURRENT_SFCO2, XCURRENT_SWD, XCURRENT_LWD, & - XCURRENT_SWU, XCURRENT_LWU -USE MODD_DUST, ONLY: LDUST -use modd_field, only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED, NMNHDIM_UNUSED, & - tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL -use modd_field -USE MODD_IO, ONLY: TFILEDATA -USE MODD_CONF, ONLY: LCARTESIAN -USE MODD_CONF_n, ONLY: LUSERC, LUSERI, LUSERV, NRR -USE MODD_DEEP_CONVECTION_n, ONLY: NCLBASCONV, NCLTOPCONV, XCAPE, XDMFCONV, XDRCCONV, XDRICONV, XDRVCONV, & - XDTHCONV, XDSVCONV, XMFCONV, XPRLFLXCONV, XPRSFLXCONV, XUMFCONV -USE MODD_DIAG_FLAG, ONLY: CRAD_SAT, LCHEMDIAG, LCLD_COV, LCOARSE, LISOAL, LISOPR, LISOTH, LRAD_SUBG_COND, & - NCONV_KF, NDXCOARSE, NRAD_3D, NRTTOVINFO, XISOAL, XISOPR, XISOTH -USE MODD_FIELD_n, ONLY: XCLDFR, XICEFR, XPABST, XSIGS, XTHT, XTKET, XRT, XUT, XVT, XWT -USE MODD_GRID_n, ONLY: XZHAT, XZZ -USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ -USE MODD_NEB_n, ONLY: LSIGMAS, LSUBG_COND, VSIGQSAT -USE MODD_NSV, ONLY: NSV, NSV_CHEMBEG, NSV_CHEMEND, TSVLIST -USE MODD_PARAMETERS, ONLY: JPVEXT, NUNDEF, XUNDEF -USE MODD_PARAM_KAFR_n, ONLY: LCHTRANS -USE MODD_PARAM_n, ONLY: CRAD, CSURF, CCLOUD -USE MODD_PARAM_RAD_n, only: NRAD_COLNBR -USE MODD_RADIATIONS_N, ONLY: NCLEARCOL_TM1, NDLON, NFLEV, NSTATM, & - XAER, XAZIM, XCCO2, XDIR_ALB, XDIRFLASWD, XDIRSRFSWD, XDTHRAD, XEMIS, & - XFLALWD, XSCA_ALB, XSCAFLASWD, XSTATM, XTSRAD, XZENITH -USE MODD_RAD_TRANSF, ONLY: JPGEOST -USE MODD_REF_n, ONLY: XRHODREF -USE MODD_SALT, ONLY: LSALT -USE MODD_TIME_n, ONLY: TDTCUR -USE MODD_NEB_n, ONLY: LSIGMAS, LSUBG_COND, VSIGQSAT - -use mode_field, only: Find_field_id_from_mnhname -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -USE MODE_MSG -USE MODE_NEIGHBORAVG, ONLY: BLOCKAVG, MOVINGAVG -USE MODE_THERMO, ONLY: SM_FOES -USE MODE_TOOLS_LL, ONLY: GET_INDICE_ll - -#ifdef MNH_RTTOV_8 -USE MODI_CALL_RTTOV8 -#endif -#ifdef MNH_RTTOV_11 -USE MODI_CALL_RTTOV11 -#endif -#ifdef MNH_RTTOV_13 -USE MODI_CALL_RTTOV13 -#endif -USE MODI_GET_SURF_UNDEF -USE MODI_GRADIENT_M -USE MODI_GRADIENT_U -USE MODI_GRADIENT_UV -USE MODI_GRADIENT_V -USE MODI_GRADIENT_W -USE MODI_PINTER -USE MODI_SHUMAN -USE MODI_RADTR_SATEL -USE MODI_UV_TO_ZONAL_AND_MERID -USE MODI_ZINTER - -IMPLICIT NONE -! -!* 0.1 Declarations of arguments -! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -!* 0.2 Declarations of local variables -! -INTEGER :: IIU,IJU,IKU,IIB,IJB,IKB,IIE,IJE,IKE ! Arrays bounds -INTEGER :: IKRAD -! -INTEGER :: JI,JJ,JK,JSV,JRR ! loop index -! -! variables for Diagnostic variables related to deep convection -REAL,DIMENSION(:,:), ALLOCATABLE :: ZWORK21,ZWORK22 -! -! variables for computation of temperature and height of clouds -REAL :: ZCLMR ! value of mixing ratio tendency for detection of cloud top -LOGICAL, DIMENSION(:,:), ALLOCATABLE :: GMASK2 -INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK1, IWORK2 -INTEGER, DIMENSION(:,:), ALLOCATABLE :: ICL_HE_ST -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK31,ZTEMP -! -! variables needed for the transfer radiatif diagnostic code -INTEGER :: ITOTGEO -INTEGER, DIMENSION (JPGEOST) :: INDGEO -CHARACTER(LEN=8), DIMENSION (JPGEOST) :: YNAM_SAT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZIRBT, ZWVBT -REAL :: ZUNDEF ! undefined value in SURFEX -! -! variables needed for 10m wind -INTEGER :: ILEVEL -! -INTEGER :: IPRES, ITH -CHARACTER(LEN=4) :: YCAR4 -CHARACTER(LEN=4), DIMENSION(SIZE(XISOPR)) :: YPRES -CHARACTER(LEN=4), DIMENSION(SIZE(XISOTH)) :: YTH -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK32,ZWORK33,ZWORK34,ZWRES,ZPRES,ZWTH, & - ZRT,ZQV,ZMRVP,ZWRES1,ZTEMPP -REAL, DIMENSION(:), ALLOCATABLE :: ZTH -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZPOVO -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZVOX,ZVOY,ZVOZ -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZCORIOZ -TYPE(TFIELDMETADATA) :: TZFIELD -TYPE(TFIELDMETADATA), DIMENSION(2) :: TZFIELD2 -! -! variables needed for altitude interpolation -INTEGER :: IAL -REAL :: ZFILLVAL -REAL, DIMENSION(:), ALLOCATABLE :: ZAL -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWAL -! -! variables needed for coarse graining -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZUT_PRM,ZVT_PRM,ZWT_PRM -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZUU_AVG,ZVV_AVG,ZWW_AVG -INTEGER :: IDX, IID, IRESP -CHARACTER(LEN=3) :: YDX -!------------------------------------------------------------------------------- -! -!* 0. ARRAYS BOUNDS INITIALIZATION -! -IIU=SIZE(XTHT,1) -IJU=SIZE(XTHT,2) -IKU=SIZE(XTHT,3) -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB=1+JPVEXT -IKE=IKU-JPVEXT -! -ALLOCATE(ZWORK21(IIU,IJU)) -ALLOCATE(ZWORK31(IIU,IJU,IKU)) -ALLOCATE(ZTEMP(IIU,IJU,IKU)) -ZTEMP(:,:,:)=XTHT(:,:,:)*(XPABST(:,:,:)/ XP00) **(XRD/XCPD) -! -!------------------------------------------------------------------------------- -! -!* 1. DIAGNOSTIC RELATED TO CONVECTION -! -------------------------------- -! -!* Diagnostic variables related to deep convection -! -IF (NCONV_KF >= 0) THEN - CALL IO_Field_write(TPFILE,'CAPE',XCAPE) -! - ! top height (km) of convective clouds - ZWORK21(:,:)= 0. - DO JJ=IJB,IJE - DO JI=IIB,IIE - IF (NCLTOPCONV(JI,JJ)/=0) ZWORK21(JI,JJ)= XZZ(JI,JJ,NCLTOPCONV(JI,JJ))/1.E3 - END DO - END DO - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'CLTOPCONV', & - CSTDNAME = 'convective_cloud_top_altitude', & - CLONGNAME = 'CLTOPCONV', & - CUNITS = 'km', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Top of Convective Cloud', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) -! - ! base height (km) of convective clouds - ZWORK21(:,:)= 0. - DO JJ=IJB,IJE - DO JI=IIB,IIE - IF (NCLBASCONV(JI,JJ)/=0) ZWORK21(JI,JJ)= XZZ(JI,JJ,NCLBASCONV(JI,JJ))/1.E3 - END DO - END DO - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'CLBASCONV', & - CSTDNAME = 'convective_cloud_base_altitude', & - CLONGNAME = 'CLBASCONV', & - CUNITS = 'km', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Base of Convective Cloud', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) -END IF - -IF (NCONV_KF >= 1) THEN - CALL IO_Field_write(TPFILE,'DTHCONV',XDTHCONV) - CALL IO_Field_write(TPFILE,'DRVCONV',XDRVCONV) - CALL IO_Field_write(TPFILE,'DRCCONV',XDRCCONV) - CALL IO_Field_write(TPFILE,'DRICONV',XDRICONV) -! - IF ( LCHTRANS .AND. NSV > 0 ) THEN - ! scalar variables are recorded - ! individually in the file - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic for DSVCONV', & !Temporary name to ease identification - CUNITS = 's-1', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - - DO JSV = 1, NSV - TZFIELD%CMNHNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CMNHNAME ) - TZFIELD%CLONGNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CLONGNAME ) - TZFIELD%CCOMMENT = 'Convective tendency for ' // TRIM( TSVLIST(JSV)%CMNHNAME ) - CALL IO_Field_write( TPFILE, TZFIELD, XDSVCONV(:,:,:,JSV) ) - END DO - END IF -END IF - -IF (NCONV_KF >= 2) THEN - CALL IO_Field_write(TPFILE,'PRLFLXCONV',XPRLFLXCONV) - CALL IO_Field_write(TPFILE,'PRSFLXCONV',XPRSFLXCONV) - CALL IO_Field_write(TPFILE,'UMFCONV', XUMFCONV) - CALL IO_Field_write(TPFILE,'DMFCONV', XDMFCONV) -END IF -!------------------------------------------------------------------------------- -! -!* Height and temperature of clouds top -! -IF (LCLD_COV .AND. LUSERC) THEN - ALLOCATE(IWORK1(IIU,IJU),IWORK2(IIU,IJU)) - ALLOCATE(ICL_HE_ST(IIU,IJU)) - ALLOCATE(GMASK2(IIU,IJU)) - ALLOCATE(ZWORK22(IIU,IJU)) -! -! Explicit clouds -! - ICL_HE_ST(:,:)=IKB !initialization - IWORK1(:,:)=IKB ! with the - IWORK2(:,:)=IKB ! ground values - ZCLMR=1.E-4 ! detection of clouds for cloud mixing ratio > .1g/kg -! - GMASK2(:,:)=.TRUE. - ZWORK31(:,:,:)= MZM( XRT(:,:,:,2) ) ! cloud mixing ratio at zz levels - DO JK=IKE,IKB,-1 - WHERE ( (GMASK2(:,:)).AND.(ZWORK31(:,:,JK)>ZCLMR) ) - GMASK2(:,:)=.FALSE. - IWORK1(:,:)=JK - END WHERE - END DO -! - IF (LUSERI) THEN - GMASK2(:,:)=.TRUE. - ZWORK31(:,:,:)= MZM( XRT(:,:,:,4) ) ! cloud mixing ratio at zz levels - DO JK=IKE,IKB,-1 - WHERE ( (GMASK2(:,:)).AND.(ZWORK31(:,:,JK)>ZCLMR) ) - GMASK2(:,:)=.FALSE. - IWORK2(:,:)=JK - END WHERE - END DO - END IF -! - ZWORK21(:,:)=0. - DO JJ=IJB,IJE - DO JI=IIB,IIE - ICL_HE_ST(JI,JJ)=MAX(IWORK1(JI,JJ),IWORK2(JI,JJ) ) - ZWORK21(JI,JJ) =XZZ(JI,JJ,ICL_HE_ST(JI,JJ)) ! height (m) of explicit clouds - END DO - END DO -! - WHERE ( ZWORK21(:,:)==XZZ(:,:,IKB) ) ZWORK21=0. ! set the height to - ! 0 if there is no cloud - ZWORK21(:,:)=ZWORK21(:,:)/1.E3 ! height (km) of explicit clouds -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'HECL', & - CSTDNAME = '', & - CLONGNAME = 'HECL', & - CUNITS = 'km', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Height of Explicit CLoud top', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) -! -! Higher top of the different species of clouds -! - IWORK1(:,:)=IKB ! initialization with the ground values - ZWORK31(:,:,:)=MZM(ZTEMP(:,:,:)) ! temperature (K) at zz levels - IF(CRAD/='NONE') ZWORK31(:,:,IKB)=XTSRAD(:,:) - ZWORK21(:,:)=0. - ZWORK22(:,:)=0. - DO JJ=IJB,IJE - DO JI=IIB,IIE - IWORK1(JI,JJ)=ICL_HE_ST(JI,JJ) - IF (NCONV_KF >=0) & - IWORK1(JI,JJ)= MAX(ICL_HE_ST(JI,JJ),NCLTOPCONV(JI,JJ)) - ZWORK21(JI,JJ)= XZZ(JI,JJ,IWORK1(JI,JJ)) ! max. cloud height (m) - ZWORK22(JI,JJ)= ZWORK31(JI,JJ,IWORK1(JI,JJ))-XTT ! cloud temperature (C) - END DO - END DO -! - IF (NCONV_KF <0) THEN - PRINT*,'YOU DO NOT ASK FOR CONVECTIVE DIAGNOSTICS (NCONV_KF<0), SO' - PRINT*,' HC not written in FM-file (equal to HEC)' - ELSE - WHERE ( ZWORK21(:,:)==XZZ(:,:,IKB) ) ZWORK21(:,:)=0. ! set the height to - ! 0 if there is no cloud - ZWORK21(:,:)=ZWORK21(:,:)/1.E3 ! max. cloud height (km) -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'HCL', & - CSTDNAME = 'cloud_top_altitude', & - CLONGNAME = 'HCL', & - CUNITS = 'km', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Height of CLoud top', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - ENDIF -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'TCL', & - CSTDNAME = 'air_temperature_at_cloud_top', & - CLONGNAME = 'TCL', & - CUNITS = 'celsius', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Height of CLoud top', & - NGRID = 4, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) -! - CALL IO_Field_write(TPFILE,'CLDFR',XCLDFR) - CALL IO_Field_write(TPFILE,'ICEFR',XICEFR) -! - ZWORK21(:,:)=0.0 - ZWORK21(IIB:IIE,IJB:IJE)=MAXVAL(XCLDFR(IIB:IIE,IJB:IJE,JPVEXT+1:IKE),DIM=3) - - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'CLDFRMAX', & - !Invalid CF convention standard name: CSTDNAME = 'max_cloud_fraction', & - CLONGNAME = 'CLDFRMAX', & - CUNITS = '1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_MAx of CLoud fraction', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - ! -! Visibility -! - ZWORK31(:,:,:)= 1.E4 ! 10 km for clear sky - WHERE (XRT(:,:,:,2) > 0.) - ZWORK31(:,:,:)=3.9E3/(144.7*(XRHODREF(:,:,:)*1.E3*XRT(:,:,:,2)/(1.+XRT(:,:,:,2)))**0.88) - END WHERE -! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VISI_HOR', & - CSTDNAME = 'visibility_in_air', & - CLONGNAME = 'VISI_HOR', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_VISI_HOR', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -! - DEALLOCATE(IWORK1,IWORK2,ICL_HE_ST,GMASK2,ZWORK22) -END IF -! -!------------------------------------------------------------------------------- -! -!* 2. DIAGNOSTIC RELATED TO RADIATIONS -! -------------------------------- -! -IF (NRAD_3D >= 0) THEN - IF (CRAD /= 'NONE') THEN - CALL IO_Field_write(TPFILE,'DTHRAD', XDTHRAD) - CALL IO_Field_write(TPFILE,'FLALWD', XFLALWD) - CALL IO_Field_write(TPFILE,'DIRFLASWD', XDIRFLASWD) - CALL IO_Field_write(TPFILE,'SCAFLASWD', XSCAFLASWD) - CALL IO_Field_write(TPFILE,'DIRSRFSWD', XDIRSRFSWD) - CALL IO_Field_write(TPFILE,'CLEARCOL_TM1',NCLEARCOL_TM1) - CALL IO_Field_write(TPFILE,'ZENITH', XZENITH) - CALL IO_Field_write(TPFILE,'AZIM', XAZIM) - CALL IO_Field_write(TPFILE,'DIR_ALB', XDIR_ALB) - CALL IO_Field_write(TPFILE,'SCA_ALB', XSCA_ALB) - ! - CALL PRINT_MSG(NVERB_INFO,'IO','WRITE_LFIFM1_FOR_DIAG_SUPP','EMIS: writing only first band') - CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS',IID,IRESP) - TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) - TZFIELD%NDIMS = 2 - TZFIELD%NDIMLIST(3) = TZFIELD%NDIMLIST(4) - TZFIELD%NDIMLIST(4) = NMNHDIM_UNUSED - CALL IO_Field_write(TPFILE,TZFIELD,XEMIS(:,:,1)) - ! - CALL IO_Field_write(TPFILE,'TSRAD', XTSRAD) - ELSE - PRINT*,'YOU WANT DIAGNOSTICS RELATED TO RADIATION' - PRINT*,' BUT NO RADIATIVE SCHEME WAS ACTIVATED IN THE MODEL' - END IF -END IF -IF (NRAD_3D >= 1) THEN - IF (LDUST) THEN -!Dust optical depth between two vertical levels - ZWORK31(:,:,:)=0. - DO JK=IKB,IKE - IKRAD = JK - JPVEXT - ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3) - END DO - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'DSTAOD3D', & - CSTDNAME = '', & - CLONGNAME = 'DSTAOD3D', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_DuST Aerosol Optical Depth', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -!Dust optical depth - ZWORK21(:,:)=0.0 - DO JK=IKB,IKE - IKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZWORK21(JI,JJ)=ZWORK21(JI,JJ)+XAER(JI,JJ,IKRAD,3) - ENDDO - ENDDO - ENDDO - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'DSTAOD2D', & - CSTDNAME = '', & - CLONGNAME = 'DSTAOD2D', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_DuST Aerosol Optical Depth', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) -!Dust extinction (optical depth per km) - DO JK=IKB,IKE - IKRAD = JK - JPVEXT - ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3 - ENDDO - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'DSTEXT', & - CSTDNAME = '', & - CLONGNAME = 'DSTEXT', & - CUNITS = 'km-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_DuST EXTinction', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END IF - IF (LSALT) THEN -!Salt optical depth between two vertical levels - ZWORK31(:,:,:)=0. - DO JK=IKB,IKE - IKRAD = JK - JPVEXT - ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2) - END DO - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SLTAOD3D', & - CSTDNAME = '', & - CLONGNAME = 'SLTAOD3D', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Salt Aerosol Optical Depth', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -!Salt optical depth - ZWORK21(:,:)=0.0 - DO JK=IKB,IKE - IKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZWORK21(JI,JJ)=ZWORK21(JI,JJ)+XAER(JI,JJ,IKRAD,2) - ENDDO - ENDDO - ENDDO - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SLTAOD2D', & - CSTDNAME = '', & - CLONGNAME = 'SLTAOD2D', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Salt Aerosol Optical Depth', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) -!Salt extinction (optical depth per km) - DO JK=IKB,IKE - IKRAD = JK - JPVEXT - ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3 - ENDDO - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SLTEXT', & - CSTDNAME = '', & - CLONGNAME = 'SLTEXT', & - CUNITS = 'km-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Salt EXTinction', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END IF - IF (LORILAM) THEN -!Orilam anthropogenic optical depth between two vertical levels - ZWORK31(:,:,:)=0. - DO JK=IKB,IKE - IKRAD = JK - JPVEXT - ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4) - END DO - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'AERAOD3D', & - CSTDNAME = '', & - CLONGNAME = 'AERAOD3D', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Anthropogenic Aerosol Optical Depth', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -!Orilam anthropogenic optical depth - ZWORK21(:,:)=0.0 - DO JK=IKB,IKE - IKRAD = JK - JPVEXT - DO JJ=IJB,IJE - DO JI=IIB,IIE - ZWORK21(JI,JJ)=ZWORK21(JI,JJ)+XAER(JI,JJ,IKRAD,4) - ENDDO - ENDDO - ENDDO - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'AERAOD2D', & - CSTDNAME = '', & - CLONGNAME = 'AERAOD2D', & - CUNITS = 'm', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Anthropogenic Aerosol Optical Depth', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) -!Orilam anthropogenic extinction (optical depth per km) - DO JK=IKB,IKE - IKRAD = JK - JPVEXT - ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3 - ENDDO - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'AEREXT', & - CSTDNAME = '', & - CLONGNAME = 'AEREXT', & - CUNITS = 'km-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Anthropogenic EXTinction', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END IF -END IF -! -!------------------------------------------------------------------------------- -! Net surface gaseous fluxes -IF (LCHEMDIAG) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic for net chemical flux', & !Temporary name to ease identification - CUNITS = 'ppb m s-1', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - ! - DO JSV = NSV_CHEMBEG, NSV_CHEMEND - TZFIELD%CMNHNAME = 'FLX_' // TRIM( TSVLIST(JSV)%CMNHNAME ) - TZFIELD%CLONGNAME = 'FLX_' // TRIM( TSVLIST(JSV)%CLONGNAME ) - WRITE(TZFIELD%CCOMMENT,'(A6,A,A)')'X_Y_Z_',TRIM( TSVLIST(JSV)%CMNHNAME ),' Net chemical flux' - CALL IO_Field_write(TPFILE,TZFIELD,XCHFLX(:,:,JSV-NSV_CHEMBEG+1) * 1E9) - END DO -END IF -!------------------------------------------------------------------------------- -! -!* Brightness temperatures from the radiatif transfer code (Morcrette, 1991) -! -IF (LEN_TRIM(CRAD_SAT) /= 0 .AND. NRR /=0) THEN - ALLOCATE (ZIRBT(IIU,IJU),ZWVBT(IIU,IJU)) - ITOTGEO=0 - IF (INDEX(CRAD_SAT,'GOES-E') /= 0) THEN - ITOTGEO= ITOTGEO+1 - INDGEO(ITOTGEO) = 1 - YNAM_SAT(ITOTGEO) = 'GOES-E' - END IF - IF (INDEX(CRAD_SAT,'GOES-W') /= 0) THEN - ITOTGEO= ITOTGEO+1 - INDGEO(ITOTGEO) = 2 - YNAM_SAT(ITOTGEO) = 'GOES-W' - END IF - IF (INDEX(CRAD_SAT,'GMS') /= 0) THEN - ITOTGEO= ITOTGEO+1 - INDGEO(ITOTGEO) = 3 - YNAM_SAT(ITOTGEO) = 'GMS' - END IF - IF (INDEX(CRAD_SAT,'INDSAT') /= 0) THEN - ITOTGEO= ITOTGEO+1 - INDGEO(ITOTGEO) = 4 - YNAM_SAT(ITOTGEO) = 'INDSAT' - END IF - IF (INDEX(CRAD_SAT,'METEOSAT') /= 0) THEN - ITOTGEO= ITOTGEO+1 - INDGEO(ITOTGEO) = 5 - YNAM_SAT(ITOTGEO) = 'METEOSAT' - END IF - PRINT*,'YOU ASK FOR BRIGHTNESS TEMPERATURES FOR ',ITOTGEO,' SATELLITE(S)' - IF (NRR==1) THEN - PRINT*,' THERE IS ONLY VAPOR WATER IN YOUR ATMOSPHERE' - PRINT*,' IRBT WILL NOT TAKE INTO ACCOUNT CLOUDS.' - END IF - ! - DO JI=1,ITOTGEO - ZIRBT(:,:) = XUNDEF - ZWVBT(:,:) = XUNDEF - CALL RADTR_SATEL( TDTCUR%nyear, TDTCUR%nmonth, TDTCUR%nday, TDTCUR%xtime, & - NDLON, NFLEV, NSTATM, NRAD_COLNBR, XEMIS(:,:,1), & - XCCO2, XTSRAD, XSTATM, XTHT, XRT, XPABST, XZZ, & - XSIGS, XMFCONV, MAX(XCLDFR,XICEFR), LUSERI, LSIGMAS, & - LSUBG_COND, LRAD_SUBG_COND, ZIRBT, ZWVBT, & - INDGEO(JI), VSIGQSAT ) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = TRIM(YNAM_SAT(JI))//'_IRBT', & - CSTDNAME = '', & - CLONGNAME = TRIM(YNAM_SAT(JI))//'_IRBT', & - CUNITS = 'K', & - CDIR = 'XY', & - CCOMMENT = TRIM(YNAM_SAT(JI))//' Infra-Red Brightness Temperature', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZIRBT) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = TRIM(YNAM_SAT(JI))//'_WVBT', & - CSTDNAME = '', & - CLONGNAME = TRIM(YNAM_SAT(JI))//'_WVBT', & - CUNITS = 'K', & - CDIR = 'XY', & - CCOMMENT = TRIM(YNAM_SAT(JI))//' Water-Vapor Brightness Temperature', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWVBT) - END DO - DEALLOCATE(ZIRBT,ZWVBT) -END IF -! -!------------------------------------------------------------------------------- -! -!* Brightness temperatures from the Radiatif Transfer for Tiros Operational -! Vertical Sounder (RTTOV) code -! -IF (NRTTOVINFO(1,1) /= NUNDEF) THEN -! PRINT*,'YOU ASK FOR BRIGHTNESS TEMPERATURE COMPUTED BY THE RTTOV CODE' -#if defined(MNH_RTTOV_8) - CALL CALL_RTTOV8(NDLON, NFLEV, NSTATM, XEMIS(:,:,1), XTSRAD, XSTATM, XTHT, XRT, & - XPABST, XZZ, XMFCONV, MAX(XCLDFR,XICEFR), XUT(:,:,IKB), XVT(:,:,IKB), & - LUSERI, NRTTOVINFO, TPFILE ) -#elif defined(MNH_RTTOV_11) - CALL CALL_RTTOV11(NDLON, NFLEV, XEMIS(:,:,1), XTSRAD, XTHT, XRT, & - XPABST, XZZ, XMFCONV, MAX(XCLDFR,XICEFR), XUT(:,:,IKB), XVT(:,:,IKB), & - LUSERI, NRTTOVINFO, TPFILE ) -#elif defined(MNH_RTTOV_13) - CALL CALL_RTTOV13(NDLON, NFLEV, XEMIS(:,:,1), XTSRAD, XTHT, XRT, & - XPABST, XZZ, XMFCONV, MAX(XCLDFR,XICEFR), XUT(:,:,IKB), XVT(:,:,IKB), & - LUSERI, NRTTOVINFO, TPFILE ) -#else -PRINT *, "RTTOV LIBRARY NOT AVAILABLE = ###CALL_RTTOV####" -#endif -END IF -! -!------------------------------------------------------------------------------- -! -!* 3. DIAGNOSTIC RELATED TO SURFACE -! ----------------------------- -! -IF (CSURF=='EXTE') THEN -!! Since SURFEX7 (masdev49) XCURRENT_ZON10M and XCURRENT_MER10M -!! are equal to XUNDEF of SURFEX if the first atmospheric level -!! is under 10m - CALL GET_SURF_UNDEF(ZUNDEF) -! - ILEVEL=IKB - !While there are XUNDEF values and we aren't at model's top - DO WHILE(ANY(XCURRENT_ZON10M(IIB:IIE,IJB:IJE)==ZUNDEF) .AND. (ILEVEL/=IKE-1) ) - - !Where interpolation is needed and possible - !(10m is between ILEVEL and ILEVEL+1 or 10m is below the bottom level) - WHERE(XCURRENT_ZON10M(IIB:IIE,IJB:IJE)==ZUNDEF .AND. & - ( XZHAT(ILEVEL+1) + XZHAT(ILEVEL+2)) /2. >10.) - - !Interpolation between ILEVEL and ILEVEL+1 - XCURRENT_ZON10M(IIB:IIE,IJB:IJE)=XUT(IIB:IIE,IJB:IJE,ILEVEL) + & - (XUT(IIB:IIE,IJB:IJE,ILEVEL+1)-XUT(IIB:IIE,IJB:IJE,ILEVEL)) * & - ( 10.- (XZHAT(ILEVEL)+XZHAT(ILEVEL+1))/2. ) / & - ( (XZHAT(ILEVEL+2)-XZHAT(ILEVEL)) /2.) - XCURRENT_MER10M(IIB:IIE,IJB:IJE)=XVT(IIB:IIE,IJB:IJE,ILEVEL) + & - (XVT(IIB:IIE,IJB:IJE,ILEVEL+1)-XVT(IIB:IIE,IJB:IJE,ILEVEL)) * & - (10.- (XZHAT(ILEVEL)+XZHAT(ILEVEL+1))/2. ) / & - ( (XZHAT(ILEVEL+2)-XZHAT(ILEVEL)) /2.) - END WHERE - ILEVEL=ILEVEL+1 !level just higher - END DO - ! - ! in this case (argument KGRID=0), input winds are ZONal and MERidian - ! and, output ones are in MesoNH grid - IF (.NOT. LCARTESIAN) THEN - TZFIELD2(1) = TFIELDMETADATA( & - CMNHNAME = 'UM10', & - CSTDNAME = '', & - CLONGNAME = 'UM10', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'Zonal wind at 10m', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - ! - TZFIELD2(2) = TFIELDMETADATA( & - CMNHNAME = 'VM10', & - CSTDNAME = '', & - CLONGNAME = 'VM10', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'Meridian wind at 10m', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - ! - CALL UV_TO_ZONAL_AND_MERID(XCURRENT_ZON10M,XCURRENT_MER10M,KGRID=0,TPFILE=TPFILE,TZFIELDS=TZFIELD2) - ELSE - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'UM10', & - CSTDNAME = '', & - CLONGNAME = 'UM10', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'Zonal wind at 10m', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_ZON10M) - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'VM10', & - CSTDNAME = '', & - CLONGNAME = 'VM10', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'Meridian wind at 10m', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_MER10M) - ENDIF - ! - IF (SIZE(XTKET)>0) THEN - ZWORK21(:,:) = SQRT(XCURRENT_ZON10M(:,:)**2+XCURRENT_MER10M(:,:)**2) - ZWORK21(:,:) = ZWORK21(:,:) + 4. * SQRT(XTKET(:,:,IKB)) - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'FF10MAX', & - CSTDNAME = '', & - CLONGNAME = 'FF10MAX', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_FF10MAX', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) - END IF - ! - IF(ANY(XCURRENT_SFCO2/=XUNDEF))THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SFCO2', & - CSTDNAME = '', & - CLONGNAME = 'SFCO2', & - CUNITS = 'mg m-2 s-1', & - CDIR = 'XY', & - CCOMMENT = 'CO2 Surface flux', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_SFCO2) - END IF - ! - IF ( CRAD /= 'NONE' ) THEN - IF(ANY(XCURRENT_SWD/=XUNDEF))THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SWD', & - CSTDNAME = '', & - CLONGNAME = 'SWD', & - CUNITS = 'W m-2', & - CDIR = 'XY', & - CCOMMENT = 'incoming ShortWave at the surface', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_SWD) - END IF - ! - IF(ANY(XCURRENT_SWU/=XUNDEF))THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'SWU', & - CSTDNAME = '', & - CLONGNAME = 'SWU', & - CUNITS = 'W m-2', & - CDIR = 'XY', & - CCOMMENT = 'outcoming ShortWave at the surface', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_SWU) - END IF -! - IF(ANY(XCURRENT_LWD/=XUNDEF))THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'LWD', & - CSTDNAME = '', & - CLONGNAME = 'LWD', & - CUNITS = 'W m-2', & - CDIR = 'XY', & - CCOMMENT = 'incoming LongWave at the surface', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_LWD) - END IF -! - IF(ANY(XCURRENT_LWU/=XUNDEF))THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'LWU', & - CSTDNAME = '', & - CLONGNAME = 'LWU', & - CUNITS = 'W m-2', & - CDIR = 'XY', & - CCOMMENT = 'outcoming LongWave at the surface', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_LWU) - END IF - END IF ! CRAD/='NONE' -END IF - -! MODIF FP NOV 2012 -!------------------------------------------------------------------------------- -! -!* 4. DIAGNOSTIC ON PRESSURE LEVELS -! ----------------------------- -! -IF (LISOPR .AND. XISOPR(1)/=0.) THEN -! -! -ALLOCATE(ZWORK32(IIU,IJU,IKU)) -ALLOCATE(ZWORK33(IIU,IJU,IKU)) -ALLOCATE(ZWORK34(IIU,IJU,IKU)) -! -! ************************************************* -! Determine the pressure level where to interpolate -! ************************************************* - IPRES=0 - DO JI=1,SIZE(XISOPR) - IF (XISOPR(JI)<=10..OR.XISOPR(JI)>1000.) EXIT - IPRES=IPRES+1 - WRITE(YCAR4,'(I4)') INT(XISOPR(JI)) - YPRES(IPRES)=ADJUSTL(YCAR4) - END DO - - ALLOCATE(ZWRES(IIU,IJU,IPRES)) - ALLOCATE(ZTEMPP(IIU,IJU,IPRES)) - ZWRES(:,:,:)=XUNDEF - ALLOCATE(ZPRES(IIU,IJU,IPRES)) - IPRES=0 - DO JI=1,SIZE(XISOPR) - IF (XISOPR(JI)<=10..OR.XISOPR(JI)>1000.) EXIT - IPRES=IPRES+1 - ZPRES(:,:,IPRES)=XISOPR(JI)*100. - END DO - PRINT *,'PRESSURE LEVELS WHERE TO INTERPOLATE=',ZPRES(1,1,:) - ! - TZFIELD = TFIELDMETADATA(& - CMNHNAME = 'variables at pressure levels', & !Temporary name to ease identification - CSTDNAME = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - ! -! -!* Standard Variables -! -! ********************* -! Potential Temperature -! ********************* - CALL PINTER(XTHT, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, & - IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.') - DO JK=1,IPRES - TZFIELD%CMNHNAME = 'THT'//TRIM(YPRES(JK))//'HPA' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K' - TZFIELD%CCOMMENT = 'X_Y_potential temperature '//TRIM(YPRES(JK))//' hPa' - CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)) - END DO -! ********************* -! Temperature -! ********************* - DO JK=1,IPRES - TZFIELD%CMNHNAME = 'TEMP'//TRIM(YPRES(JK))//'HPA' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K' - TZFIELD%CCOMMENT = 'X_Y_air temperature '//TRIM(YPRES(JK))//' hPa' - CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)*(ZPRES(:,:,JK)/XP00)**(XRD/XCPD)) - END DO - ZTEMPP(:,:,:)=ZWRES(:,:,:) -! ********************* -! Wind -! ********************* - ZWORK31(:,:,:) = MXF(XUT(:,:,:)) - CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, & - IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.') - DO JK=1,IPRES - TZFIELD%CMNHNAME = 'UT'//TRIM(YPRES(JK))//'HPA' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CCOMMENT = 'X_Y_U component of wind '//TRIM(YPRES(JK))//' hPa' - CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)) - END DO - ! - ZWORK31(:,:,:) = MYF(XVT(:,:,:)) - CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, & - IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.') - DO JK=1,IPRES - TZFIELD%CMNHNAME = 'VT'//TRIM(YPRES(JK))//'HPA' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CCOMMENT = 'X_Y_V component of wind '//TRIM(YPRES(JK))//' hPa' - CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)) - END DO - ! - ZWORK31(:,:,:) = MZF(XWT(:,:,:)) - CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, & - IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.') - DO JK=1,IPRES - TZFIELD%CMNHNAME = 'WT'//TRIM(YPRES(JK))//'HPA' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CCOMMENT = 'X_Y_V component of wind '//TRIM(YPRES(JK))//' hPa' - CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)) - END DO -! ********************* -! Turbulent kinetic energy -! ********************* - CALL PINTER(XTKET, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, & - IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.') - DO JK=1,IPRES - TZFIELD%CMNHNAME = 'TKET'//TRIM(YPRES(JK))//'HPA' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm 2 s-2' - TZFIELD%CCOMMENT = 'X_Y_turbulent kinetic energy '//TRIM(YPRES(JK))//' hPa' - CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)) - END DO -! ********************* -! Water Vapour Mixing Ratio -! ********************* - CALL PINTER(XRT(:,:,:,1), XPABST, XZZ, ZTEMP, ZWRES, ZPRES, & - IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.') - DO JK=1,IPRES - TZFIELD%CMNHNAME = 'MRV'//TRIM(YPRES(JK))//'HPA' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'g kg-1' - TZFIELD%CCOMMENT = 'X_Y_Vapor Mixing Ratio '//TRIM(YPRES(JK))//' hPa' - CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)*1.E3) - END DO -! -! ********************* -! Relative humidity -! ********************* - IF (LUSERV) THEN - ALLOCATE(ZWRES1(IIU,IJU,IPRES)) - ALLOCATE(ZMRVP(IIU,IJU,IPRES)) - ZMRVP(:,:,:)=ZWRES(:,:,:) - ZWRES1(:,:,:)=SM_FOES(ZTEMPP(:,:,:)) - ZWRES1(:,:,:)=(XMV/XMD)*ZWRES1(:,:,:)/(ZPRES(:,:,:)-ZWRES1(:,:,:)) - ZWRES(:,:,:)=100.*ZMRVP(:,:,:)/ZWRES1(:,:,:) - IF (CCLOUD(1:3) =='ICE' .OR. CCLOUD =='C3R5' .OR. CCLOUD == 'LIMA') THEN - WHERE ( ZTEMPP(:,:,:)< XTT) - ZWRES1(:,:,:) = EXP( XALPI - XBETAI/ZTEMPP(:,:,:) & - - XGAMI*ALOG(ZTEMPP(:,:,:)) ) !saturation over ice - ZWRES1(:,:,:)=(XMV/XMD)*ZWRES1(:,:,:)/(ZPRES(:,:,:)-ZWRES1(:,:,:)) - ZWRES(:,:,:)=100.*ZMRVP(:,:,:)/ZWRES1(:,:,:) - END WHERE - END IF - DO JK=1,IPRES - TZFIELD%CMNHNAME = 'REHU'//TRIM(YPRES(JK))//'HPA' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'percent' - TZFIELD%CCOMMENT = 'X_Y_Relative humidity '//TRIM(YPRES(JK))//' hPa' - CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)) - END DO - DEALLOCATE(ZWRES1,ZMRVP,ZTEMPP) - END IF - ! - ALLOCATE(ZRT(IIU,IJU,IKU)) - ALLOCATE(ZQV(IIU,IJU,IKU)) - ZRT(:,:,:)=0. - DO JRR=1,NRR - ZRT(:,:,:) = ZRT(:,:,:) + XRT(:,:,:,JRR) - END DO - ZQV(:,:,:) = XRT(:,:,:,1) / (1.0 + ZRT(:,:,:)) - ! ********************* - ! Water specific humidity - ! ********************* - CALL PINTER(ZQV, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, & - IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.') - DO JK=1,IPRES - TZFIELD%CMNHNAME = 'QV'//TRIM(YPRES(JK))//'HPA' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CCOMMENT = 'X_Y_Vapor Specific humidity '//TRIM(YPRES(JK))//' hPa' - CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)) - END DO - DEALLOCATE(ZRT,ZQV) -! ********************* -! Geopotential in meters -! ********************* - ZWORK31(:,:,:) = MZF(XZZ(:,:,:)) - CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, & - IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.') - DO JK=1,IPRES - TZFIELD%CMNHNAME = 'ALT'//TRIM(YPRES(JK))//'HPA' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm' - TZFIELD%CCOMMENT = 'X_Y_ALTitude '//TRIM(YPRES(JK))//' hPa' - CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)) - END DO -! - DEALLOCATE(ZWRES,ZPRES,ZWORK32,ZWORK33,ZWORK34) -END IF -! -!------------------------------------------------------------------------------- -! -!* 5. DIAGNOSTIC ON POTENTIEL TEMPERATURE LEVELS -! ----------------------------- -! -IF (LISOTH .AND.XISOTH(1)/=0.) THEN -! -! -ALLOCATE(ZWORK32(IIU,IJU,IKU)) -ALLOCATE(ZWORK33(IIU,IJU,IKU)) -ALLOCATE(ZWORK34(IIU,IJU,IKU)) -! -! ************************************************* -! Determine the potentiel temperature level where to interpolate -! ************************************************* - ITH=0 - DO JI=1,SIZE(XISOTH) - IF (XISOTH(JI)<=100..OR.XISOTH(JI)>1000.) EXIT - ITH=ITH+1 - WRITE(YCAR4,'(I4)') INT(XISOTH(JI)) - YTH(ITH)=ADJUSTL(YCAR4) - END DO - - ALLOCATE(ZWTH(IIU,IJU,ITH)) - ZWTH(:,:,:)=XUNDEF - ALLOCATE(ZTH(ITH)) - ZTH(:) = XISOTH(1:ITH) - - PRINT *,'POTENTIAL TEMPERATURE LEVELS WHERE TO INTERPOLATE=',ZTH(:) - ! - TZFIELD = TFIELDMETADATA(& - CMNHNAME = 'variables at pot. temp. levels', & !Temporary name to ease identification - CSTDNAME = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 2, & - LTIMEDEP = .TRUE. ) - ! -! -!* Standard Variables -! -! ********************* -! Pressure -! ********************* - CALL ZINTER(XPABST, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF) - DO JK=1,ITH - TZFIELD%CMNHNAME = 'PABST'//TRIM(YTH(JK))//'K' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'Pa' - TZFIELD%CCOMMENT = 'X_Y_pressure '//TRIM(YTH(JK))//' K' - CALL IO_Field_write(TPFILE,TZFIELD,ZWTH(:,:,JK)) - END DO -! ********************* -! Potential Vorticity -! ********************* - ZCORIOZ(:,:,:)=SPREAD( XCORIOZ(:,:),DIM=3,NCOPIES=IKU ) - ZVOX(:,:,:)=GY_W_VW(XWT,XDYY,XDZZ,XDZY)-GZ_V_VW(XVT,XDZZ) - ZVOX(:,:,2)=ZVOX(:,:,3) - ZVOY(:,:,:)=GZ_U_UW(XUT,XDZZ)-GX_W_UW(XWT,XDXX,XDZZ,XDZX) - ZVOY(:,:,2)=ZVOY(:,:,3) - ZVOZ(:,:,:)=GX_V_UV(XVT,XDXX,XDZZ,XDZX)-GY_U_UV(XUT,XDYY,XDZZ,XDZY) - ZVOZ(:,:,2)=ZVOZ(:,:,3) - ZVOZ(:,:,1)=ZVOZ(:,:,3) - ZWORK31(:,:,:)=GX_M_M(XTHT,XDXX,XDZZ,XDZX) - ZWORK32(:,:,:)=GY_M_M(XTHT,XDYY,XDZZ,XDZY) - ZWORK33(:,:,:)=GZ_M_M(XTHT,XDZZ) - ZPOVO(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:))) & - + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & - + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) - ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:) - ZPOVO(:,:,1) =-1.E+11 - ZPOVO(:,:,IKU)=-1.E+11 - CALL ZINTER(ZPOVO, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF) - DO JK=1,ITH - TZFIELD%CMNHNAME = 'POVOT'//TRIM(YTH(JK))//'K' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'PVU' - TZFIELD%CCOMMENT = 'X_Y_POtential VOrticity '//TRIM(YTH(JK))//' K' - CALL IO_Field_write(TPFILE,TZFIELD,ZWTH(:,:,JK)) - END DO -! ********************* -! Wind -! ********************* - ZWORK31(:,:,:) = MXF(XUT(:,:,:)) - CALL ZINTER(ZWORK31, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF) - DO JK=1,ITH - TZFIELD%CMNHNAME = 'UT'//TRIM(YTH(JK))//'K' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CCOMMENT = 'X_Y_U component of wind '//TRIM(YTH(JK))//' K' - CALL IO_Field_write(TPFILE,TZFIELD,ZWTH(:,:,JK)) - END DO - ! - ZWORK31(:,:,:) = MYF(XVT(:,:,:)) - CALL ZINTER(ZWORK31, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF) - DO JK=1,ITH - TZFIELD%CMNHNAME = 'VT'//TRIM(YTH(JK))//'K' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CCOMMENT = 'X_Y_V component of wind '//TRIM(YTH(JK))//' K' - CALL IO_Field_write(TPFILE,TZFIELD,ZWTH(:,:,JK)) - END DO -! - DEALLOCATE(ZWTH,ZTH,ZWORK32,ZWORK33,ZWORK34) -END IF -!------------------------------------------------------------------------------- -! -!* 6. DIAGNOSTIC ON ALTITUDE LEVELS -! ----------------------------- -! -IF (LISOAL .AND.XISOAL(1)/=0.) THEN -! -! - ZFILLVAL = -99999. - ALLOCATE(ZWORK32(IIU,IJU,IKU)) - ALLOCATE(ZWORK33(IIU,IJU,IKU)) -! -! ************************************************* -! Determine the altitude level where to interpolate -! ************************************************* - IAL=0 - DO JI=1,SIZE(XISOAL) - IF (XISOAL(JI)<0.) EXIT - IAL=IAL+1 - END DO - ALLOCATE(ZWAL(IIU,IJU,IAL)) - ZWAL(:,:,:)=XUNDEF - ALLOCATE(ZAL(IAL)) - ZAL(:) = XISOAL(1:IAL) - PRINT *,'ALTITUDE LEVELS WHERE TO INTERPOLATE=',ZAL(:) -! ********************* -! Altitude -! ********************* - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ALT_ALT', & - CSTDNAME = '', & - CLONGNAME = 'ALT_ALT', & - CUNITS = 'm', & - CDIR = '--', & - CCOMMENT = 'Z_alt ALT', & - NGRID = 0, & - NTYPE = TYPEREAL, & - NDIMS = 1, & - LTIMEDEP = .FALSE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZAL) -! -!* Standard Variables -! -! ********************* -! Cloud -! ********************* - ZWORK31(:,:,:) = 0. - IF (SIZE(XRT,4) >= 2) ZWORK31(:,:,:) = XRT(:,:,:,2) ! Rc - IF (SIZE(XRT,4) >= 4) ZWORK31(:,:,:) = ZWORK31(:,:,:) + XRT(:,:,:,4) !Ri - ZWORK31(:,:,:) = ZWORK31(:,:,:)*1.E3 - CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) - WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ALT_CLOUD', & - CSTDNAME = '', & - CLONGNAME = 'ALT_CLOUD', & - CUNITS = 'g kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_cloud ALT', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) -! ********************* -! Precipitation -! ********************* - ZWORK31(:,:,:) = 0. - IF (SIZE(XRT,4) >= 3) ZWORK31(:,:,:) = XRT(:,:,:,3) ! Rr - IF (SIZE(XRT,4) >= 5) ZWORK31(:,:,:) = ZWORK31(:,:,:) + XRT(:,:,:,5) !Rsnow - IF (SIZE(XRT,4) >= 6) ZWORK31(:,:,:) = ZWORK31(:,:,:) + XRT(:,:,:,6) !Rgraupel - IF (SIZE(XRT,4) >= 7) ZWORK31(:,:,:) = ZWORK31(:,:,:) + XRT(:,:,:,7) !Rhail - ZWORK31(:,:,:) = ZWORK31(:,:,:)*1.E3 - CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) - WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ALT_PRECIP', & - CSTDNAME = '', & - CLONGNAME = 'ALT_PRECIP', & - CUNITS = 'g kg-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_precipitation ALT', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) -! ********************* -! Potential temperature -! ********************* - CALL ZINTER(XTHT, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) - WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ALT_THETA', & - CSTDNAME = '', & - CLONGNAME = 'ALT_THETA', & - CUNITS = 'K', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_potential temperature ALT', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) -! ********************* -! Pressure -! ********************* - CALL ZINTER(XPABST, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) - WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ALT_PRESSURE', & - CSTDNAME = '', & - CLONGNAME = 'ALT_PRESSURE', & - CUNITS = 'Pa', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_pressure ALT', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) -! ********************* -! Potential Vorticity -! ********************* - ZCORIOZ(:,:,:)=SPREAD( XCORIOZ(:,:),DIM=3,NCOPIES=IKU ) - ZVOX(:,:,:)=GY_W_VW(XWT,XDYY,XDZZ,XDZY)-GZ_V_VW(XVT,XDZZ) - ZVOX(:,:,2)=ZVOX(:,:,3) - ZVOY(:,:,:)=GZ_U_UW(XUT,XDZZ)-GX_W_UW(XWT,XDXX,XDZZ,XDZX) - ZVOY(:,:,2)=ZVOY(:,:,3) - ZVOZ(:,:,:)=GX_V_UV(XVT,XDXX,XDZZ,XDZX)-GY_U_UV(XUT,XDYY,XDZZ,XDZY) - ZVOZ(:,:,2)=ZVOZ(:,:,3) - ZVOZ(:,:,1)=ZVOZ(:,:,3) - ZWORK31(:,:,:)=GX_M_M(XTHT,XDXX,XDZZ,XDZX) - ZWORK32(:,:,:)=GY_M_M(XTHT,XDYY,XDZZ,XDZY) - ZWORK33(:,:,:)=GZ_M_M(XTHT,XDZZ) - ZPOVO(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:))) & - + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & - + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) - ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:) - ZPOVO(:,:,1) =-1.E+11 - ZPOVO(:,:,IKU)=-1.E+11 - CALL ZINTER(ZPOVO, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) - WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ALT_PV', & - CSTDNAME = '', & - CLONGNAME = 'ALT_PV', & - CUNITS = 'PVU', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Potential Vorticity ALT', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) -! ********************* -! Wind -! ********************* - ZWORK31(:,:,:) = MXF(XUT(:,:,:)) - CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) - WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ALT_U', & - CSTDNAME = '', & - CLONGNAME = 'ALT_U', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_U component of wind ALT', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) - ! - ZWORK31(:,:,:) = MYF(XVT(:,:,:)) - CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) - WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ALT_V', & - CSTDNAME = '', & - CLONGNAME = 'ALT_V', & - CUNITS = 'm s-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_V component of wind ALT', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) -! ********************* -! Dust extinction (optical depth per km) -! ********************* - IF (NRAD_3D >= 1.AND.LDUST) THEN - DO JK=IKB,IKE - IKRAD = JK - JPVEXT - ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3 - ENDDO - CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) - WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'ALT_DSTEXT', & - CSTDNAME = '', & - CLONGNAME = 'ALT_DSTEXT', & - CUNITS = 'km-1', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_DuST EXTinction ALT', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) - END IF -! -! ********************* - DEALLOCATE(ZWAL,ZAL,ZWORK32,ZWORK33) -END IF -! -!------------------------------------------------------------------------------- -! -!* 7. COARSE GRAINING DIAGNOSTIC -! -------------------------- -! -IF (LCOARSE) THEN - IDX = NDXCOARSE -!------------------------------- -! AVERAGE OF TKE BY BLOCK OF IDX POINTS - CALL BLOCKAVG(XUT,IDX,IDX,ZWORK31) - ZUT_PRM=XUT-ZWORK31 - CALL BLOCKAVG(XVT,IDX,IDX,ZWORK31) - ZVT_PRM=XVT-ZWORK31 - CALL BLOCKAVG(XWT,IDX,IDX,ZWORK31) - ZWT_PRM=XWT-ZWORK31 -! - ZWORK31=MXF(ZUT_PRM*ZUT_PRM) - CALL BLOCKAVG(ZWORK31,IDX,IDX,ZUU_AVG) - ZWORK31=MYF(ZVT_PRM*ZVT_PRM) - CALL BLOCKAVG(ZWORK31,IDX,IDX,ZVV_AVG) - ZWORK31=MZF(ZWT_PRM*ZWT_PRM) - CALL BLOCKAVG(ZWORK31,IDX,IDX,ZWW_AVG) - CALL BLOCKAVG(XTKET,IDX,IDX,ZWORK31) - ZWORK31=0.5*( ZUU_AVG+ZVV_AVG+ZWW_AVG ) + ZWORK31 - WRITE (YDX,FMT='(I3.3)') IDX - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'TKEBAVG'//YDX, & - CSTDNAME = '', & - CLONGNAME = 'TKEBAVG'//YDX, & - CUNITS = 'm2 s-2', & - CDIR = 'XY', & - CCOMMENT = 'TKE_BLOCKAVG'//YDX, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -!--------------------------------- -! MOVING AVERAGE OF TKE OVER IDX+1 POINTS - IDX = IDX/2 - CALL MOVINGAVG(XUT,IDX,IDX,ZWORK31) - ZUT_PRM=XUT-ZWORK31 - CALL MOVINGAVG(XVT,IDX,IDX,ZWORK31) - ZVT_PRM=XVT-ZWORK31 - CALL MOVINGAVG(XWT,IDX,IDX,ZWORK31) - ZWT_PRM=XWT-ZWORK31 -! - ZWORK31=MXF(ZUT_PRM*ZUT_PRM) - CALL MOVINGAVG(ZWORK31,IDX,IDX,ZUU_AVG) - ZWORK31=MYF(ZVT_PRM*ZVT_PRM) - CALL MOVINGAVG(ZWORK31,IDX,IDX,ZVV_AVG) - ZWORK31=MZF(ZWT_PRM*ZWT_PRM) - CALL MOVINGAVG(ZWORK31,IDX,IDX,ZWW_AVG) - CALL MOVINGAVG(XTKET,IDX,IDX,ZWORK31) - ZWORK31=0.5*( ZUU_AVG+ZVV_AVG+ZWW_AVG ) + ZWORK31 - WRITE (YDX,FMT='(I3.3)') 2*IDX+1 - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'TKEMAVG'//YDX, & - CSTDNAME = '', & - CLONGNAME = 'TKEMAVG'//YDX, & - CUNITS = 'm2 s-2', & - CDIR = 'XY', & - CCOMMENT = 'TKE_MOVINGAVG'//YDX, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -END IF -! -!------------------------------------------------------------------------------- -! -!* 8. DIAGNOSTIC RELATED TO CHEMISTRY -! ------------------------------- -! -IF (NEQ_BUDGET>0) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic for CNAMES_BUDGET', & !Temporary name to ease identification - CSTDNAME = '', & - CUNITS = 'ppv s-1', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 4, & - LTIMEDEP = .TRUE. ) - ! - DO JSV = 1, NEQ_BUDGET - TZFIELD%CMNHNAME = TRIM(CNAMES_BUDGET(JSV))//'_BUDGET' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(CNAMES_BUDGET(JSV))//'_BUDGET' - CALL IO_Field_write(TPFILE,TZFIELD,XTCHEM(JSV)%XB_REAC(:,:,:,:)) - END DO - ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic for reaction list', & !Temporary name to ease identification - CSTDNAME = '', & - CUNITS = '', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEINT, & - NDIMS = 1, & - LTIMEDEP = .TRUE. ) - ! - DO JSV=1, NEQ_BUDGET - TZFIELD%CMNHNAME = TRIM(CNAMES_BUDGET(JSV))//'_CHREACLIST' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = TRIM(CNAMES_BUDGET(JSV))//'_REACTION_LIST' - CALL IO_Field_write(TPFILE,TZFIELD,XTCHEM(JSV)%NB_REAC(:)) - END DO -END IF -! -! -! chemical prod/loss terms -IF (NEQ_PLT>0) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic for CNAMES_PRODLOSST', & !Temporary name to ease identification - CSTDNAME = '', & - CUNITS = 'ppv s-1', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) - ! - DO JSV = 1, NEQ_PLT - TZFIELD%CMNHNAME = TRIM(CNAMES_PRODLOSST(JSV))//'_PROD' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(CNAMES_PRODLOSST(JSV))//'_PROD' - CALL IO_Field_write(TPFILE,TZFIELD,XPROD(:,:,:,JSV)) - ! - TZFIELD%CMNHNAME = TRIM(CNAMES_PRODLOSST(JSV))//'_LOSS' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(CNAMES_PRODLOSST(JSV))//'_LOSS' - CALL IO_Field_write(TPFILE,TZFIELD,XLOSS(:,:,:,JSV)) - END DO -END IF -! -! -DEALLOCATE(ZWORK21,ZWORK31,ZTEMP) -! -END SUBROUTINE WRITE_LFIFM1_FOR_DIAG_SUPP diff --git a/src/PHYEX/ext/xy_to_latlon.f90 b/src/PHYEX/ext/xy_to_latlon.f90 deleted file mode 100644 index 9effbed46..000000000 --- a/src/PHYEX/ext/xy_to_latlon.f90 +++ /dev/null @@ -1,204 +0,0 @@ -!MNH_LIC Copyright 1996-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! #################### - PROGRAM XY_TO_LATLON -! #################### -! -!!**** *XY_TO_LATLON* program to compute latitude and longiude from x and y -!! for a MESONH file -!! -!! PURPOSE -!! ------- -!! -!! METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! module MODE_GRIDPROJ : contains projection routines -!! SM_LATLON and SM_XYHAT -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! module MODD_GRID : variables for projection: -!! XLAT0,XLON0,XRPK,XBETA -!! -!! module MODD_PGDDIM : specify the dimentions of the data arrays: -!! NPGDIMAX and NPGDJMAX -!! -!! module MODD_PGDGRID : grid variables: -!! XPGDLONOR,XPGDLATOR: longitude and latitude of the -!! origine point for the conformal projection. -!! XPGDXHAT,XPGDYHAT: position x,y in the conformal plane -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! -!! V. Masson Meteo-France -!! -!! MODIFICATION -!! ------------ -!! -!! Original 26/01/96 -!! -!! no transfer of the file when closing Dec. 09, 1996 (V.Masson) -!! + changes call to READ_HGRID -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 14/04/2020: add missing initializations (XY_TO_LATLON was not working) -!---------------------------------------------------------------------------- -! -!* 0. DECLARATION -! ----------- -! -use MODD_CONF, only: CPROGRAM -USE MODD_DIM_n -USE MODD_GRID -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PGDDIM -USE MODD_PGDGRID -USE MODD_PARAMETERS -USE MODD_LUNIT -! -USE MODE_FIELD, ONLY: INI_FIELD_LIST -USE MODE_GRIDPROJ -USE MODE_INIT_ll, only: SET_DIM_ll, SET_JP_ll -USE MODE_IO, only: IO_Config_set, IO_Init -use MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -USE MODE_MODELN_HANDLER, ONLY: GOTO_MODEL -use MODE_SPLITTINGZ_ll -! -USE MODE_INI_CST, ONLY: INI_CST -USE MODI_READ_HGRID -! -USE MODN_CONFIO, ONLY: NAM_CONFIO -! -IMPLICIT NONE -! -!* 0.2 Declaration of variables -! ------------------------ -! -CHARACTER(LEN=28) :: YINIFILE ! name of input FM file -CHARACTER(LEN=28) :: YNAME ! true name of input FM file -CHARACTER(LEN=28) :: YDAD ! name of dad of input FM file -CHARACTER(LEN=2) :: YSTORAGE_TYPE -INTEGER :: INAM ! Logical unit for namelist file -INTEGER :: ILUOUT0 ! Logical unit for output file. -INTEGER :: IRESP ! Return-code if problem eraised. -REAL :: ZI,ZJ ! input positions of the point -INTEGER :: II,IJ ! integer positions of the point -REAL :: ZXHAT ! output conformal coodinate x -REAL :: ZYHAT ! output conformal coodinate y -REAL :: ZLAT ! output latitude -REAL :: ZLON ! output longitude -TYPE(TFILEDATA),POINTER :: TZINIFILE => NULL() -TYPE(TFILEDATA),POINTER :: TZNMLFILE => NULL() -! -!* 0.3 Declaration of namelists -! ------------------------ -! -NAMELIST/NAM_INIFILE/ YINIFILE -!---------------------------------------------------------------------------- -! - WRITE(*,*) '+---------------------------------+' - WRITE(*,*) '| program xy_to_latlon |' - WRITE(*,*) '+---------------------------------+' - WRITE(*,*) '' - WRITE(*,*) 'Warning: I and J are integer for flux points' -! -!* 1. Initializations -! --------------- -! -CALL GOTO_MODEL(1) -! -CALL VERSION() -! -CPROGRAM='LAT2XY' -! -CALL IO_Init() -! -CALL INI_CST() -! -CALL INI_FIELD_LIST() -! -!* 2. Reading of namelist file -! ------------------------ -! -CALL IO_File_add2list(TZNMLFILE,'XY2LATLON1.nam','NML','READ') -CALL IO_File_open(TZNMLFILE) -INAM=TZNMLFILE%NLU -READ(INAM,NAM_INIFILE) -! -READ(INAM,NAM_CONFIO) -CALL IO_Config_set() -CALL IO_File_close(TZNMLFILE) -! -!* 1. Opening of MESONH file -! ---------------------- -! -CALL IO_File_add2list(TZINIFILE,TRIM(YINIFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=2) -CALL IO_File_open(TZINIFILE) -! -CALL IO_Field_read(TZINIFILE,'IMAX', NIMAX) -CALL IO_Field_read(TZINIFILE,'JMAX', NJMAX) -NKMAX = 1 -CALL IO_Field_read(TZINIFILE,'JPHEXT',JPHEXT) -! -CALL SET_JP_ll(1,JPHEXT,JPVEXT,JPHEXT) -CALL SET_DIM_ll(NIMAX, NJMAX, NKMAX) -CALL INI_PARAZ_ll(IRESP) -! -!* 2. Reading of MESONH file -! ---------------------- -! -CALL READ_HGRID(0,TZINIFILE,YNAME,YDAD,YSTORAGE_TYPE) -! -!* 3. Closing of MESONH file -! ---------------------- -! -CALL IO_File_close(TZINIFILE) -! -!------------------------------------------------------------------------------- -! -!* 4. Reading of I and J -! ------------------ -! -DO - WRITE(*,*) '-------------------------------------------------------------------' - WRITE(*,*) 'please enter index I (real, quit or q to stop):' - READ(*,*,ERR=1) ZI - WRITE(*,*) 'please enter index J (real, quit or q to stop):' - READ(*,*,ERR=1) ZJ -! - II=MAX(MIN(INT(ZI),NPGDIMAX+2*JPHEXT-1),1) - IJ=MAX(MIN(INT(ZJ),NPGDJMAX+2*JPHEXT-1),1) - ZXHAT=XPGDXHAT(II) + (ZI-REAL(II)) * ( XPGDXHAT(II+1) - XPGDXHAT(II) ) - ZYHAT=XPGDYHAT(IJ) + (ZJ-REAL(IJ)) * ( XPGDYHAT(IJ+1) - XPGDYHAT(IJ) ) -! - WRITE(*,*) 'x=', ZXHAT - WRITE(*,*) 'y=', ZYHAT -! - CALL SM_LATLON(XPGDLATOR,XPGDLONOR, & - ZXHAT,ZYHAT,ZLAT,ZLON) -! - WRITE(*,*) 'lat=', ZLAT - WRITE(*,*) 'lon=', ZLON -END DO -1 WRITE(*,*) 'good bye' -! -!------------------------------------------------------------------------------- -! -END PROGRAM XY_TO_LATLON diff --git a/src/PHYEX/ext/yomhook.f90 b/src/PHYEX/ext/yomhook.f90 deleted file mode 100644 index a0b84f764..000000000 --- a/src/PHYEX/ext/yomhook.f90 +++ /dev/null @@ -1,156 +0,0 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -MODULE YOMHOOK -USE PARKIND1 ,ONLY : JPIM ,JPRB -LOGICAL :: LHOOK=.FALSE. -INTEGER, PARAMETER :: JPHOOK=JPRB -INTERFACE DR_HOOK -MODULE PROCEDURE & - DR_HOOK_DEFAULT, & - DR_HOOK_FILE, & - DR_HOOK_SIZE, & - DR_HOOK_FILE_SIZE, & - DR_HOOK_MULTI_DEFAULT, & - DR_HOOK_MULTI_FILE, & - DR_HOOK_MULTI_SIZE, & - DR_HOOK_MULTI_FILE_SIZE -END INTERFACE - -CONTAINS - -SUBROUTINE DR_HOOK_DEFAULT(CDNAME,KSWITCH,PKEY) -CHARACTER(LEN=*), INTENT(IN) :: CDNAME -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY -!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,'',0) -END SUBROUTINE DR_HOOK_DEFAULT - -SUBROUTINE DR_HOOK_MULTI_DEFAULT(CDNAME,KSWITCH,PKEY) -CHARACTER(LEN=*), INTENT(IN) :: CDNAME -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY(:) -!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),'',0) -END SUBROUTINE DR_HOOK_MULTI_DEFAULT - - - -SUBROUTINE DR_HOOK_FILE(CDNAME,KSWITCH,PKEY,CDFILE) -CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY -!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,CDFILE,0) -END SUBROUTINE DR_HOOK_FILE - -SUBROUTINE DR_HOOK_MULTI_FILE(CDNAME,KSWITCH,PKEY,CDFILE) -CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY(:) -!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),CDFILE,0) -END SUBROUTINE DR_HOOK_MULTI_FILE - - - -SUBROUTINE DR_HOOK_SIZE(CDNAME,KSWITCH,PKEY,KSIZEINFO) -CHARACTER(LEN=*), INTENT(IN) :: CDNAME -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH,KSIZEINFO -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY -!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,'',KSIZEINFO) -END SUBROUTINE DR_HOOK_SIZE - -SUBROUTINE DR_HOOK_MULTI_SIZE(CDNAME,KSWITCH,PKEY,KSIZEINFO) -CHARACTER(LEN=*), INTENT(IN) :: CDNAME -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH,KSIZEINFO -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY(:) -!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),'',KSIZEINFO) -END SUBROUTINE DR_HOOK_MULTI_SIZE - - - -SUBROUTINE DR_HOOK_FILE_SIZE(CDNAME,KSWITCH,PKEY,CDFILE,KSIZEINFO) -CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH,KSIZEINFO -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY -!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,CDFILE,KSIZEINFO) -END SUBROUTINE DR_HOOK_FILE_SIZE - -SUBROUTINE DR_HOOK_MULTI_FILE_SIZE(CDNAME,KSWITCH,PKEY,CDFILE,KSIZEINFO) -CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH,KSIZEINFO -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY(:) -!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),CDFILE,KSIZEINFO) -END SUBROUTINE DR_HOOK_MULTI_FILE_SIZE - -END MODULE YOMHOOK -!==================================================================== -SUBROUTINE DR_HOOK_DEFAULT(CDNAME,KSWITCH,PKEY) -USE PARKIND1 ,ONLY : JPIM ,JPRB -CHARACTER(LEN=*), INTENT(IN) :: CDNAME -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY -!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,'',0) -END SUBROUTINE DR_HOOK_DEFAULT - -SUBROUTINE DR_HOOK_MULTI_DEFAULT(CDNAME,KSWITCH,PKEY) -USE PARKIND1 ,ONLY : JPIM ,JPRB -CHARACTER(LEN=*), INTENT(IN) :: CDNAME -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY(:) -!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),'',0) -END SUBROUTINE DR_HOOK_MULTI_DEFAULT - - - -SUBROUTINE DR_HOOK_FILE(CDNAME,KSWITCH,PKEY,CDFILE) -USE PARKIND1 ,ONLY : JPIM ,JPRB -CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY -!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,CDFILE,0) -END SUBROUTINE DR_HOOK_FILE - -SUBROUTINE DR_HOOK_MULTI_FILE(CDNAME,KSWITCH,PKEY,CDFILE) -USE PARKIND1 ,ONLY : JPIM ,JPRB -CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY(:) -!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),CDFILE,0) -END SUBROUTINE DR_HOOK_MULTI_FILE - - - -SUBROUTINE DR_HOOK_SIZE(CDNAME,KSWITCH,PKEY,KSIZEINFO) -USE PARKIND1 ,ONLY : JPIM ,JPRB -CHARACTER(LEN=*), INTENT(IN) :: CDNAME -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH,KSIZEINFO -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY -!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,'',KSIZEINFO) -END SUBROUTINE DR_HOOK_SIZE - -SUBROUTINE DR_HOOK_MULTI_SIZE(CDNAME,KSWITCH,PKEY,KSIZEINFO) -USE PARKIND1 ,ONLY : JPIM ,JPRB -CHARACTER(LEN=*), INTENT(IN) :: CDNAME -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH,KSIZEINFO -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY(:) -!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),'',KSIZEINFO) -END SUBROUTINE DR_HOOK_MULTI_SIZE - - - -SUBROUTINE DR_HOOK_FILE_SIZE(CDNAME,KSWITCH,PKEY,CDFILE,KSIZEINFO) -USE PARKIND1 ,ONLY : JPIM ,JPRB -CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH,KSIZEINFO -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY -!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,CDFILE,KSIZEINFO) -END SUBROUTINE DR_HOOK_FILE_SIZE - -SUBROUTINE DR_HOOK_MULTI_FILE_SIZE(CDNAME,KSWITCH,PKEY,CDFILE,KSIZEINFO) -USE PARKIND1 ,ONLY : JPIM ,JPRB -CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE -INTEGER(KIND=JPIM), INTENT(IN) :: KSWITCH,KSIZEINFO -REAL(KIND=JPRB), INTENT(INOUT) :: PKEY(:) -!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),CDFILE,KSIZEINFO) -END SUBROUTINE DR_HOOK_MULTI_FILE_SIZE - diff --git a/src/PHYEX/ext/zoom_pgd.f90 b/src/PHYEX/ext/zoom_pgd.f90 deleted file mode 100644 index 2b50885c8..000000000 --- a/src/PHYEX/ext/zoom_pgd.f90 +++ /dev/null @@ -1,271 +0,0 @@ -!MNH_LIC Copyright 2005-2023 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ################ - PROGRAM ZOOM_PGD -! ################ -!! -!! PURPOSE -!! ------- -!! This program zooms the physiographic data fields. -!! -!! METHOD -!! ------ -!! -!! -!! EXTERNAL -!! -------- -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! -!! V. Masson Meteo-France -!! -!! MODIFICATION -!! ------------ -!! -!! Original march 2005 -!! 10/10/2011 J.Escobar call INI_PARAZ_ll -!! 30/03/2012 S.Bielli Add NAM_NCOUT -!! 06/2016 (G.Delautier) phasage surfex 8 -!! 08/07/2016 P.Wautelet Removed MNH_NCWRIT define -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! P. Wautelet 06/07/2021: use FINALIZE_MNH -!---------------------------------------------------------------------------- -! -!* 0. DECLARATION -! ----------- -! -USE MODD_CONF, ONLY : CPROGRAM, L1D, L2D, LPACK -USE MODD_IO, only: TFILE_OUTPUTLISTING, TFILEDATA -USE MODD_LUNIT, ONLY : TLUOUT0, TOUTDATAFILE -USE MODD_PARAMETERS, ONLY : XUNDEF, NUNDEF, JPVEXT, JPHEXT, JPMODELMAX -USE MODD_PARAM_n, ONLY : CSURF -USE MODD_DIM_n, ONLY : NIMAX, NJMAX -USE MODD_CONF_n, ONLY : CSTORAGE_TYPE -use modd_precision, only: LFIINT -! -USE MODE_FINALIZE_MNH, only: FINALIZE_MNH -USE MODE_POS -USE MODE_IO, only: IO_Config_set, IO_Init -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Header_write -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -USE MODE_ll -USE MODE_MSG -USE MODE_MODELN_HANDLER -! -USE MODI_READ_HGRID -USE MODI_WRITE_HGRID -USE MODI_SET_SUBDOMAIN -!JUANZ -USE MODE_SPLITTINGZ_ll -!JUANZ -! -USE MODI_VERSION -USE MODI_READ_ALL_NAMELISTS -USE MODI_ZOOM_PGD_SURF_ATM -USE MODI_WRITE_PGD_SURF_ATM_N -USE MODD_MNH_SURFEX_n -! -USE MODN_CONFIO, ONLY : NAM_CONFIO -USE MODE_INI_CST, ONLY: INI_CST -! -IMPLICIT NONE -! -! -!* 0.2 Declaration of local variables -! ------------------------------ -! -INTEGER :: IRESP ! return code for I/O -INTEGER :: ILUOUT0 -INTEGER :: ILUNAM -INTEGER :: IINFO_ll -CHARACTER(LEN=28) :: CPGDFILE ! name of the PGD file -CHARACTER(LEN=28) :: YZOOMFILE ! name of the output file -CHARACTER(LEN=2) :: YZOOMNBR -CHARACTER(LEN=28) :: YMY_NAME,YDAD_NAME -CHARACTER(LEN=28) :: YPGDFILE -CHARACTER(LEN=2) :: YSTORAGE_TYPE -LOGICAL :: GFOUND -INTEGER :: IXOR_DAD,IYOR_DAD ! compared to Dad file, if any -INTEGER :: IXOR,IYOR ! given or computed -INTEGER :: IDXRATIO,IDYRATIO -TYPE(TFILEDATA),POINTER :: TZNMLFILE => NULL() -TYPE(TFILEDATA),POINTER :: TZPGDFILE => NULL() -TYPE(TFILEDATA),POINTER :: TZZOOMFILE => NULL() -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZZS1,ZZSMT1,ZZS2,ZZSMT2 -! -NAMELIST/NAM_PGDFILE/CPGDFILE,YZOOMFILE,YZOOMNBR -!------------------------------------------------------------------------------ -! -CALL GOTO_MODEL(1) -CALL VERSION -CPROGRAM='ZOOMPG' -CSTORAGE_TYPE = 'PG' -! -CALL INI_CST -! -! -!* 1. Set default names and parallelized I/O -! -------------------------------------- -! -CALL IO_Init() -! -CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING0','OUTPUTLISTING','WRITE') -CALL IO_File_open(TLUOUT0) -TFILE_OUTPUTLISTING => TLUOUT0 -ILUOUT0=TLUOUT0%NLU -! -CALL IO_File_add2list(TZNMLFILE,'PRE_ZOOM1.nam','NML','READ') -CALL IO_File_open(TZNMLFILE) -ILUNAM = TZNMLFILE%NLU -! -CPGDFILE = 'PGDFILE' ! name of the input file -YZOOMFILE = '' -YZOOMNBR = '00' -CALL POSNAM( TZNMLFILE, 'NAM_PGDFILE', GFOUND ) -IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_PGDFILE) -CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND ) -IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFIO) -CALL IO_Config_set() -! -!------------------------------------------------------------------------------ -! -!* 2. ZOOM OF PGD DOMAIN -! ------------------ -! -!* 2.1 Open PGD file -! ------------- -! -CALL IO_File_add2list(TZPGDFILE,TRIM(CPGDFILE),'PGD','READ',KLFINPRAR=INT(1,KIND=LFIINT),KLFITYPE=2,KLFIVERB=5) -CALL IO_File_open(TZPGDFILE) -! -!* 2.2 Reading of initial grid -! ----------------------- -! -CALL READ_HGRID(1,TZPGDFILE,YMY_NAME,YDAD_NAME,YSTORAGE_TYPE) -! -! NIMAX, NJMAX: size of input domain -ALLOCATE(ZZS1 (NIMAX+2*JPHEXT,NJMAX+2*JPHEXT)) -ALLOCATE(ZZSMT1(NIMAX+2*JPHEXT,NJMAX+2*JPHEXT)) -CALL IO_Field_read(TZPGDFILE,'ZS',ZZS1) -CALL IO_Field_read(TZPGDFILE,'ZSMT',ZZSMT1) -! -!* 2.3 Define subdomain -! ---------------- -! -CALL SET_SUBDOMAIN(TZNMLFILE,TZPGDFILE,IXOR_DAD,IYOR_DAD,IXOR,IYOR,IDXRATIO,IDYRATIO) -! -CALL IO_File_close(TZNMLFILE) -! -! NIMAX, NJMAX: size of output domain -! -CALL SET_JP_ll(JPMODELMAX,JPHEXT,JPVEXT,JPHEXT) -CALL SET_DAD0_ll() -CALL SET_DIM_ll(NIMAX, NJMAX, 1) -CALL SET_LBX_ll('OPEN',1) -CALL SET_LBY_ll('OPEN', 1) -CALL SET_XRATIO_ll(1, 1) -CALL SET_YRATIO_ll(1, 1) -CALL SET_XOR_ll(1, 1) -CALL SET_XEND_ll(NIMAX+2*JPHEXT, 1) -CALL SET_YOR_ll(1, 1) -CALL SET_YEND_ll(NJMAX+2*JPHEXT, 1) -CALL SET_DAD_ll(0, 1) -!JUANZ CALL INI_PARA_ll(IINFO_ll) -CALL INI_PARAZ_ll(IINFO_ll) -! -! -!* 2.4 Writing of final grid -! --------------------- -! -IF ( (LEN_TRIM(YZOOMFILE) == 0) .OR. (ADJUSTL(YZOOMFILE) == ADJUSTL(CPGDFILE)) ) THEN - YZOOMFILE=ADJUSTL(ADJUSTR(CPGDFILE)//'.z'//ADJUSTL(YZOOMNBR)) -END IF -! -CALL IO_File_add2list(TZZOOMFILE,TRIM(YZOOMFILE),'PGD','WRITE',KLFINPRAR=INT(1,KIND=LFIINT),KLFITYPE=1,KLFIVERB=5) -! -CALL IO_File_open(TZZOOMFILE) -CALL WRITE_HGRID(1,TZZOOMFILE) -! -!* 2.5 Preparation of surface physiographic fields -! ------------------------------------------- -! -CALL IO_Field_read(TZPGDFILE,'SURF',CSURF) -! -! -IF (CSURF=='EXTE') THEN - CALL SURFEX_ALLOC_LIST(1) - YSURF_CUR => YSURF_LIST(1) - CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.) - YPGDFILE = CPGDFILE - CPGDFILE = YZOOMFILE - TOUTDATAFILE => TZZOOMFILE - CALL GOTO_SURFEX(1) - CALL ZOOM_PGD_SURF_ATM(YSURF_CUR,'MESONH',YPGDFILE,'MESONH',YZOOMFILE,'MESONH') -! -!* 2.6 Writes the physiographic fields -! ------------------------------- -! - CALL WRITE_PGD_SURF_ATM_n(YSURF_CUR,'MESONH') -ELSE - ALLOCATE(ZZS2(NIMAX+2*JPHEXT,NJMAX+2*JPHEXT)) - ZZS2(:,:)=ZZS1(IXOR:IXOR+NIMAX+2*JPHEXT-1,IYOR:IYOR+NJMAX+2*JPHEXT-1) - CALL IO_Field_write(TZZOOMFILE,'ZS',ZZS2) -END IF -! -ALLOCATE(ZZSMT2(NIMAX+2*JPHEXT,NJMAX+2*JPHEXT)) -ZZSMT2(:,:)=ZZSMT1(IXOR:IXOR+NIMAX+2*JPHEXT-1,IYOR:IYOR+NJMAX+2*JPHEXT-1) -CALL IO_Field_write(TZZOOMFILE,'ZSMT',ZZSMT2) -! -!* 2.7 Write configuration variables in the output file -! ------------------------------------------------ -! -CALL IO_Header_write(TZZOOMFILE) -CALL IO_Field_write(TZZOOMFILE,'DXRATIO',IDXRATIO) -CALL IO_Field_write(TZZOOMFILE,'DYRATIO',IDYRATIO) -CALL IO_Field_write(TZZOOMFILE,'XOR', IXOR_DAD) -CALL IO_Field_write(TZZOOMFILE,'YOR', IYOR_DAD) -CALL IO_Field_write(TZZOOMFILE,'L1D', L1D) -CALL IO_Field_write(TZZOOMFILE,'L2D', L2D) -CALL IO_Field_write(TZZOOMFILE,'PACK', LPACK) -CALL IO_Field_write(TZZOOMFILE,'SURF', CSURF) -CALL IO_File_close(TZZOOMFILE) -! -!* 2.8 Shift to new PGD file -! --------------------- -! -CPGDFILE = YZOOMFILE -! -!------------------------------------------------------------------------------ -! -!* 3. CLOSE PARALLELIZED I/O -! ---------------------- -! -CALL IO_File_close(TZPGDFILE) -! -WRITE(ILUOUT0,*) -WRITE(ILUOUT0,*) '***************************' -WRITE(ILUOUT0,*) '* ZOOM_PGD ends correctly *' -WRITE(ILUOUT0,*) '***************************' -! -CALL FINALIZE_MNH() -! -!------------------------------------------------------------------------------- -! -END PROGRAM ZOOM_PGD -- GitLab